簡體   English   中英

總是獲取java.lang.SecurityException:權限拒絕嘗試從外部存儲讀取數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM