android 安装apk 遇到的问题
2019-07-10 本文已影响0人
程序员阿兵
很多应用都是采用内部下载的方式,版本升级后可以实时更新最新应用,这样的体验肯定比跳转到浏览器好得多!而应用商店审核周期长,所以内部下载更新就显得尤为重要!
下面是Android不同版本需要适配安装的问题:
- Android6.0,需要动态申请权限,读取写入。
- Android7.0,需要通过fileprovider的方式创建Uri
- Android8.0,需要申请【安装未知来源应用权限】
具体代码:
/**
* 兼容8.0安装位置来源的权限
*/
private void installApk(Context context, String downloadApkPath) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//是否有安装位置来源的权限
boolean haveInstallPermission = getPackageManager().canRequestPackageInstalls();
if (haveInstallPermission) {
AppUtils.installApk(context, downloadApkPath);
} else {
new ResolveInstallDialog(context, "安装应用需要打开安装未知来源应用权限,请去设置中开启权限", new ResolveInstallDialog.OnOkListener() {
@Override
public void onOkClick() {
Uri packageUri = Uri.parse("package:"+ AppUtils.getAppPackageName());
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES,packageUri);
}
}).show();
}
} else {
AppUtils.installApk(context, downloadApkPath);
}
}
具体安装代码:
/**
* 根据安装包路径安装apk
*
* @param mContex 上下文
* @param apkPath apk路径
*/
public static void installApk(Context mContex, String apkPath) {
Intent intent = new Intent(Intent.ACTION_VIEW);
File apkFile = new File(apkPath);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri contentUri = FileProvider.getUriForFile(
mContex
, mContex.getPackageName()+".accomponentcheckupdate.provider"
, apkFile);
intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
} else {
intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
}
mContex.startActivity(intent);
}
7.0 配置fileProvider
新建xml目录创建 fileprovider
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path path="." name="external_storage_root" />
</paths>
自定义FileProvider
public class ACComponentItemCheckUpDateFileProvider extends FileProvider {
}
在manifest 配置FileProvider
<application>
<service
android:name=".update.VersionUpdateService"
android:process=":versionUpdateService" />
<provider
android:authorities="${applicationId}.accomponentcheckupdate.provider"
android:name=".ACComponentItemCheckUpDateFileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
</application>