Как читать и писать на SD-карту? - PullRequest
0 голосов
/ 10 июня 2019

У меня есть приложение, которое может открывать и редактировать двоичный файл с внешней 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" />.Мне также пришлось запустить это приложение на реальном устройстве, потому что, когда я запускаю его на эмуляторе, возникает ошибка, что он не может найти файл, который я выбрал.Я мог бы действительно использовать некоторую помощь в этом.Спасибо.

1 Ответ

0 голосов
/ 11 июня 2019

На основании комментария @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());

А теперь работает нормально.

...