为Android READ_EXTERNAL_STORAG​​E许可 [英] READ_EXTERNAL_STORAGE permission for Android

查看:543
本文介绍了为Android READ_EXTERNAL_STORAG​​E许可的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想给用户设备上播放他们在访问媒体文件(音乐);一个简单的Hello World - 音乐播放器应用程序。

我跟着一些教程,他们基本上给出相同的code。但它不会工作;它不断崩溃,告诉我:

 错误.....
java.lang.SecurityException异常:引起拒绝权限:读com.android.providers.media.MediaProvider URI内容://媒体/外部/音频/媒体从PID = 27696,UID = 10059需要android.permission.READ_EXTERNAL_STORAG​​E,或grantUriPermission()
....

现在,这是我的清单文件:

 <?XML版本=1.0编码=UTF-8&GT?;
<清单
    的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    包=slimsimapps.troff>    <使用许可权的android:NAME =android.permission.MEDIA_CONTENT_CONTROL/>
    <使用许可权的android:NAME =android.permission.READ_EXTERNAL_STORAG​​E/>
    <使用许可权的android:NAME =android.permission.WRITE_EXTERNAL_STORAG​​E/>
<应用
    机器人:allowBackup =真
    机器人:图标=@的mipmap / ic_launcher
    机器人:标签=@字符串/ APP_NAME
    机器人:主题=@风格/ AppTheme>
    <活动
        机器人:名字=。MainActivity
        机器人:标签=@字符串/ APP_NAME>
        &所述;意图滤光器>
            <作用机器人:名字=android.intent.action.MAIN/>            <类机器人:名字=android.intent.category.LAUNCHER/>
        &所述; /意图滤光器>
    < /活性GT;
< /用途>
< /清单>

这是我的Java的方法:

 公共无效的initialize(){
    ContentResolver的ContentResolver的= getContentResolver();
    URI URI = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    光标光标= contentResolver.query(URI,NULL,NULL,NULL,NULL);
    如果(光标== NULL){
        //查询失败,处理错误。
    }否则如果(!cursor.moveToFirst()){
        //在设备上无介质
    }其他{
        做{
            addSongToXML(光标);
        }而(cursor.moveToNext());
    }
}

我曾尝试:

要在清单文件中把这个在不同的地方:

 <使用许可权的android:NAME =android.permission.READ_EXTERNAL_STORAG​​E/>

在读取外部存储premission maxSdkVersion:

要添加的android

 <使用许可权
    机器人:名字=android.permission.READ_EXTERNAL_STORAG​​E
    机器人:maxSdkVersion =21/>

为了把这个清单中/应用/活动标签:

 的android:出口=真

要放在javamethod URI和cursro之间grantUri premission:

  grantUriPermission(NULL,URI,Intent.FLAG_GRANT_READ_URI_PERMISSION);

要使用它,它不会崩溃,但光标变成空:

  URI = MediaStore.Audio.Media.getContentUri(EXTERNAL_CONTENT_URI);

要使用内部内容的URI,这正常工作,但只给出了OS-声音,如快门声,电池低电量声,按钮单击,这样的:

  URI = MediaStore.Audio.Media.INTERNAL_CONTENT_URI;

普莱斯帮助,这不应该是一个困难的问题我知道,但我觉得这样的初学者!

我已阅读的,并试图(或者认为他们是不适用于我的问题):

堆栈跟踪:

  6月9日至8日:59:36.619 2009至09年/ slimsimapps.troff D / AndroidRuntime:关闭VM
    ---------崩溃的开始
6月9日至8日:59:36.619 2009-2009 / slimsimapps.troff E / AndroidRuntime:致命异常:主要
    工艺:slimsimapps.troff,PID:2009
    java.lang.IllegalStateException:无法为Android execute方法:的onClick
            在android.view.View $ DeclaredOnClickListener.onClick(View.java:4452)
            在android.view.View.performClick(View.java:5198)
            在android.view.View $ PerformClick.run(View.java:21147)
            在android.os.Handler.handleCallback(Handler.java:739)
            在android.os.Handler.dispatchMessage(Handler.java:95)
            在android.os.Looper.loop(Looper.java:148)
            在android.app.ActivityThread.main(ActivityThread.java:5417)
            在java.lang.reflect.Method.invoke(本机方法)
            在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726)
            在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     java.lang.reflect.InvocationTargetException:产生的原因
            在java.lang.reflect.Method.invoke(本机方法)
            在android.view.View $ DeclaredOnClickListener.onClick(View.java:4447)
在android.view.View.performClick(View.java:5198)
在android.view.View $ PerformClick.run(View.java:21147)
在android.os.Handler.handleCallback(Handler.java:739)
在android.os.Handler.dispatchMessage(Handler.java:95)
在android.os.Looper.loop(Looper.java:148)
在android.app.ActivityThread.main(ActivityThread.java:5417)
在java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     java.lang.SecurityException异常:引起拒绝权限:读com.android.providers.media.MediaProvider URI内容://媒体/外部/音频/ PID自= 2009的媒体,UID = 10059需要android.permission.READ_EXTERNAL_STORAG​​E,或grantUriPermission()
            在android.os.Parcel.readException(Parcel.java:1599)
            在android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
            在android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
            在android.content.ContentProviderProxy.query(ContentProviderNative.java:421)
            在android.content.ContentResolver.query(ContentResolver.java:491)
            在android.content.ContentResolver.query(ContentResolver.java:434)
            在slimsimapps.troff.MainActivity.initialize(MainActivity.java:106)
            在slimsimapps.troff.MainActivity.InitializeExternal(MainActivity.java:80)
