Android studio 出现错误 IOException: 创建文件时不允许操作

mah*_*sif 9 permissions android android-studio

我正在尝试创建一个文件。(testipfs文件夹已存在)

File imagesFolder = new File(Environment.getExternalStorageDirectory(), "testipfs");
File photo= new File(imagesFolder, "desktopWallpaper.jpg");
System.out.println("Saving file in "+photo.getAbsolutePath());
if (!photo.exists()) {
   try {
      photo.createNewFile();
   } catch (IOException e) {
      System.out.println("Failed to create photo");
      e.printStackTrace();
   }
}
Run Code Online (Sandbox Code Playgroud)

但出现错误操作不允许。

I/System.out: Saving file in /storage/emulated/0/testipfs/desktopWallpaper.jpg
I/System.out: Failed to create photo
W/System.err: java.io.IOException: Operation not permitted
W/System.err:     at java.io.UnixFileSystem.createFileExclusively0(Native Method)
        at java.io.UnixFileSystem.createFileExclusively(UnixFileSystem.java:317)
        at java.io.File.createNewFile(File.java:1008)
        at com.example.ipfs.MainActivity.SavePhotoTask(MainActivity.java:49)
        at com.example.ipfs.MainActivity.onCreate(MainActivity.java:112)
Run Code Online (Sandbox Code Playgroud)

我在清单文件中添加了权限,如下所示

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

小智 11

我期待您在 Android 11 中测试您的应用程序,在 Android 11 中事情发生了变化......您必须请求此许可

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
Run Code Online (Sandbox Code Playgroud)

在你的 MainActivity 中

if (Build.VERSION.SDK_INT >= 30){
        if (!Environment.isExternalStorageManager()){
            Intent getpermission = new Intent();
            getpermission.setAction(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
            startActivity(getpermission);
        }
    }
Run Code Online (Sandbox Code Playgroud)

基本上,这只是一个意图,它将要求用户进行设置以授予我们权限,这在 android 11 中是必要的,如果您只是请求读取和写入权限,那么您的应用程序仅对设备中的文件具有只读访问权限

  • 谷歌对此有限制,您的应用程序应该符合允许的用例,https://developer.android.com/training/data-storage/manage-all-files#all-files-access-google-play (2认同)

Cod*_*ker 6

requestLegacyExternalStorage如果您使用的是 Android 10 或更高版本,请尝试在 Manifest.xml 文件中添加。

<application
    ...
    android:requestLegacyExternalStorage="true">
Run Code Online (Sandbox Code Playgroud)