【问题标题】:How to read and write to SD card?如何读写SD卡?
【发布时间】:2019-06-10 14:07:19
【问题描述】:

我有一个可以从外部 SD 卡打开和编辑二进制文件的应用程序。我希望有可能将此文件从打开的位置保存回来。

我在清单文件中添加了权限,并且我还请求用户许可。 由于这些权限,我可以打开文件并获取数据,但是当我想将文件保存到外部 SD 卡时出现错误:java.io.FileNotFoundException: /storage/3834-3433/file.bin: open failed: EACCES (Permission denied)

这是授予权限的代码:

public boolean isStoragePermissionGranted() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    == PackageManager.PERMISSION_GRANTED) {
                return true;
            } else {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                return false;
            }
        }
        else {
            return true;
        }
    }

这里是选择和获取文件路径的代码:

button.setOnClickListener(v -> {
            intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.setType("*/*");
            startActivityForResult(intent, 200);
        });

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        switch (requestCode) {
            case 200:
                if (resultCode == RESULT_OK) {
                    String filePath = Objects.requireNonNull(data.getData()).getPath();
                    filePathMain = filePath;
                }
                break;
        }
    }

这是保存文件的代码部分:

void byteArrayToFile() {
        try (OutputStream out = new FileOutputStream(filePathMain)) {
            out.write(outBytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

我不知道为什么当我有<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 时它允许我打开文件但不能写入。 我还必须在真实设备上运行这个应用程序,因为当我在模拟器上运行它时会出现一个错误,它找不到我选择的文件。 我真的可以在这方面使用一些帮助。谢谢。

【问题讨论】:

  • “出现错误,找不到我选择的文件”——您的代码在大多数 Android 设备上无法运行,因为 ACTION_GET_CONTENT 不会返回 file @ 987654331@。它将返回一个contentUri。请参阅stackoverflow.com/questions/49221312/…stackoverflow.com/questions/48510584/…stackoverflow.com/questions/35870825/…
  • 除此之外,您对 Android 4.4+ 上的可移动存储没有任意读/写访问权限。我建议您在 Android 4.4+ 上切换到ACTION_OPEN_DOCUMENT,并使用ContentResolveropenInputStream()openOutputStream()Uri 一起使用。
  • 也添加读取权限

标签: java android file android-permissions android-sdcard


【解决方案1】:

基于@CommonsWare 评论,我从ACTION_GET_CONTENT 更改为ACTION_OPEN_DOCUMENT 以获得file Uri。 还用ContentResolver阅读:

InputStream inputStream = getContentResolver().openInputStream(uri);

并写入文件:

ParcelFileDescriptor pfd = getContentResolver().openFileDescriptor(uri, "w");
FileOutputStream fileOutputStream = new FileOutputStream(pfd.getFileDescriptor());

现在它可以正常工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多