首先在我的应用程序中,我让系统下载器应用程序为我下载了apk。然后,我使用以下代码安装由Android默认下载管理器下载的apk文件:
if (getFileId() == downloadId) {
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/" + getFileName());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Uri apkUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", file);
Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
intent.setData(apkUri);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
} else {
Uri apkUri = Uri.fromFile(file);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
}
下载完成并调用下载接收器后,此代码将自动运行。而且效果很好。问题是,如果用户单击默认系统下载管理器发出的通知(“下载完整通知”),在API> = 23中,我会收到“无法打开文件”消息,这很烦人(出于任何原因,用户可能希望点击通知)。我希望用户单击通知时能够安装apk文件,该通知已在api <23上运行。我该如何解决这个问题?
答案 0 :(得分:0)
与6.0相比,最有可能与Android 7.0处理权限的方式有关。自Android 7.0起,您需要以其他方式请求权限。尝试修改ContextCompat.checkSelfPermission()方法。将显示此消息,因为未使用此方法请求打开文件的权限。以下是一些小片段,可帮助您按正确的方向进行操作:
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
YourRequestCode);
}
在这里,thisActivity是您当前的活动。