READ_EXTERNAL_STORAGE-Berechtigung für Android

Lesezeit: 10 Minuten

READ EXTERNAL STORAGE Berechtigung fur Android
Schlanker Sim

Ich versuche, auf Mediendateien (Musik) auf dem Gerät des Benutzers zuzugreifen, um sie abzuspielen. eine einfache “Hello World”-Musikplayer-App.

Ich habe einige Tutorials befolgt und sie geben im Grunde den gleichen Code. Aber es wird nicht funktionieren; es stürzt ständig ab und sagt mir:

error.....
Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=27696, uid=10059 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
....

Nun, das ist meine Manifestdatei:

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="slimsimapps.troff" >

    <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
</manifest>

Dies ist meine Java-Methode:

public void initialize() {
    ContentResolver contentResolver = getContentResolver();
    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    Cursor cursor = contentResolver.query(uri, null, null, null, null);
    if (cursor == null) {
        // query failed, handle error.
    } else if (!cursor.moveToFirst()) {
        // no media on the device
    } else {
        do {
            addSongToXML(cursor);
        } while (cursor.moveToNext());
    }
}

Ich habe versucht:

So platzieren Sie dies an verschiedenen Stellen in der Manifestdatei:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE”/>

So fügen Sie android:maxSdkVersion bei Read External Storage Premission hinzu:

<uses-permission
    android:name="android.permission.READ_EXTERNAL_STORAGE"
    android:maxSdkVersion="21" />

So fügen Sie dies in das manifest / application / activity-tag ein:

android:exported=“true”

GrantUriPremission zwischen uri und cursro in der javamethod einfügen:

grantUriPermission(null, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);

Um dies zu verwenden, stürzt es nicht ab, aber der Cursor wird null:

uri = MediaStore.Audio.Media.getContentUri("EXTERNAL_CONTENT_URI”);

Um INTERNAL content uri zu verwenden, funktioniert dies wie erwartet, aber es gibt nur “OS-Sounds” wie Shutter-Sound, Low-Battery-Sound, Button-Click und dergleichen:

uri = MediaStore.Audio.Media.INTERNAL_CONTENT_URI;

Bitte helfen Sie, das sollte kein schwieriges Problem sein, ich weiß, aber ich fühle mich wie ein Anfänger!

ich habe gelesen und versucht (oder für mein Problem als nicht anwendbar angesehen):

  • Die Android-Berechtigung READ_EXTERNAL_STORAGE funktioniert nicht
  • Berechtigung nur für ältere Android-Versionen erforderlich: maxSdkVersion funktioniert nicht?
  • Holen Sie sich den Dateinamen und den Pfad von der URI von Mediastore
  • Android KitKat securityException beim Versuch, aus MediaStore zu lesen
  • Android: java.lang.SecurityException: Permission Denial: start Intent

Stack-Trace:

09-08 06:59:36.619    2009-2009/slimsimapps.troff D/AndroidRuntime﹕ Shutting down VM
    --------- beginning of crash
09-08 06:59:36.619    2009-2009/slimsimapps.troff E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: slimsimapps.troff, PID: 2009
    java.lang.IllegalStateException: Could not execute method for android:onClick
            at android.view.View$DeclaredOnClickListener.onClick(View.java:4452)
            at android.view.View.performClick(View.java:5198)
            at android.view.View$PerformClick.run(View.java:21147)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Method.invoke(Native Method)
            at android.view.View$DeclaredOnClickListener.onClick(View.java:4447)
            at android.view.View.performClick(View.java:5198)
            at android.view.View$PerformClick.run(View.java:21147)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=2009, uid=10059 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
            at android.os.Parcel.readException(Parcel.java:1599)
            at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
            at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
            at android.content.ContentProviderProxy.query(ContentProviderNative.java:421)
            at android.content.ContentResolver.query(ContentResolver.java:491)
            at android.content.ContentResolver.query(ContentResolver.java:434)
            at slimsimapps.troff.MainActivity.initialize(MainActivity.java:106)
            at slimsimapps.troff.MainActivity.InitializeExternal(MainActivity.java:80)
            at java.lang.reflect.Method.invoke(Native Method)
            at android.view.View$DeclaredOnClickListener.onClick(View.java:4447)
            at android.view.View.performClick(View.java:5198)
            at android.view.View$PerformClick.run(View.java:21147)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
    --------- beginning of system

  • Seltsamerweise wird dieser Fehler angezeigt, wenn Sie diese Zeile nicht im Manifest angegeben haben versuchen Sie, einige Dateien zu lesen, die von einigen anderen Apps geschützt sind?

    – Sonne sonnig

    7. September 15 um 5:42 Uhr


  • Auf welcher API-Ebene versuchst du das?

    – Scharfe Kante

    7. September 15 um 5:48 Uhr

  • Haben Sie versucht, das Projekt zu bereinigen? ?

    – Sonne sonnig

    7. September 15 um 5:50 Uhr

  • @sunilsunny Ich versuche nicht, geschützte Dateien zu lesen, nicht dass ich sowieso wüsste, nur ein einfacher Mediaplayer. Ja, ich habe versucht, es zu bereinigen, ich habe versucht, den Computer neu zu starten, ich habe versucht, ein signiertes APK zu generieren und es auf Google Play zu veröffentlichen und als Tester darauf zuzugreifen, ohne Erfolg ….

    – Schlanker Sim

    7. September 15 um 14:27 Uhr

  • @Scharfe Kante ; Mein AVD ist der Standard Nexus 5, api 23. Mein Modulgradle hat: compileSdkVersion 23 buildToolsVersion “23.0.0” minSdkVersion 14 targetSdkVersion 23 Also würde ich sagen 23.

    – Schlanker Sim

    7. September 15 um 14:29 Uhr

1643422028 9 READ EXTERNAL STORAGE Berechtigung fur Android
piotrpo

Sie haben zwei Lösungen für Ihr Problem. Die schnelle Möglichkeit besteht darin, targetApi auf 22 zu senken (build.gradle-Datei). Zweitens ist die Verwendung eines neuen und wunderbaren Ask-for-Permission-Modells:

if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
    if (shouldShowRequestPermissionRationale(
            Manifest.permission.READ_EXTERNAL_STORAGE)) {
        // Explain to the user why we need to read the contacts
    }

    requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
            MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);

    // MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE is an
    // app-defined int constant that should be quite unique

    return;
}

