Android 10上的createTempFile()权限被拒绝

时间:2020-02-22 20:01:56

标签: java android android-studio

尝试在Android 10上创建临时文件时,出现权限被拒绝错误。有人可以写一篇关于如何在外部存储中创建一个教程吗?大多数已过时,不适用于当前版本的Android

这是logcat

 2020-02-22 13:46:43.766 9544-9544/com.myapp.test E/MainActivity: Image file creation failed
java.io.IOException: Permission denied
    at java.io.UnixFileSystem.createFileExclusively0(Native Method)
    at java.io.UnixFileSystem.createFileExclusively(UnixFileSystem.java:317)
    at java.io.File.createTempFile(File.java:2018)
    at com.myapp.test.MainActivity.create_image(MainActivity.java:915)
    at com.myapp.test.MainActivity.access$200(MainActivity.java:85)
    at com.myapp.test.MainActivity$6.onShowFileChooser(MainActivity.java:513)
    at vo.runFileChooser(PG:10)
    at android.os.MessageQueue.nativePollOnce(Native Method)
    at android.os.MessageQueue.next(MessageQueue.java:336)
    at android.os.Looper.loop(Looper.java:197)
    at android.app.ActivityThread.main(ActivityThread.java:7762)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1047)

我的AndroidManifest.xml

    <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    tools:remove="android:maxSdkVersion" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.VIBRATE" />

然后在MainActivity.Java中编写代码

private File create_image() throws IOException {
    @SuppressLint("SimpleDateFormat")
    String file_name    = new SimpleDateFormat("yyyy_mm_ss").format(new Date());
    String new_name     = "file_"+file_name+"_";
    File sd_directory   = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
    return File.createTempFile(new_name, ".jpg", sd_directory); // fails due to permission denied
}

5 个答案:

答案 0 :(得分:5)

我正在使用官方文档来实现从相机拍摄照片:

https://developer.android.com/training/camera/photobasics

但是它不起作用,并在createTempFile方法上引发异常。奇怪的是,Google尚未更新代码。

这是我找到的解决方案:

添加:

android:requestLegacyExternalStorage="true"

到AndroidManifest.xml。无需更改任何代码。目前有效,但可能不适用于即将发布的Android版本。

答案 1 :(得分:1)

答案 2 :(得分:0)

你需要改变

File sd_directory   = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);

File sd_directory   =  getExternalFilesDir(Environment.DIRECTORY_PICTURES);

答案 3 :(得分:0)

在 android 10 中不直接接受权限。因此,您要求用户接受许可。有一个图书馆,您可以使用它来征求许可。让我补充一下link

它被称为德克斯特图书馆

您必须在 gradle.build 中添加一行

implementation 'com.karumi:dexter:6.2.2'

以下源代码一次用于单个权限。

Dexter.withContext(this)
.withPermission(Manifest.permission.CAMERA)
.withListener(new PermissionListener() {
    @Override public void onPermissionGranted(PermissionGrantedResponse response) {/* ... */}
    @Override public void onPermissionDenied(PermissionDeniedResponse response) {/* ... */}
    @Override public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {/* ... */}
}).check();

可以在 Dexter 库中请求多个权限。你可以在link

答案 4 :(得分:0)

由于您使用的是 getExternalStoragePublicDirectory 在 android 10+ 中,您不能直接在公共文件夹上写入。一种方法是使用 getExternalFilesDir 捕获图像,然后使用 MediaStore API 将文件复制到公共目录中。