我需要在Android上保存相机中的图像。 我在清单中使用了写入外部存储权限,我正在使用此代码
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()相同的结果。
知道代码中出了什么问题?
感谢
答案 0 :(得分:38)
对于那些不像我这样经验丰富的人。我打了这个问题,失去了一段时间的头发。我的目标是api 21(兼容性)并且它适用于棒棒糖,但是在marshmallow上它不会创建目录。我确实在清单中有“使用”权限,但它仍然无效。显然在Marshmallow中,当你安装Android工作室时,它永远不会问你是否应该给它许可它只是悄然失败,就像你拒绝它一样。您必须进入设置,应用程序,选择您的应用程序并打开权限开关。
答案 1 :(得分:20)
像我这样的人正在Android10中进行尝试。请在清单中使用以下API:
<application android:requestLegacyExternalStorage="true" ... >
...
</application>
来自Google的最新更新: 将应用更新为Android 11之后,系统将忽略requestLegacyExternalStorage标志。
答案 2 :(得分:3)
IDIOT ME!我已经使用了Manifest权限,但是当我在手机上安装应用程序时,我没有授予存储权限!...我理解这个问题的否定...但我希望如果其他人面对同样的行为......检查你的手机许可。对不起给您带来不便。
答案 3 :(得分:2)
如果你在Android M上测试,你应该检查设置&gt;应用&gt;查看是否授予访问存储权限的权限。这救了我。
答案 4 :(得分:2)
你放了
R> library(RQuantLib)
R> setEvaluationDate(Sys.Date())
[1] TRUE
R>
你的AndroidManifest中的?如果您使用的是Android M,则必须请求用户在sd上写入权限,在此处查看example
答案 5 :(得分:0)
您已创建目录,而不是文件。使用以下代码创建新文件
File file = new File(dir.getAbsolutePath() + "/Pic.jpg");
file.createNewFile()
答案 6 :(得分:0)
试试这个。为marshmallow提供运行时权限,它完全适用于我的应用程序代码:
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()))
答案 7 :(得分:0)
如果您已经允许了R / W权限(也具有Runtime Permission),但仍然不起作用,请在AndroidManifest.xml中添加下面提到的这一行
<应用程序 ........ ........ android:requestLegacyExternalStorage =“ true”> 注意:如果您要定位Android 10以上版本,则必须这么做
答案 8 :(得分:0)
从 API 30
开始,您只能在 app-specific files
中写入
File dir = new File(context.getFilesDir(), "YOUR_DIR");
dir.mkdirs();
或在您的应用Android/data
File dir = new File(myContext.getExternalFilesDir("FolderName"),"YOUR_DIR");
更新
这个答案提供了另一种解决方案https://stackoverflow.com/a/65744517/8195076
更新
另一种方法是在 manifest
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
答案 9 :(得分:0)
outputFile = new File(apkStorage + "/" + downloadFileName); //在主文件中创建输出文件
int
我编写了此代码来创建文件,但它在 android 11 中不起作用