为Android READ_EXTERNAL_STORAGE许可 [英] READ_EXTERNAL_STORAGE permission for Android
问题描述
我想给用户设备上播放他们在访问媒体文件(音乐);一个简单的Hello World - 音乐播放器应用程序。
我跟着一些教程,他们基本上给出相同的code。但它不会工作;它不断崩溃,告诉我:
错误.....
java.lang.SecurityException异常:引起拒绝权限:读com.android.providers.media.MediaProvider URI内容://媒体/外部/音频/媒体从PID = 27696,UID = 10059需要android.permission.READ_EXTERNAL_STORAGE,或grantUriPermission()
....
现在,这是我的清单文件:
<?XML版本=1.0编码=UTF-8&GT?;
<清单
的xmlns:机器人=http://schemas.android.com/apk/res/android
包=slimsimapps.troff> <使用许可权的android:NAME =android.permission.MEDIA_CONTENT_CONTROL/>
<使用许可权的android:NAME =android.permission.READ_EXTERNAL_STORAGE/>
<使用许可权的android:NAME =android.permission.WRITE_EXTERNAL_STORAGE/>
<应用
机器人: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_STORAGE/>
在读取外部存储premission maxSdkVersion:
要添加的android
<使用许可权
机器人:名字=android.permission.READ_EXTERNAL_STORAGE
机器人: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;
普莱斯帮助,这不应该是一个困难的问题我知道,但我觉得这样的初学者!
的我已阅读的,并试图(或者认为他们是不适用于我的问题):
- Android READ_EXTERNAL_STORAGE权限不工作
- Require许可只针对较旧的Android版本:maxSdkVersion不起作用
- Get从mediastore 文件名和路径的URI
- Android奇巧SecurityException异常试图从MediaStore 来读出时
- Android: java.lang.SecurityException异常:权限拒绝:启动意图
堆栈跟踪:
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_STORAGE,或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_STORAGE)
!= PackageManager.READ_EXTERNAL_STORAGE){ //我们应该显示一个解释?
如果(shouldShowRequestPermissionRationale(
Manifest.permission.READ_EXTERNAL_STORAGE)){
//向用户说明为什么我们需要读取联系人
} requestPermissions(新的String [] {} Manifest.permission.READ_EXTERNAL_STORAGE,
MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE); // MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE是
//应用程序定义的整型常量 返回;
}
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):
- Android READ_EXTERNAL_STORAGE permission not working
- Require permission only for older android versions: maxSdkVersion does not work?
- Get filename and path from uri from mediastore
- Android KitKat securityException when trying to read from MediaStore
- Android: java.lang.SecurityException: Permission Denial: start Intent
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_STORAGE许可的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!