java.io.FileNotFoundException: (Отказано в доступе) в Android-Android - PullRequest
0 голосов
/ 31 октября 2018

Следующий код предназначен для записи контактных данных в файл, созданный в SDCard (внешнее хранилище):

try {
                while (phones.isAfterLast() == false) {

                    String lookupKey = phones.getString(phones
                            .getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
                    Uri uri = Uri.withAppendedPath(
                            ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);

                    AssetFileDescriptor fd;


                    fd = mContext.getContentResolver().openAssetFileDescriptor(uri, "r");
                    FileInputStream fis = fd.createInputStream();
                    byte[] buf = readBytes(fis);
                    fis.read(buf);
                    String VCard = new String(buf);
                    FileOutputStream mFileOutputStream = new FileOutputStream(
                            cpath, true);
                    mFileOutputStream.write(VCard.getBytes());
                    phones.moveToNext();
                }
            } catch (Exception e1) {
                Applog.e(TAG, e1);
                isOk = false;
            }

Где, cpath - это путь к моему файлу в SD-карте.

Здесь я получаю сообщение об ошибке:

FileOutputStream mFileOutputStream = new FileOutputStream(
                            cpath, true);

Я получаю ниже журнала: -

java.io.FileNotFoundException: /storage/9016-4EF8/AllBackupDemo/cont20181031050512.vcf (Permission denied)
        at java.io.FileOutputStream.open0(Native Method)
        at java.io.FileOutputStream.open(FileOutputStream.java:287)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:223)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:142)

Код выбора дерева документов:

private void triggerStorageAccessFramework() {
        startActivityForResult(new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE), REQUEST_SAF_PERMISSION);
    }

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
//        Log.e(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data + ")");
        if (resultCode == RESULT_CANCELED) return;

        switch (requestCode) {
            case REQUEST_SAF_PERMISSION:{
                Uri treeUri = data.getData();
                if(treeUri != null){
                    session.setPrefURI(treeUri.toString());
                }
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                    getContentResolver().takePersistableUriPermission(treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION
                            | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                }
                toast(getString(R.string.permission_granted_saf));
                break;
            }
        }
    }

Примечание:

  1. Я получаю эту ошибку только в версии для Android. в нуге работает нормально.
  2. Я уже дал разрешение на выполнение и также упоминается в файле манифеста.
  3. Я уже внедрил SAF для разрешения файла документа.

1 Ответ

0 голосов
/ 31 октября 2018

Решение:

Я проанализировал и сравнил свой код с вашим и обнаружил, что весь код, который вы использовали, одинаков.

Строка, в которой вы получаете сообщение об ошибке, должна быть изменена. Эта ошибка вызвана использованием FileOutputStream, которое указывает, что вы обращаетесь к файловой системе, а не из DocumentTree.

Следовательно, вместо:

FileOutputStream mFileOutputStream = new FileOutputStream(
                        cpath, true);

Попробуйте что-то вроде этого:

try {
    OutputStream out = getContentResolver().openOutputStream(cpath.getUri());
    try {

        // Do whatever you wish to do.

    } finally {
        out.close();
    }

} catch (IOException e) {
    throw new RuntimeException("Something went wrong : " + e.getMessage(), e);
}

Я не уверен в фактическом ходе вашей программы, вы можете захотеть пройти через себя. но это определенно даст вам идею идти вперед.

Надеюсь, это поможет.

...