如何获取读取外部存储权限?

15

我正在为安卓开发一个mp3播放器应用,但是我遇到了与用户权限(READ_EXTERNAL_STORAGE)相关的错误。

这是我的代码,我在其中请求权限:

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

        if (ContextCompat.checkSelfPermission(PlayListActivity.this,
                Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {


            // OPCIONAL(explicaciones de poque pedimos los permisos)
            if (ActivityCompat.shouldShowRequestPermissionRationale(PlayListActivity.this,
                    Manifest.permission.READ_EXTERNAL_STORAGE)) {

            } else {
                //pedir permisos
                ActivityCompat.requestPermissions(PlayListActivity.this,
                        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                        permissionCheck);

这是其余的代码:

ArrayList<HashMap<String, String>> songsListData = new ArrayList<HashMap<String, String>>();

    SongsManager plm = new SongsManager(PlayListActivity.this);
    // get all songs from sdcard
    this.songsList = plm.getPlayList();

    // looping through playlist
    for (int i = 0; i < songsList.size(); i++) {
        // creating new HashMap
        HashMap<String, String> song = songsList.get(i);

        // adding HashList to ArrayList
        songsListData.add(song);
    }

    // se añaden las canciones a la ListView mediante un adapter utilizando el layout playlist_item
    ListAdapter adapter = new SimpleAdapter(this, songsListData,
            R.layout.playlist_item, new String[] { "songTitle" }, new int[] {
            R.id.songTitle });

    setListAdapter(adapter);

这是错误:

03-31 22:09:16.159 2258-2258/com.androidchatapp E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.androidchatapp, PID: 2258
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.androidchatapp/com.androidchatapp.PlayListActivity}: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=2258, uid=10184 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2434)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2494)
    at android.app.ActivityThread.access$900(ActivityThread.java:153)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1347)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5451)
    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=2258, uid=10184 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
    at android.os.Parcel.readException(Parcel.java:1620)
    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:493)
    at android.content.ContentResolver.query(ContentResolver.java:435)
    at com.androidchatapp.SongsManager.getPlayList(SongsManager.java:48)
    at com.androidchatapp.PlayListActivity.onCreate(PlayListActivity.java:65)
    at android.app.Activity.performCreate(Activity.java:6323)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2387)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2494)
    at android.app.ActivityThread.access$900(ActivityThread.java:153)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1347)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5451)
    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)

你在清单文件中添加了权限吗? <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> - Edu
2个回答

28

你已经向代码请求了权限,但可能忘记在清单文件中添加此权限标签。

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

15

Android在Marshmallow操作系统中引入了运行时权限,因此我们需要使用Manifest权限来实现运行时权限。如果 CompileSdkVersion = 23

您可以在屏幕打开时(在onCreate()中)或单击按钮的点击事件(例如-play Music)时请求权限

使用此方法检查运行时权限是否已启用

 private static final int READ_STORAGE_PERMISSION_REQUEST_CODE = 41;
 public boolean checkPermissionForReadExtertalStorage() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        int result = context.checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE);
        return result == PackageManager.PERMISSION_GRANTED;
    }
    return false;
 }
如果它返回false,则调用以下方法,它将显示一个关于权限的对话框。
 public void requestPermissionForReadExtertalStorage() throws Exception {
        try {
            ActivityCompat.requestPermissions((Activity) context, new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE},
                    READ_STORAGE_PERMISSION_REQUEST_CODE);
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
    }

5
如果有人需要知道: 静态常量 Integer READ_STORAGE_PERMISSION_REQUEST_CODE=0x3; 你可以使用任何数字。 - Boris Karloff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接