Android Studio获取错误IOException:创建文件时不允许操作

soat7uwm  于 2023-01-31  发布在  Android
关注(0)|答案(5)|浏览(301)

我正在尝试创建文件。(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();
   }
}

但得到错误操作不允许。

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)

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

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

我该如何解决这个问题?

3phpmpom

3phpmpom1#

我希望你在Android 11中测试你的应用程序,在Android 11中的事情发生了变化...你必须请求此权限

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>

在您的主活动中

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

基本上,这只是一个意图,将用户设置给予我们的权限,这是必要的Android 11,如果你只是要求读写权限,那么你的应用程序只是一个只读访问设备中的文件

jecbmhm3

jecbmhm32#

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

<application
    ...
    android:requestLegacyExternalStorage="true">
xa9qqrwz

xa9qqrwz3#

用这个

File imagesFolder = new File(Environment.getExternalStoragePublicDirectory(
     Environment.DIRECTORY_DOWNLOADS), "testipfs");

File photo = new File(imagesFolder, "desktopWallpaper.jpg");
ncgqoxb0

ncgqoxb04#

如果您使用的是Android Marshmallow及更高版本,在Manifest文件中声明权限是不够的,在写入或读取任何外部文件之前,您需要显式请求适当的权限。
storage-permission-error-in-marshmallow
Documentation

  • 如果这不起作用,尝试将targetSdkVersion设置为28或更小。
vptzau2j

vptzau2j5#

我的目录名中有特殊字符(特别是“:“)。删除此字符允许我保存文件

相关问题