android mkdirs not working
我需要从Android上的相机保存图像。
我在清单中使用了写入外部存储权限,并且正在使用此代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | File dir = new File(Environment.getExternalStorageDirectory(),"Test"); if (!dir.exists() || !dir.isDirectory()) dir.mkdirs(); String path = dir.getAbsolutePath(); Log.d(TAG, path); //log show the path File file = new File(dir.getAbsolutePath() +"/Pic.jpg"); Log.d(TAG, file.getAbsolutePath()); //again path is shown here outStream = new FileOutputStream(file); outStream.write(bytes); outStream.close(); Log.d(TAG,"onPictureTaken - wrote bytes:" + bytes.length); //fail here } catch (FileNotFoundException e) { Log.d(TAG,"not done"); //error is here (this exception is thrown) } catch (IOException e) { Log.d(TAG,"not"); } finally { } |
我也尝试了mkdir()而不是mkdirs()相同的结果。
知道代码中出了什么问题吗?
谢谢
对于那些没有像我这样经验丰富的人。我打了这个问题,掉了头发一段时间。我的目标是api 21(出于兼容性考虑),它可以在棒棒糖上工作,但在棉花糖上却无法创建目录。我确实在清单中具有"使用"权限,但仍然无法使用。显然,在棉花糖中安装Android Studio时,它从不询问您是否应该授予它许可,而它只是悄悄地失败了,就像您拒绝了它一样。您必须进入"设置","应用",选择您的应用,然后打开权限开关。
像我这样的人正在Android10中进行尝试。请在清单中使用以下API:
1 2 | ... </application> |
来自Google的最新更新:
在将应用更新为目标Android 11之后,系统将忽略requestLegacyExternalStorage标志。
您放了
1 | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> |
在您的AndroidManifest中?如果您使用的是android M,则必须请求用户权限才能在sd上进行写操作,请在此处查看示例
白痴我!我已经使用了清单权限,但是在手机上安装该应用程序时,我没有授予存储权限!...我对这个问题持否定态度...但是我希望其他人也面临同样的问题..检查您的手机权限。不便之处,敬请原谅。
如果您正在android M上进行测试,则可能应该检查"设置">"应用">"权限",以查看是否授予了访问存储的权限。这救了我。
您已创建目录,而不是文件。使用以下代码创建新文件
1 2 | File file = new File(dir.getAbsolutePath() +"/Pic.jpg"); file.createNewFile() |
如果您已经允许了R / W权限(也具有运行时权限),但仍然无法正常工作,请在AndroidManifest.xml
中添加下面提到的这一行
<应用
........
........
android:requestLegacyExternalStorage =" true">
注意:如果您要定位Android 10
,则必须这样做
尝试一下。为棉花糖提供运行时权限,这在我的应用程序代码中非常有用:
1 2 3 4 5 6 7 8 9 10 | private String getFilename(String strFileName) { String filepath = Environment.getExternalStorageDirectory().getPath(); File fileBase = new File(filepath,"Test"); if (!fileBase.exists()) { fileBase.mkdirs(); } return (file.getAbsolutePath() +"/" + strFileName + file_exts[currentFormat]); } new File(getFilename(edt.getText().toString().trim())) |