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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Häufig, wenn Sie Erlaubnis erhalten, Fehler trotz
<uses-permission>
Elemente im manifest, es ist, weil die Elemente sind an der falschen Stelle, die im manifest. Sie müssen sofort die Kinder von<manifest>
, als Kollegen von<application>
.Vor Android 4.4,
READ_EXTERNAL_STORAGE
entweder nicht existieren oder nicht durchgesetzt werden, auf gewöhnlichen Geräten.READ_EXTERNAL_STORAGE
, wie Sie sehen können, in manifest.targetSdkVersion
des Projekts ist unter 23, also der Laufzeit die Berechtigung system ist nicht auf jeder beliebigen version von Android. Android 6.0 Geräte, die Behandlung von legacy-Anwendungen wie das gleiche wie die älteren Geräte haben, hinsichtlich der Berechtigungen (alle gewährten vorne).Eine sehr Gute Antwort von "CommonsWare" auf anderen link
Dem großen Grund für die nicht immer Ihre Zustimmung heute ist, weil Ihr Projekt einen targetSdkVersion von 23 oder höher, und die Berechtigung, die Sie anfordern, ist "gefährlich". In Android 6.0, dies beinhaltet:
ACCESS_COARSE_LOCATION
ACCESS_FINE_LOCATION
ADD_VOICEMAIL
BODY_SENSORS
CALL_PHONE
KAMERA
GET_ACCOUNTS
PROCESS_OUTGOING_CALLS
READ_CALENDAR
READ_CALL_LOG
READ_CELL_BROADCASTS
READ_CONTACTS
READ_EXTERNAL_STORAGE
READ_PHONE_STATE
READ_SMS
RECEIVE_MMS
RECEIVE_SMS
RECEIVE_WAP_PUSH
RECORD_AUDIO
SEND_SMS
USE_SIP
WRITE_CALENDAR
WRITE_CALL_LOG
WRITE_CONTACTS
WRITE_EXTERNAL_STORAGE
Für diese Berechtigungen, nicht nur, dass Ihre targetSdkVersion 23+ app müssen die
<uses-permission>
element(s), aber Sie haben auch zu bitten, für die Berechtigungen zur Laufzeit vom Benutzer auf Android 6.0+ Geräte, mit Methoden wie checkSelfPermission() und requestPermissions().Als vorübergehende Lösung, lassen Sie Ihre targetSdkVersion unter 23.
Jedoch, schließlich, Sie haben aus irgendeinem Grund, wollen Sie Ihren targetSdkVersion 23 oder höher. Zu dieser Zeit, müssen Sie Ihre app zur Nutzung der neuen runtime permission-system. Die Android 6.0 Album Vorhören Dokumentation hat eine Seite gewidmet, zu diesem Thema.
Für JETZT habe ich abgebaut, meine targetSdkVersion von 23 auf 21 seiner Arbeit, aber seine temporäre Lösung.