Android 7 和8 都能正常更新安装apk ,但是android 9 及以上进行到安装步骤就报解析软件包出错 . AS错误信息如下
报错信息
java.lang.SecurityException: Permission Denial: reading androidx.core.content.FileProvider uri content://com.speed.telecom.yunan.pda.fileProvider/update_cache/speed.apk from pid=5178, uid=10019 requires the provider be exported, or grantUriPermission()
at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:634)
at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:503)
at android.content.ContentProvider$Transport.enforceFilePermission(ContentProvider.java:494)
at android.content.ContentProvider$Transport.openTypedAssetFile(ContentProvider.java:422)
at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:302)
at android.os.Binder.execTransact(Binder.java:731)
provider
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
file_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths>
<cache-path
name="update_cache"
path="." />
</paths>
关键代码
val intent = Intent(Intent.ACTION_VIEW)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Log.e("包名",BaseApplication.instance.packageName.toString())
val contentUri: Uri = androidx.core.content.FileProvider.getUriForFile(activity, activity.packageName.toString() + ".fileProvider",apk)
intent.setDataAndType(contentUri, "application/vnd.android.package-archive")
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
} else {
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.setDataAndType(Uri.fromFile(apk), "application/vnd.android.package-archive")
}
_installApkLiveData.postData { model ->
model.copy(
state = StateModel.STATE_SUCCESS,
data = intent
)
}