java.lang.AssertionError: Cannot create parent directories for requested File location(最终版)
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找到文件目录
额,权限跑哪去了,三个啊,额存储的好像就俩权限,好吧接着bing看我的权限跑哪去了
看到网上有这样的解决方法
在运行虚拟机时,或者使用高版本的安卓手机时,即使是在清单文件中加了权限,向sd卡写入数据时还是会报错:
其实这个问题是由于Android6.0更新了权限机制,在6.0之前,写入sd卡权限只需在清单文件中添加
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
即可,而在6.0中,则需要在activity中用代码来请求一些敏感的权限,其中就包括对sd卡的操作权限。对这个问题有以下几种解决办法:
- 打开虚拟机的Setting–>Apps–>找到你的应用–>点击Permissions–>将需要的权限手动打开
- 将targetSdkVersion设置为小于23,然后重新编译
- 手动在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