android - 点击下载完成通知显示“无法打开文件”toast?
问题描述
首先在我的应用程序中,我让系统下载器应用程序为我下载一个 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 工作。我怎么解决这个问题?
解决方案
与 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 是您当前的活动。
推荐阅读
- python - 如何使用熊猫创建概率矩阵
- python - TypeError: unhashable type: 'list' 当我想将一些属性值包含到列表中时
- amazon-web-services - 如何使用 StreamManager 为 Jetson Nano 板配置 AWS SiteWise?
- javascript - React Native UI 无法正确呈现
- html - 如何使android应用程序(使用网站到apk转换器的网站制作)在后台运行,如服务
- powerbi - 汇总为占位符类别并深入了解详细信息
- javascript - 需要帮助将动画添加到 SVG 图形
- kubernetes - 从ansible中的组中提取所有IP以在yaml文件中使用
- c# - Garmin Api OAuth 在 C# 中签署 HMACSHA1
- visual-studio-code - VS Code Eslint - 'airbnb-base' 传播错误