Schnipsel hier gefunden: https://developer.android.com/training/permissions/requesting.html

Lösungen 2: Wenn es nicht funktioniert, versuchen Sie Folgendes:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
    && ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
        REQUEST_PERMISSION);

return;

}

und dann im Rückruf

@Override
public void onRequestPermissionsResult(final int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PERMISSION) {
    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        // Permission granted.
    } else {
        // User refused to grant permission.
    }
}
}

das ist aus Kommentaren. Danke

  • Ja, sicher! Das neue Berechtigungsmodell, das Google mit dem neuesten Android eingeführt hat! Vielen Dank, ich werde das so schnell wie möglich testen und es richtig markieren, wenn es funktioniert! (und ich fing an zu glauben, dass das vergessen wurde!)

    – Schlanker Sim

    17. September 15 um 15:47 Uhr

  • Die Erlaubnis, die angefordert wird, sollte sein READ_EXTERNAL_STORAGE. Wie in dieser Antwort.

    – maclir

    1. März 16 um 10:12 Uhr

  • Tauschen Sie != PackageManager.READ_EXTERNAL_STORAGE gegen != PackageManager.PERMISSION_GRANTED aus

    – Wiedergeburt

    10. November 16 um 17:51 Uhr


  • @Renascienza, ja du hast recht. Jemand hat diese Antwort falsch bearbeitet.

    – piotrpo

    14. November 16 um 18:31 Uhr

  • Was ist MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE?

    – Solo

    5. August 17 um 10:32 Uhr

READ EXTERNAL STORAGE Berechtigung fur Android
maclir

Sie müssen zur Laufzeit nach der Erlaubnis fragen:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
        && ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
            REQUEST_PERMISSION);
    dialog.dismiss();
    return;
}

Und im Callback unten können Sie problemlos auf den Speicher zugreifen.

@Override
public void onRequestPermissionsResult(final int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_PERMISSION) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Permission granted.
        } else {
            // User refused to grant permission.
        }
    }
}

