我刚开始使用android M而我无法访问外部存储空间。我收到以下错误
Caused by: java.lang.SecurityException: Permission Denial: reading
com.android.providers.media.MediaProvider uri
content://media/external/images/media from pid=15355, uid=10053 requires
android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
我在清单中添加用户权限,如
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
我的构建文件有以下设置:
compileSdkVersion 23
buildToolsVersion "22.0.1"
minSdkVersion 16
targetSdkVersion 23
如何从android M中的外部存储读取和写入?
答案 0 :(得分:21)
阅读documentation。我必须在运行时询问用户的权限。代码示例:
像我们之前做的那样为Android清单添加权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
检查用户是否已授予权限。如果是,请跳过请求许可并继续您的工作流程,否则请求用户许可:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.System.canWrite(this)) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE}, 2909);
} else {
// continue with your code
}
} else {
// continue with your code
}
现在检查用户是否已授予权限或拒绝其@Override
OnRequestPermissionResult
以获得回调:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case 2909: {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.e("Permission", "Granted");
} else {
Log.e("Permission", "Denied");
}
return;
}
}
}
我只能通过询问WRITE才能读取外部存储空间 许可,所以我不得不要求
Manifest.permission.READ_EXTERNAL_STORAGE
也是如此。
此外,如果您想要定位api 23以下的版本,请检查Build VERSION在运行时使用
IF
语句并仅在请求权限时才使用 VERSION等于或高于Android M
。
答案 1 :(得分:6)
如果您正在寻找在任何Android版本中处理的方法(您正在为M编译,但某些设备可能正在使用其他版本),则存在兼容版本。
List
答案 2 :(得分:2)
关于所选答案:
Settings.System.canWrite(this)
和WRITE_EXTERNAL_STORAGE
是两个非常不同的东西!应该是:
boolean needsRead = ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED;
boolean needsWrite = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED;
if (needsRead || needsWrite)
requestStoragePermission()
答案 3 :(得分:1)
我正在努力获得WRITE_EXTERNAL_STORAGE
权限:在我提出请求后,对话框没有显示并立即返回DENIED
。
问题出在其中一个包含的库中。它在AndroidManifest.xml
中包含相同的权限声明,但maxSdkVersion="22"
包含相同的权限声明。应用程序的清单文件中的声明被库重写。
要覆盖库中的权限,我使用了以下内容:
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:node="remove"
tools:selector="com.example.lib" />
我希望这可能会有所帮助。
答案 4 :(得分:-1)
我在github上使用了这个实用程序。它适用于API 22和23.添加运行时权限并不难,但必须分离代码并移动方法来捕获回调有点痛苦。这个库提供了一个链式api来完成支持运行时权限所需的所有操作。