经过大量尝试,我能够通过为低于Nougat的任何内容创建不同的Intent来解决此问题,例如使用FileProvider在Nougat导致错误之前使用Android版本创建安装Intent。
ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.INSTALL_PACKAGE dat=content://XXX.apk flg=0x1 }
在Android Nougat上使用普通Uri时,会出现以下错误:
FileUriExposedException: file:
我的解决方案适用于模拟器上的Android N和运行Android M的手机。
File toInstall = new File(appDirectory, appName + ".apk");
Intent intent;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Uri apkUri = FileProvider.getUriForFile(activity, BuildConfig.APPLICATION_ID + ".fileprovider", toInstall);
intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
intent.setData(apkUri);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
} else {
Uri apkUri = Uri.fromFile(toInstall);
intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
activity.startActivity(intent);
Android Nougat 7.1更新:
您还需要在清单中添加权限REQUEST_INSTALL_PACKAGES。它可从Api级别23(Android 6.0棉花糖)获取,而从级别25(Android 7.1牛轧糖)需要。
更新:
如果您尝试安装的文件在外部存储器上,请记住要请求读取和写入外部存储器的权限。并为Android Nougat及更高版本设置正确的FileProvider。
首先,通过canReadWriteExternal()
以下方式检查您是否具有写权限requestPermission()
:
private static final int REQUEST_WRITE_PERMISSION = 786;
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == REQUEST_WRITE_PERMISSION && grantResults[0] == PackageManager.PERMISSION_GRANTED)
Toast.makeText(this, "Permission granted", Toast.LENGTH_LONG).show();
}
private void requestPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
requestPermissions(new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_PERMISSION);
}
private boolean canReadWriteExternal() {
return Build.VERSION.SDK_INT < Build.VERSION_CODES.M ||
ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED;
}
这是外部存储上Download文件夹的文件提供程序示例。AndroidManifest.xml:
<application ... >
...
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
</application>
resources / xml / filepaths.xml:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_download" path="Download"/>
</paths>
如果在安装.apk时遇到错误,请说“解析软件包时出现问题”。可能是您没有要求读/写权限,或者您尝试安装的文件不存在或已损坏。
ACTION_INSTALL_PACKAGE
。这为我工作作为N开发者预览版的6月版的。