Android8.0以上及7.0以下(自動安裝apk)處理

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>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章