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

vptzau2j  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(247)

我正在尝试编写一个android应用程序,它需要将文件读写到“外部”存储中。
虽然我可以浏览和选择外部存储上的文件夹,但每次尝试访问该文件时,都会出现权限被拒绝的i/o异常。
我已在我的应用程序清单中包含以下权限:

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

我还为android中的应用程序启用了存储权限。
我是在chromebook上开发的,所以我没有访问模拟器的权限。所以我在我的手机(像素3)上通过usb-c电缆测试和调试我的应用程序。我也可以生成一个apk并将其加载到chromebook上,但我不能用这种方式进行调试。
下面的代码示例是我从互联网上收集的。

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:权限被拒绝
在这个问题上,我已经头痛两天了,这对我没有任何好处。我希望这里有人能帮忙,因为我的头真的很痛!:-)

mnemlml8

mnemlml81#

显然,android 10是罪魁祸首。
我将目标sdk降低到28(Android9),代码正常。
如果我想让它在android10上运行,我就必须使用mediastoreforsdk29+。

n3h0vuf2

n3h0vuf22#

您必须先检查运行时权限 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;
}

相关问题