欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java.lang.AssertionError: Cannot create parent directories for requested File location(最终版)

程序员文章站 2022-03-27 21:53:33
下面是我Locat日志java.lang.AssertionError: Cannot create parent directories for requested File location at com.loopj.android.http.Utils.asserts(Utils.java:39) at com.loopj.android.http.FileAsyncHttpResponseHandler.(FileAsyncHttpRe......

1.参考

Android Environment.getExternalStorageDirectory() 获取的是内部存储还是外部存储?_小鹰信息技术服务部-CSDN博客

做文件管理器时isDirectory()判断错误原因及解决办法_pulap的博客-CSDN博客

(2条消息) /storage/emulated/0 (Permission denied) 权限已开,写入sd卡仍报错的解决办法_nathan柠檬的博客-CSDN博客

Android 6.0 运行时权限处理 - 简书 (jianshu.com)

Android 外部存储程序报错(Permission denied)解决方法_BEAR__W的博客-CSDN博客

下面是我Logcat日志 

java.lang.AssertionError: Cannot create parent directories for requested File location
        at com.loopj.android.http.Utils.asserts(Utils.java:39)
        at com.loopj.android.http.FileAsyncHttpResponseHandler.<init>(FileAsyncHttpResponseHandler.java:82)
        at com.loopj.android.http.FileAsyncHttpResponseHandler.<init>(FileAsyncHttpResponseHandler.java:66)
        at com.loopj.android.http.FileAsyncHttpResponseHandler.<init>(FileAsyncHttpResponseHandler.java:55)
        at com.loopj.android.http.FileAsyncHttpResponseHandler.<init>(FileAsyncHttpResponseHandler.java:45)
        at com.imooc.book.BookListActivity$BookListAdapter$1$1.<init>(BookListActivity.java:168)
        at com.imooc.book.BookListActivity$BookListAdapter$1.onClick(BookListActivity.java:168)
        at android.view.View.performClick(View.java:7438)
        at android.view.View.performClickInternal(View.java:7415)
        at android.view.View.access$3600(View.java:810)
        at android.view.View$PerformClick.run(View.java:28286)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7523)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941)

最初我是通过改变Header的包成功的(成功概率隔几天开机之后一次,然后就不行了,原因未知)

//为了找到真正的原因以及解决方案,先看logcat中的错误提示

(1)根据

  at com.loopj.android.http.FileAsyncHttpResponseHandler.<init>(FileAsyncHttpResponseHandler.java:82)
        at com.loopj.android.http.FileAsyncHttpResponseHandler.<init>(FileAsyncHttpResponseHandler.java:66)
        at com.loopj.android.http.FileAsyncHttpResponseHandler.<init>(FileAsyncHttpResponseHandler.java:55)
        at com.loopj.android.http.FileAsyncHttpResponseHandler.<init>(FileAsyncHttpResponseHandler.java:45)

进入到FileAsyncHttpResponseHandler类中构造方法

public FileAsyncHttpResponseHandler(File file, boolean append, boolean renameTargetFileIfExists,boolean usePoolThread) {
        super(usePoolThread);
        Utils.asserts(file != null, "File passed into FileAsyncHttpResponseHandler constructor must not be null");
        if (!file.isDirectory() && !file.getParentFile().isDirectory()) {
            Utils.asserts(file.getParentFile().mkdirs(), "Cannot create parent directories for requested File location");
        }
        if (file.isDirectory()) {
            if (!file.mkdirs()) {
                AsyncHttpClient.log.d(LOG_TAG, "Cannot create directories for requested Directory location, might not be a problem");
            }
        }
        this.file = file;
        this.append = append;
        this.renameIfExists = renameTargetFileIfExists;
    }

由上可知错误原因在下面的if语句中

if (!file.isDirectory() && !file.getParentFile().isDirectory()) {
            Utils.asserts(file.getParentFile().mkdirs(), "Cannot create parent directories for requested File location");
        }

(2)测试

简洁与好吧,我先测试左边的file.isDirectory()=false的原因(非非为正)

在我的BaseAdapter(适配器)的getview方法中有如下语句
final String path = Environment.getExternalStorageDirectory() + "/imooc/" + book.getMBookname() + ".txt";
final File file = new File(path);

我在上面语句的后面添加了loge语句

 Log.e(TAG, "file是空不 "+file.isDirectory );

然后在Logcat 中他就返回为false  

2020-12-29 16:21:17.284 16705-16705/com.example.bookapplicationtest E/BookListActivity: file的Directoryfalse

此时我就瞬间蒙了。这应该是true吧(由于我对file的各种方法,掌握不熟,bing走起)

在这之前我先看了下,我写的权限是否少了,此时我的权限如下

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>

此时我感觉应该不差啥权限,接着bing

翻了大堆,估计由于问题没有精确好,导致我完全找不到啊。想了想是不是path创建时的问题然后看了如下文章

Android Environment.getExternalStorageDirectory() 获取的是内部存储还是外部存储?

Android Environment.getExternalStorageDirectory() 获取的是内部存储还是外部存储?_小鹰信息技术服务部-CSDN博客

好吧,这人提出了问题,他算是解答完自己提出的问题吧,换,我在想其他可能。

我此时有了一种猜想,会不会有人光拿钱不办事呢,例如给了权限,他确每把权限使用出来,然后我就看看具体的文件目录呗

AndroidStudio打开view->tools windows->device-file-deployer找到文件目录

java.lang.AssertionError: Cannot create parent directories for requested File location(最终版)

额,权限跑哪去了,三个啊,额存储的好像就俩权限,好吧接着bing看我的权限跑哪去了

看到网上有这样的解决方法

在运行虚拟机时,或者使用高版本的安卓手机时,即使是在清单文件中加了权限,向sd卡写入数据时还是会报错:

 

其实这个问题是由于Android6.0更新了权限机制,在6.0之前,写入sd卡权限只需在清单文件中添加 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>即可,而在6.0中,则需要在activity中用代码来请求一些敏感的权限,其中就包括对sd卡的操作权限。对这个问题有以下几种解决办法:

  1. 打开虚拟机的Setting–>Apps–>找到你的应用–>点击Permissions–>将需要的权限手动打开
  2. 将targetSdkVersion设置为小于23,然后重新编译
  3. 手动在activity添加请求权限的代码,具体代码可参考如下链接: 
    Android 6.0 运行时权限处理 http://www.jianshu.com/p/b4a8b3d4f587

我试了前两个,好吧都没用,接着bing.

最终我发现只要在Manifest文件application中添加

android:requestLegacyExternalStorage="true"(application)

此时就可以了。哈哈哈(此时“打开虚拟机的Setting–>Apps–>找到你的应用–>点击Permissions–>将需要的权限手动打开”这个权限我也给了)

 

 

本文地址:https://blog.csdn.net/qq_40307919/article/details/111885720