我正在尝试让我的应用程序自动安装APK文件。对于api<24,这很好运行。但是对于24,则失败了。 Android已经实施了额外的安全措施:
针对Android 7.0的应用程序,Android框架执行StrictMode API策略,禁止在应用程序外部公开file:// URI。如果包含文件URI的意图离开您的应用程序,则应用程序将因FileUriExposedException异常而失败。
所以我尝试了这个:
Uri myuri;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N){
myuri = Uri.parse("file://"+outapk);
} else {
File o = new File(outapk);
myuri = FileProvider.getUriForFile(con, con.getApplicationContext().getPackageName() + ".provider", o);
}
Intent promptInstall = new Intent(Intent.ACTION_VIEW).setDataAndType(myuri,"application/vnd.android.package-archive");
con.startActivity(promptInstall);
但却遭遇致命异常:
com.android.packageinstaller "Caused by: java.lang.SecurityException: Permission Denial: opening provider android.support.v4.content.FileProvider from ProcessRecord{b42ee8a 6826:com.android.packageinstaller/u0a15} (pid=6826, uid=10015) that is not exported from uid 10066".
我的清单文件中有export=true。
问题似乎是packageinstaller无法使用content:// uri。
是否有任何方法允许应用程序在API24上以编程方式安装apk?
Uri.fromFile()
。在新设备(Android 7.0+)上,请使用FileProvider
。 - CommonsWareexported
而不是export
吗? - LarsHFileProvider
,它会抛出异常(请参见这些行)。 - CommonsWare