在java.lang.reflect.Method.invoke(本机方法)
在android.view.View $ DeclaredOnClickListener.onClick(View.java:4447)
在android.view.View.performClick(View.java:5198)
在android.view.View $ PerformClick.run(View.java:21147)
在android.os.Handler.handleCallback(Handler.java:739)
在android.os.Handler.dispatchMessage(Handler.java:95)
在android.os.Looper.loop(Looper.java:148)
在android.app.ActivityThread.main(ActivityThread.java:5417)
在java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
    ---------系统开始


解决方案

您对您的问题两个解决方案。快速一个是降低targetApi至22(的build.gradle文件)。
二是用新的,美好的要求换权限模型:

 如果(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAG​​E)
        != PackageManager.READ_EXTERNAL_STORAG​​E){    //我们应该显示一个解释?
    如果(shouldShowRequestPermissionRationale(
            Manifest.permission.READ_EXTERNAL_STORAG​​E)){
        //向用户说明为什么我们需要读取联系人
    }    requestPermissions(新的String [] {} Manifest.permission.READ_EXTERNAL_STORAG​​E,
            MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAG​​E);    // MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAG​​E是
    //应用程序定义的整型常量    返回;
}

Sniplet在这里找到: https://developer.android.com /$p$pview/features/runtime-permissions.html

I'm trying to access media files (music) on the users device to play them; an easy "hello world"-music player app.

I've followed some tutorials and they basically give the same code. But it won't work; it keeps crashing and telling me:

error.....
Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=27696, uid=10059 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
....

Now, this is my manifest file:

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="slimsimapps.troff" >

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


<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
</manifest>

This is my Java-method:

public void initialize() {
    ContentResolver contentResolver = getContentResolver();
    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    Cursor cursor = contentResolver.query(uri, null, null, null, null);
    if (cursor == null) {
        // query failed, handle error.
    } else if (!cursor.moveToFirst()) {
        // no media on the device
    } else {
        do {
            addSongToXML(cursor);
        } while (cursor.moveToNext());
    }
}

I have tried:

To put this at different places in the manifest file:

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

To add android:maxSdkVersion at Read external storage premission:

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

To put this in the manifest / application / activity-tag:

android:exported="true"

To put grantUriPremission between uri and cursro in the javamethod:

grantUriPermission(null, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);

To use this, it won't crash, but the cursor becomes null:

uri = MediaStore.Audio.Media.getContentUri("EXTERNAL_CONTENT_URI");

To use INTERNAL content uri, this works as expected, but it only gives "OS-sounds" such as shutter-sound, low-battery-sound, button-click and such:

uri = MediaStore.Audio.Media.INTERNAL_CONTENT_URI;

Pleas help, this should not be a hard problem i know, but i feel like such a beginner!

I have read and tried (or considered them to be not applicable for my problem):

Stack trace:

09-08 06:59:36.619    2009-2009/slimsimapps.troff D/AndroidRuntime﹕ Shutting down VM
    --------- beginning of crash
09-08 06:59:36.619    2009-2009/slimsimapps.troff E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: slimsimapps.troff, PID: 2009
    java.lang.IllegalStateException: Could not execute method for android:onClick
            at android.view.View$DeclaredOnClickListener.onClick(View.java:4452)
            at android.view.View.performClick(View.java:5198)
            at android.view.View$PerformClick.run(View.java:21147)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            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.reflect.InvocationTargetException
            at java.lang.reflect.Method.invoke(Native Method)
            at android.view.View$DeclaredOnClickListener.onClick(View.java:4447)
            at android.view.View.performClick(View.java:5198)
            at android.view.View$PerformClick.run(View.java:21147)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            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=2009, uid=10059 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
            at android.os.Parcel.readException(Parcel.java:1599)
            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:491)
            at android.content.ContentResolver.query(ContentResolver.java:434)
            at slimsimapps.troff.MainActivity.initialize(MainActivity.java:106)
            at slimsimapps.troff.MainActivity.InitializeExternal(MainActivity.java:80)
            at java.lang.reflect.Method.invoke(Native Method)
            at android.view.View$DeclaredOnClickListener.onClick(View.java:4447)
            at android.view.View.performClick(View.java:5198)
            at android.view.View$PerformClick.run(View.java:21147)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            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)
    --------- beginning of system

解决方案

You have two solutions for your problem. The quick one is to lower targetApi to 22 (build.gradle file). Second is to use new and wonderful ask-for-permission model:

if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
        != PackageManager.READ_EXTERNAL_STORAGE) {

    // Should we show an explanation?
    if (shouldShowRequestPermissionRationale(
            Manifest.permission.READ_EXTERNAL_STORAGE)) {
        // Explain to the user why we need to read the contacts
    }

    requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
            MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);

    // MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE is an
    // app-defined int constant

    return;
}

Sniplet found here: https://developer.android.com/preview/features/runtime-permissions.html

这篇关于为Android READ_EXTERNAL_STORAG​​E许可的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