Schritt 1: Berechtigung für Android manifest.xml hinzufügen

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Schritt 2: onCreate()-Methode

int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_MEDIA);
    } else {
        readDataExternal();
    }

Schritt 3: Überschreiben Sie die onRequestPermissionsResult-Methode, um einen Rückruf zu erhalten

 @Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_MEDIA:
            if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                readDataExternal();
            }
            break;

        default:
            break;
    }
}

Hinweis: readDataExternal() ist eine Methode zum Abrufen von Daten aus einem externen Speicher.

Danke.

  • Ich denke, Sie haben hier die erforderliche Berechtigung verlegt: READ_EXTERNAL_STORAGE.

    – Wiedergeburt

    10. November 16 um 17:48 Uhr

Ich hatte auch ein ähnliches Fehlerprotokoll und hier ist, was ich getan habe:

  1. In der onCreate-Methode fordern wir ein Dialogfeld zum Überprüfen der Berechtigungen an

    ActivityCompat.requestPermissions(MainActivity.this,
    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},1);
    
  2. Methode zur Überprüfung des Ergebnisses

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 1: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // permission granted and now can proceed
             mymethod(); //a sample method called
    
            } else {
    
                // permission denied, boo! Disable the
                // functionality that depends on this permission.
                Toast.makeText(MainActivity.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
            }
            return;
        }
        // add other cases for more permissions
        }
    }
    

Die offizielle Dokumentation zu Anfordern von Laufzeitberechtigungen

Wurde Ihr Problem gelöst? Was ist Ihr Ziel-SDK? Versuchen Sie, hinzuzufügen android;maxSDKVersion="21" zu <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

  • Hat bei mir mit Cordova funktioniert, indem ich nur die maximale SDK-Version in AndroidManifest.xml auf 22 (statt 23) gesetzt habe.

    – Georg Kagan

    6. Juni 16 um 16:46 Uhr

1643422028 566 READ EXTERNAL STORAGE Berechtigung fur Android
javdromero

Im Jahr 2021 stehe ich vor diesem Problem. Also werde ich dieses Problem mithilfe der Manifestdatei lösen, die ich in der Anwendung ein Tag hinzufüge:

<application 
android:requestLegayExternalStorage="true"
/>

HINWEIS: Dies funktioniert nur bis Android 10, siehe weitere Informationen Hier

  • Hat bei mir mit Cordova funktioniert, indem ich nur die maximale SDK-Version in AndroidManifest.xml auf 22 (statt 23) gesetzt habe.

    – Georg Kagan

    6. Juni 16 um 16:46 Uhr

http://developer.android.com/reference/android/provider/MediaStore.Audio.AudioColumns.html

Versuchen Sie, die Zeile zu ändern contentResolver.query

//change it to the columns you need
String[] columns = new String[]{MediaStore.Audio.AudioColumns.DATA}; 
Cursor cursor = contentResolver.query(uri, columns, null, null, null);

öffentlicher statischer finaler String MEDIA_CONTENT_CONTROL

Nicht für die Verwendung durch Anwendungen von Drittanbietern aufgrund des Datenschutzes beim Medienkonsum

http://developer.android.com/reference/android/Manifest.permission.html#MEDIA_CONTENT_CONTROL

versuche die zu entfernen <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL"/> zuerst und versuchen Sie es erneut?

  • Danke, ich habe Ihren Vorschlag ausprobiert, aber er ist an derselben Stelle abgestürzt … Ich verwende einen Mac, kann das ein Problem sein?

    – Schlanker Sim

    7. September 15 um 14:39 Uhr

  • aktualisiert, versuchen Sie zu entfernen <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL"/> und versuche? Es kann zu einem seltsamen Verhalten führen, da Ihre App eine nicht zulässige Berechtigung anfordert

    – Derek Fung

    7. September 15 um 15:25 Uhr

  • danke, ich habe versucht, diese Berechtigung zu entfernen, aber sie stürzt an derselben Stelle mit demselben Fehler ab …

    – Schlanker Sim

    8. September 15 um 5:11 Uhr


.

682300cookie-checkREAD_EXTERNAL_STORAGE-Berechtigung für Android

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy