421 Stimmen

Exception 'open failed: EACCES (Berechtigung verweigert)' auf Android

Ich bekomme

öffnen fehlgeschlagen: EACCES (Permission denied)

auf der Linie OutputStream myOutput = new FileOutputStream(outFileName);

Ich habe die Wurzel überprüft und versucht android.permission.WRITE_EXTERNAL_STORAGE .

Wie kann ich dieses Problem beheben?

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();
}

2voto

lane Punkte 593

Ich erstelle einen Ordner unter /data/ in meiner init.rc (Herumspielen mit dem aosp auf Nexus 7) und hatte genau dieses Problem.

Es stellte sich heraus, dass es nicht ausreichte, dem Ordner die Berechtigung rw (666) zu geben. Es musste rwx (777) sein, dann funktionierte alles!

2voto

Yasin Ege Punkte 443

Ich hatte den gleichen Fehler auf Xiaomi-Geräten (Android 10). Der folgende Code hat mein Problem behoben. Bibliotheken: Dexter( https://github.com/Karumi/Dexter ) und Image picker( https://github.com/Dhaval2404/ImagePicker )

Manifest hinzufügen ( Android:requestLegacyExternalStorage="true")

    public void showPickImageSheet(AddImageModel model) {
    BottomSheetHelper.showPickImageSheet(this, new BottomSheetHelper.PickImageDialogListener() {
        @Override
        public void onChooseFromGalleryClicked(Dialog dialog) {
            selectedImagePickerPosition = model.getPosition();
            Dexter.withContext(OrderReviewActivity.this)                   .withPermissions(Manifest.permission.READ_EXTERNAL_STORAGE)
                    .withListener(new MultiplePermissionsListener() {
                        @Override
                        public void onPermissionsChecked(MultiplePermissionsReport report) {
                            if (report.areAllPermissionsGranted()) {
                                ImagePicker.with(OrderReviewActivity.this)
                                        .galleryOnly()
                                        .compress(512)
                                        .maxResultSize(852,480)
                               .start();
                            }
                        }

                        @Override
                        public void onPermissionRationaleShouldBeShown(List<PermissionRequest> list, PermissionToken permissionToken) {
                            permissionToken.continuePermissionRequest();
                        }

                    }).check();

            dialog.dismiss();
        }

        @Override
        public void onTakePhotoClicked(Dialog dialog) {
            selectedImagePickerPosition = model.getPosition();
            ImagePicker.with(OrderReviewActivity.this)
                    .cameraOnly()
                    .compress(512)
                    .maxResultSize(852,480)
                    .start();

            dialog.dismiss();
        }

        @Override
        public void onCancelButtonClicked(Dialog dialog) {
            dialog.dismiss();
        }
    });
}

1voto

Tarasantan Punkte 885

In meinem Fall trat der Fehler in der folgenden Zeile auf

      target.createNewFile();

da ich keine neue Datei auf der SD-Karte erstellen konnte, musste ich den DocumentFile-Ansatz verwenden.

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

Für die obige Frage kann das Problem mit diesem Ansatz gelöst werden,

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

Siehe auch diesen Thread, Wie verwendet man die neue API für den SD-Kartenzugriff, die für Android 5.0 (Lollipop) vorgestellt wurde?

1voto

Arpan24x7 Punkte 648

Ich verwende den folgenden Prozess, um den Fall mit Android 11 und targetapi30 zu behandeln

  1. Als vorgefertigtes Dateiverzeichnis, das in meinem Fall im Stammverzeichnis files//<Image/Video... je nach Anforderung>

  2. Kopieren der gepickten Datei und Kopieren der Datei in das Cache-Verzeichnis zum Zeitpunkt des Pickens von meinem externen Speicher

  3. Dann zu einer Zeit, um hochzuladen (auf meine Senden/Upload-Taste klicken) kopieren Sie die Datei aus dem Cache-Verzeichnis zu meinem scoped Storage-Verzeichnis und dann tun meine Upload-Prozess

Verwenden Sie diese Lösung, da beim Hochladen der App in den Play Store eine Warnung für die Berechtigung MANAGE_EXTERNAL_STORAGE generiert wird und in meinem Fall manchmal vom Play Store abgelehnt wird.

Da wir die Ziel-API 30 verwendet haben, können wir keine Dateien von unserem internen Speicher an die Anwendung weiterleiten oder weitergeben.

1voto

Guopeng Li Punkte 61

2022 Kotlin Weg, um Erlaubnis zu fragen:

private val writeStoragePermissionResult =
   registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->}

private fun askForStoragePermission(): Boolean =
   if (hasPermissions(
           requireContext(),
           Manifest.permission.READ_EXTERNAL_STORAGE,
           Manifest.permission.WRITE_EXTERNAL_STORAGE
       )
   ) {
       true
   } else {
       writeStoragePermissionResult.launch(
           arrayOf(
               Manifest.permission.READ_EXTERNAL_STORAGE,
               Manifest.permission.WRITE_EXTERNAL_STORAGE,
           )
       )
       false
   }

fun hasPermissions(context: Context, vararg permissions: String): Boolean = permissions.all {
    ActivityCompat.checkSelfPermission(context, it) == PackageManager.PERMISSION_GRANTED
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X