Android-Lesen externen Speicher gibt securityException

Ich versuche, die Musik-Dateien in das Gerät. hier ist was ich tun:

public ArrayList<Track> getAllSongsFromSDCARD()
{
    allTracks = new ArrayList<Track>();
    String[] STAR = { "*" };
    Uri allsongsuri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";

    Cursor cursor = mContext.getApplicationContext().getContentResolver().query(allsongsuri, STAR, selection, null, null);

    if (cursor != null) {
        if (cursor.moveToFirst()) {
            do {
                String song_name = cursor
                        .getString(cursor
                                .getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
                int song_id = cursor.getInt(cursor
                        .getColumnIndex(MediaStore.Audio.Media._ID));

                String fullpath = cursor.getString(cursor
                        .getColumnIndex(MediaStore.Audio.Media.DATA));


                String album_name = cursor.getString(cursor
                        .getColumnIndex(MediaStore.Audio.Media.ALBUM));
                int album_id = cursor.getInt(cursor
                        .getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));

                String artist_name = cursor.getString(cursor
                        .getColumnIndex(MediaStore.Audio.Media.ARTIST));
                int artist_id = cursor.getInt(cursor
                        .getColumnIndex(MediaStore.Audio.Media.ARTIST_ID));



                String duration = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
                int[] splitTime = null;
                String hours, minutes, seconds, formattedTime;
                try{
                    splitTime = splitToComponentTimes(BigDecimal.valueOf(Long.valueOf(duration)/1000));
                    hours = String.valueOf(splitTime[0]);
                    minutes = String.valueOf(splitTime[1]);
                    seconds = String.valueOf(splitTime[2]);
                    if(hours.equals("0")){
                        formattedTime = minutes + ":" + seconds;
                    }else{
                        formattedTime = hours + ":" + minutes + ":" + seconds;
                    }
                }catch (Exception e){
                    formattedTime = "00:00";
                }

                allTracks.add(new Track(song_name, song_id, fullpath, album_name, album_id, artist_name, artist_id, formattedTime));
            } while (cursor.moveToNext());

        }

        sortTracksAlphabetically(allTracks);
        cursor.close();
    }
    return allTracks;
}

Und ich habe die folgenden Berechtigungen in meinem manifest:

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

Wenn ich diesen code auf ein Gerät mit Android version 4.3 funktioniert es einwandfrei. Aber wenn ich es auf einem Gerät mit Android-version 5.0.2 gibt es

"java.lang.SecurityException: Permission Denial: Lesen
com.android.die Anbieter.media.MediaProvider uri
Inhalt://media/external/audio/media aus pid=5701, uid=10054 erfordert
android.die Genehmigung.READ_EXTERNAL_STORAGE"

Kann mir jemand sagen warum? Hier ist der vollständige stacktrace:

02-14 19:25:52.812    5701-5701/com.yrazlik.musicplayer E/AndroidRuntime FATAL EXCEPTION: main
Process: com.yrazlik.musicplayer, PID: 5701
java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=5701, uid=10054 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
        at android.os.Parcel.readException(Parcel.java:1540)
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185)
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
        at android.content.ContentProviderProxy.query(ContentProviderNative.java:420)
        at android.content.ContentResolver.query(ContentResolver.java:478)
        at android.content.ContentResolver.query(ContentResolver.java:422)
        at com.yrazlik.musicplayer.dialogs.AllSongsDialog.getAllSongsFromSDCARD(AllSongsDialog.java:74)
        at com.yrazlik.musicplayer.dialogs.AllSongsDialog.onCreate(AllSongsDialog.java:59)
        at android.app.Dialog.dispatchOnCreate(Dialog.java:373)
        at android.app.Dialog.show(Dialog.java:274)
        at com.yrazlik.musicplayer.fragments.PlaylistFragment$1.onClick(PlaylistFragment.java:86)
        at android.view.View.performClick(View.java:4756)
        at android.view.View$PerformClick.run(View.java:19749)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5221)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

Dank.

  • Stellen Sie sicher, dass Ihre <uses-permission> Elemente richtig positioniert sind. Sie müssen sofort die Kinder von <manifest>, als Kollegen von <application>.
  • oh du hast Recht, ich hatte die Berechtigungen im application-tag und nun zog ich Sie. Jetzt funktioniert es. Aber warum war es kein problem mit meinem android-4.3-Gerät, aber es ist ein problem in 5.0.2 Gerät?
InformationsquelleAutor yrazlik | 2015-02-14
Schreibe einen Kommentar