首页 > 解决方案 > 点击下载完成通知显示“无法打开文件”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 工作。我怎么解决这个问题?

标签: androidnotificationsapk

解决方案


与 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 是您当前的活动。


推荐阅读