Исключение «Не удалось открыть: EACCES (В доступе отказано)» на Android - PullRequest
230 голосов
/ 13 января 2012

Я получаю

Ошибка открытия: EACCES (Permission denied)

на линии OutputStream myOutput = new FileOutputStream(outFileName);

Я проверил рут и попробовал android.permission.WRITE_EXTERNAL_STORAGE.

Как я могу исправить эту проблему?

try {
    InputStream myInput;

    myInput = getAssets().open("XXX.db");

    // Path to the just created empty db
    String outFileName = "/data/data/XX/databases/"
            + "XXX.db";

    // Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);

    // Transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer)) > 0) {
        myOutput.write(buffer, 0, length);
    }

    // Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();
    buffer = null;
    outFileName = null;
}
catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

Ответы [ 26 ]

1 голос
/ 02 марта 2018

после добавления разрешения решил мою проблему

<uses-permission android:name="android.permission.INTERNET"/>
1 голос
/ 21 октября 2016

Добавить разрешение в манифест.

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
0 голосов
/ 07 апреля 2019

В моем случае ошибка появлялась на линии

      target.createNewFile();

, поскольку я не мог создать новый файл на SD-карте, поэтому мне пришлось использовать подход DocumentFile.

      documentFile.createFile(mime, target.getName());

Для вышеуказанного вопроса проблема может быть решена с помощью этого подхода,

    fos=context.getContentResolver().openOutputStream(documentFile.getUri());

Смотрите и эту тему, Как использовать новый API доступа к SD-карте, представленный для Android 5.0 (Lollipop)?

0 голосов
/ 11 апреля 2018

Опираясь на ответ пользователя 462990

Чтобы получать уведомления, когда пользователь отвечает на диалог запроса разрешения, используйте это: (код в kotlin)

override fun onRequestPermissionsResult(requestCode: Int,
                           permissions: Array<String>, grantResults: IntArray) {
when (requestCode) {
    MY_PERMISSIONS_REQUEST_READ_CONTACTS -> {
        // If request is cancelled, the result arrays are empty.
        if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {

            // permission was granted, yay! Do the
            // contacts-related task you need to do.

        } else {

            // permission denied, boo! Disable the
            // functionality that depends on this permission.

        }
        return
    }

    // Add other 'when' lines to check for other
    // permissions this app might request.

    else -> {
        // Ignore all other requests.
    }
}

}

0 голосов
/ 08 апреля 2018

Добавить зависимости gradle

implementation 'com.karumi:dexter:4.2.0'

Добавьте ниже код в вашей основной деятельности.

import com.karumi.dexter.Dexter;
import com.karumi.dexter.MultiplePermissionsReport;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.multi.MultiplePermissionsListener;
    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);

    new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {


                checkMermission();
            }
        }, 4000);
    }

    private void checkMermission(){
        Dexter.withActivity(this)
                .withPermissions(
                        android.Manifest.permission.READ_EXTERNAL_STORAGE,
                        android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
                        android.Manifest.permission.ACCESS_NETWORK_STATE,
                        Manifest.permission.INTERNET
                ).withListener(new MultiplePermissionsListener() {
            @Override
            public void onPermissionsChecked(MultiplePermissionsReport report) {
                if (report.isAnyPermissionPermanentlyDenied()){
                    checkMermission();
                } else if (report.areAllPermissionsGranted()){
                    // copy some things
                } else {
                    checkMermission();
                }

            }
            @Override
            public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
                token.continuePermissionRequest();
            }
        }).check();
    }
0 голосов
/ 09 мая 2017

У меня была такая же проблема (API> = 23).

Решение https://stackoverflow.com/a/13569364/1729501 сработало у меня, но отключить приложение для отладки было непрактично.

Мое решение состояло в том, чтобы установить подходящий драйвер устройства adb в Windows. Драйвер USB Google не работает для моего устройства.

ШАГ 1: Загрузите драйверы adb для вашего устройства.

ШАГ 2: Зайдите в диспетчер устройств -> другие устройства -> найдите записи со словом «adb» -> выберите «Обновить драйвер» -> укажите местоположение на шаге 1

...