[英]always get java.lang.SecurityException: Permission Denial trying to read the data from external storage
我正在為Android創建媒體查看器應用程序。當我的應用程序在移動設備上運行時效果很好,但是當我在平板電腦上運行我的應用程序時卻崩潰了。
java.lang.SecurityException:權限拒絕:從pid = 26136讀取com.android.providers.media.MediaProvider uri content:// media / external / audio / media,uid = 10096需要android.permission.READ_EXTERNAL_STORAGE或grantUriPermission()
這是我的代碼:
SortedSet<String> dirList=new TreeSet<String>();
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String[] projection = {MediaStore.Audio.AudioColumns.DATA};
Cursor cursor = null;
if (uri != null)
cursor= context.getContentResolver().query(uri,projection,null,null,null);
if (cursor != null && cursor.moveToFirst()) {
do {
String tempDir = cursor.getString(0);
tempDir = tempDir.substring(0, tempDir.lastIndexOf("/"));
try {
dirList.add(tempDir);
} catch(Exception e) {
e.printStackTrace();
}
} while (cursor.moveToNext());
directories = new String[dirList.size()];
dirList.toArray(directories);
directories=mediaFilter.filterMediaFiles(directories);
if(!isInstalled){
isInstalled=true;
installAudioDetails();
}
return true;
}
}
清單代碼:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.vasylpaliy.mediaview">
<uses-permission android:name="android.permission.SET_WALLPAPER" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<application
android:allowBackup="true"
android:largeHeap="true"
android:icon="@drawable/gallery_icon"
android:label="@string/app_name"
android:theme="@style/SelectTheme">
<activity
android:name=".MainActivity"
android:theme="@style/ImageTheme"
android:label="@string/photos">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ImageSelecter"
android:parentActivityName=".MainActivity"
android:label="@string/photos"
android:theme="@style/SelectTheme">
<intent-filter>
<action android:name="android.intent.action.ImageSelecter" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".Settings"
android:label="Setting"
android:parentActivityName="com.example.vasylpaliy.mediaview.ImageSelecter">
<intent-filter>
<action android:name="android.intent.action.FullScreenImage" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".AudioList"
android:theme="@style/AudioListTheme"
android:label="@string/audio_list">
</activity>
<activity
android:name=".AudioAction"
android:icon="@drawable/red_music"
android:configChanges="keyboardHidden|orientation"
android:theme="@style/AudioPlayerTheme"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:parentActivityName="com.example.vasylpaliy.mediaview.AudioList"
android:label="@string/audio_view">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<data android:mimeType="audio/*"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity
android:name=".ImageSlider"
android:theme="@style/ImageSlider"
android:parentActivityName=".ImageSelecter"
android:label="Image">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
</activity>
<activity
android:name="com.audioplayer.AudioPlayer"
android:theme="@style/AudioPlayerTheme">
</activity>
<service
android:name="com.audioplayer.AudioService">
</service>
</application>
</manifest>
在AndroidManifest.xml上設置權限
<?xml version="1.0" encoding="utf-8"?>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".Home"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".cst_cell_album_list"
android:label="@string/title_activity_cst_cell_album_list" >
</activity>
<service android:enabled="true" android:name="com.vvs.root.memusic.PlayerService" />
<receiver android:name="com.vvs.root.memusic.PlayerService$MyReceiver" >
</receiver>
</application>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
通過它的外觀,您已在清單中正確設置了權限。 僅當Android-M API23上會發生此崩潰。 原因是READ_EXTERNAL_STORAGE
被視為危險許可 。 因此,即使您已在清單中聲明了該權限,也需要確保讓用戶在運行時接受此權限。 這個怎么做? 在這里閱讀: http : //developer.android.com/training/permissions/requesting.html
這是正確的方法,但是如果您想走一小段路,可以將targetSdkVersion
設置為22或更低。 這將確保即使在M版本上運行時,也將授予所有權限。 但是用戶仍然可以手動關閉這些權限。 這就是失敗的原因。
注意:本課程描述如何在目標API級別23或更高且在運行Android 6.0(API級別23)或更高的設備上運行的應用上實現權限請求。 如果設備或應用程序的targetSdkVersion為22或更低,則系統會提示用戶在安裝或更新應用程序時授予所有危險權限。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.