记录一次解决安装 Apk 兼容性问题

  • 时间:
  • 浏览:0
  • 来源:彩神欢乐生肖_神彩欢乐生肖官方

<files-path name="*name*" path="*path*" /> 对应的是:Context.getFileDir()的路径地址

原文发布时间为:2018-11-9

}

<external-path

问提

在华为P20 Android 8.0 手机上,下载Apk并使用通知栏进度条显示,开启应用锁屏通知权限,下载过程在锁屏情况汇报下进行,下载完成后自动执行安装Apk,在解锁后出先系统弹框,解析包出先错误。

本文来自云栖社区合作妙招妙招伙伴“安卓巴士Android开发者门户”,了解相关信息前要关注“安卓巴士Android开发者门户”。

</paths>

public static void installApk(Context context,File apkFile){

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

<files-path name="my_images" path="images/"/>

apkUri = Uri.fromFile(apkFile);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

File newFile = new File(imagePath, "default_image.jpg");

apkUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileProvider", apkFile);

e.printStackTrace();

com.android.packageinstaller/u0a21} (pid=16425, uid=115021) that is not exported from uid 10340

public static void installApk(Context context,File apkFile){

安装apk的妙招(7.0版本兼容问提)

OK,以上之后 亲们普遍解决7.0,以及8.0版本兼容问提的妙招。

}

Intent intent = new Intent(Intent.ACTION_VIEW);

<paths xmlns:android="http://schemas.android.com/apk/res/android">

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

apkUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileProvider", apkFile);

} catch (Exception e) {

for (ResolveInfo resolveInfo : resInfoList) {

<external-path name="*name*" path="*path*" />

懵逼.jpg

对应路径:Context.getCacheFir()+"/${path}/"

本文作者:bear~

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

name="internal_path"

List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);

} else {

对应路径:Context.getExternalStorageDirectory()+"/${path}/"

得到路径:content://${applicationId}/&{name}/

<?xml version="1.0" encoding="utf-8"?>

intent.setDataAndType(apkUri,

String packageName = resolveInfo.activityInfo.packageName;

e.printStackTrace();

对应路径:Environment.getExternalStorageDirectory()+"/${path}/"

path做如下声明

//判断版本算不算 7.0 及 7.0 以上

}

java.lang.SecurityException: Permission Denial:

对应路径:Context.getFileDir()+"/${path}/"

<provider

apkUri = Uri.fromFile(apkFile);

path 说明

context.startActivity(intent);

}

}

这里前要创建之后个paths,之后 每个paths的name没办法 一样

根据系统log分析,猜测在锁屏时,用于安装Apk的service处在休眠因为分析不可用的情况汇报,因为分析通过intent.addflags妙招赋予的临时权限失效了。于是,再次仔细就看官方文档后,发现还有有兩个妙招,前要生成权限且在主动调用妙招因为分析手机重启后才会失效。

path="test" />

path="test" />

res包下创建file_path.xml

intent.setDataAndType(apkUri,

改进后的代码

Uri contentUri = getUriForFile(getContext(), "com.mydomain.fileprovider", newFile);

provider属性说明

Android 8.0系统前要声明权限

<cache-path

context.startActivity(intent);

<meta-data

//打上去对目标应用临时授权该Uri所代表的文件

得到路径:content://${applicationId}/&{name}/

try {

Uri apkUri = null;

Intent intent = new Intent(Intent.ACTION_VIEW);

"application/vnd.android.package-archive");

</paths>

问提定位

//之后 全部授权

经过短暂的懵逼后,之后刚开始通过各种妙招,探索问提的因为分析。

android:name="android.support.v4.content.FileProvider"

首先在AndroidManifest中声明fileProvider

contentUri值为:content://com.mydomain.fileprovider/my_images/default_image.jpg

opening provider android.support.v4.content.FileProvider from ProcessRecord{cc3ad2316425:

android:exported="false"

问提描述

File imagePath = new File(Context.getFilesDir(), "images");

代码执行安装Apk,出先系统弹框解析错误,解析包时出先错误

场景

举个例子说明:

再次尝试,此问提再没办法 出先。

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

<external-cache-path name="*name*" path="*path*" />

<external-files-path name="*name*" path="*path*" />

<paths xmlns:android="http://schemas.android.com/apk/res/android">

对应路径: Context.getExternalCacheDir()+"/${path}/"

try {



android:resource="@xml/file_path" />

</provider>

Uri apkUri = null;

//判断版本算不算 7.0 及 7.0 以上

} catch (Exception e) {

intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

//打上去对目标应用临时授权该Uri所代表的文件

之后 ,在上文描述的场景中依然报出了错误:

"application/vnd.android.package-archive");

} else {

intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

name="external_path"

得到路径:content://${applicationId}/&{name}/

android:name="android.support.FILE_PROVIDER_PATHS"

//查询所有符合 intent 跳转目标应用类型的应用,注意此妙招前要放置setDataAndType的妙招以前

}

得到路径:content://${applicationId}/&{name}/

android:grantUriPermissions="true">

context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);

android:authorities="${applicationId}.fileprovider"

得到路径:content://${applicationId}/&{name}/

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

解决以前安装Apk的妙招

<cache-path name="*name*" path="*path*" />

}