为什么我不能写Android外部存储?

时间:2020-01-24 20:17:00

标签: java android

我正在尝试编写一个Android应用程序,该应用程序除其他外需要读取文件并将其写入“外部”存储。

虽然我能够浏览并选择外部存储上的文件夹,但是每次尝试访问该文件时,都会出现“权限被拒绝的I / O”异常。

我已在我的应用清单中包含以下权限:

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

我还为Android中的应用启用了STORAGE权限。

我正在使用Chromebook进行开发,因此无法访问模拟器。因此,我通过USB-C电缆在手机(Pixel 3)上测试和调试了我的应用。我还可以生成一个APK并将其侧面加载到我的Chromebook上,但是我无法通过这种方式进行调试。

以下代码示例是我从Internet上收集的。

 public void writeFileExternalStorage(View view) {
        String cashback = "Get 2% cashback on all purchases from xyz \n Get 10% cashback on travel from dhhs shop";
        String state = Environment.getExternalStorageState();
        //external storage availability check
        if (!Environment.MEDIA_MOUNTED.equals(state)) {
            return;
        }
        File file = new File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_DOCUMENTS), filenameExternal);


        FileOutputStream outputStream = null;
        try {
            file.createNewFile();
            //second argument of FileOutputStream constructor indicates whether to append or create new file if one exists
            outputStream = new FileOutputStream(file, true);

            outputStream.write(cashback.getBytes());
            outputStream.flush();
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

当执行file.createNewFile()时,将引发以下异常:java.io.IOException:权限被拒绝

在这个问题上,我已经将头撞墙了两天了,这没有任何好处。我希望这里有人可以帮忙,因为我的头真的很痛! :-)

2 个答案:

答案 0 :(得分:2)

显然,应该归咎于Android 10。

我将Target SDK降低到28(Android 9),并且代码可以正常工作。

如果我想让它在Android 10上正常运行,则必须使用MediaStore for SDK 29 +。

答案 1 :(得分:0)

您必须在writeFileExternalStorage函数之前检查运行时权限:

private static final int WRITE_EXTERNAL_STORAGE = 0; private static final int REQUEST_PERMISSION = 0;

int permissionCheckStorage = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    if (permissionCheckStorage != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions( MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, WRITE_EXTERNAL_STORAGE);
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
            && ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                REQUEST_PERMISSION);

        return;
    }