Android8.0以上及7.0以下(自動安裝apk)處理
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 8.0系統 獲取 未知應用安裝權限 -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
1.先獲取是否有安裝未知來源應用的權限,當你的應用適配到8.0後以後不處理好安裝未知來源的適配權限。可能會導致應用無法升級,只能卸載後重新下載新版本
private void checkInstall() {
boolean haveInstallPermission;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//先獲取是否有安裝未知來源應用的權限
haveInstallPermission = getPackageManager().canRequestPackageInstalls();
if (!haveInstallPermission) {//沒有權限
AlertDialog alertDialog = new AlertDialog.Builder(this)
.setTitle("請開啓未知來源權限")
.setMessage("應用需要打開安裝未知來源應用權限,請去設置中開啓權限")
.setCancelable(false)
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
ToastUtil.showToast(MainActivity.this,"您拒絕了權限,應用無法正常使用!");
finish();
}
})
.setPositiveButton("去設置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
toInStallPermissionSettingActivity();
}
}).create();
alertDialog.show();
return;
}
}
//有權限,進行安裝操作
installAPK();
}
2.toInStallPermissionSettingActivity
protected static final int REQUEST_CODE_INSTALL_PERMISSION = 2;
private void toInStallPermissionSettingActivity() {
Uri packageURI = Uri.parse("package:" + getPackageName());
//注意這個是8.0新API
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
startActivityForResult(intent, REQUEST_CODE_INSTALL_PERMISSION);
}
3.onActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK && requestCode == REQUEST_CODE_INSTALL_PERMISSION){
checkInstall();//以防萬一,再次檢查權限
}
}
4.installAPK自動安裝
private void installAPK() {
String fileName = MyResource.DOWNLOAD_PATH
+ "/app-release.apk";
try {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//7.0 Android N
//com.xxx.xxx.fileprovider爲上述manifest中provider所配置相同
MyLog.i("tag","大於7.0");
uri = FileProvider.getUriForFile(mContext, "zz.bole.songjisn.fileprovider", new File(fileName));
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//7.0以後,系統要求授予臨時uri讀取權限,安裝完畢以後,系統會自動收回權限,該過程沒有用戶交互
} else {//7.0以下
MyLog.i("7.0以下","7.0以下");
uri = Uri.fromFile(new File(fileName));
}
intent.setDataAndType(uri, "application/vnd.android.package-archive");
// 查詢所有符合 intent 跳轉目標應用類型的應用,注意此方法必須放置在 setDataAndType 方法之後
List<ResolveInfo> resolveLists = mContext.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
// 然後全部授權
for (ResolveInfo resolveInfo : resolveLists){
String packageName = resolveInfo.activityInfo.packageName;
mContext.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
startActivity(intent);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}catch (ActivityNotFoundException e){
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}
}
5.清單文件中加provider
<provider
android:authorities="你的包名.fileprovider"
android:name="android.support.v4.content.FileProvider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths"/>
</provider>
6.@xml/filepaths res目錄下新建xml目錄
<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
<external-path path="" name="download"/>
</paths>
</resources>