我的任务是更新之前使用以下设置构建的Android应用程序:
compileSdkVersion 19
buildToolsVersion '19.0.1'
defaultConfig {
minSdkVersion 15
targetSdkVersion 19
}
我下载了最新的Android Studio,最后将这些内容更改为以下内容以构建应用程序:
compileSdkVersion 21
buildToolsVersion '21.1.2'
defaultConfig {
minSdkVersion 15
targetSdkVersion 19
}
以前构建的应用程序运行良好,没有任何崩溃。不幸的是,当我构建它时,应用程序崩溃时出现以下异常:
Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=2476, uid=10053 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
即使许可显然在清单中:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.dbotha.app">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
在加载MediaStore.Images.Media.EXTERNAL_CONTENT_URI
的游标时发生崩溃:
new CursorLoader(
this,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[]{
MediaStore.Images.Media._ID,
MediaStore.Images.Media.BUCKET_ID,
MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
MediaStore.Images.Thumbnails._ID
},
null,
null,
null
);
除了撕掉整个组件并从头开始重新实现之外我还有点难过 - 我宁愿避免这种做法;)
答案 0 :(得分:2)
事实证明,项目依赖项在maxSDKVersion
中的库中具有AndroidManifest.xml
属性,用于这些权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
在清单合并过程中,该属性将被包含在内,并在运行API版本18以上的任何设备上中断。
解决此问题的一种方法是添加以下应用程序清单,以确保maxSdkVersion
属性不会进入合并的AndroidManifest.xml
:
<manifest
xmlns:tools="http://schemas.android.com/tools"
...>
<uses-permission tools:node="replace" android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
<uses-permission tools:node="replace" android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="18" />