繁体   English   中英

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

[英]Why can't I write to Android External Storage?

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

虽然我能够浏览和选择外部存储上的文件夹,但每次尝试访问该文件时,我都会收到 Permission denied 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: Permission denied

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

显然,Android 10 是罪魁祸首。

我将目标 SDK 降低到 28(Android 9)并且代码有效。

看起来如果我希望它适用于 Android 10,我将不得不将 MediaStore 用于 SDK 29+。

您必须在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;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM