氣抖冷!氣抖冷兼丰! 都2050年了玻孟,還在這上面折騰一天,羞愧致死....
一鳍征、問題表現(xiàn)
應(yīng)用內(nèi)更新黍翎,apk下載完成后未自動(dòng)彈出安裝界面(或彈出去后閃退);我們之前下載Apk用的是DownloadManager,這次之后就完全不用了艳丛,因?yàn)閼?yīng)用退到后臺(tái)后(在Receiver里面)啟動(dòng)Activity現(xiàn)在是不被允許的
二匣掸、填坑
- 7.0后文件分享需要加FileProvider,這里不展開講了氮双,主要是要注意下Flag問題: FileProvider需要添加Intent.FLAG_GRANT_READ_URI_PERMISSION碰酝,從非Activity啟動(dòng)需要Intent.FLAG_ACTIVITY_NEW_TASK,直接
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_NEW_TASK)
- 申請(qǐng) REQUEST_INSTALL_PACKAGES 權(quán)限戴差,搜資料的時(shí)候有老外說需要?jiǎng)討B(tài)申請(qǐng)權(quán)限送爸,即用ActivityCompat.requestPermissions。我用我的小米手機(jī)(MIUI12)測(cè)試發(fā)現(xiàn)不可以,表現(xiàn)為沒有權(quán)限彈窗直接被系統(tǒng)拒絕袭厂。所以目前只有用以下的方式申請(qǐng)權(quán)限:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
boolean hasInstallPermission = activity.getPackageManager().canRequestPackageInstalls();
if (!hasInstallPermission) {
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Uri.parse("package:" + activity.getPackageName()));
activity.startActivityForResult(intent, CODE_REQUEST);
}
}
注意:需要對(duì)應(yīng)的Activity onActivityResult里面處理是否已授權(quán)
- App退到后臺(tái)后杈绸,Receiver收到下載完成廣播后無法喚起安裝醉拓。完全理解所坯,所以DownloadManger+Receiver的形式處理應(yīng)用升級(jí)棺牧,在這種情況下容易出問題应媚,不建議使用
三狮崩、最終代碼(片段)
1.AndroidManifest增加權(quán)限申請(qǐng)
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
2.下載Apk前横浑,先判斷權(quán)限萌腿,若無需要申請(qǐng) REQUEST_INSTALL_PACKAGES
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
boolean hasInstallPermission = activity.getPackageManager().canRequestPackageInstalls();
if (!hasInstallPermission) {
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Uri.parse("package:" + activity.getPackageName()));
activity.startActivityForResult(intent, CODE_REQUEST);
}
}
- 下載完成后喚起安裝
private void install(Context context, File file) {
try {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//兼容7.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_NEW_TASK);
//這里牽涉到7.0系統(tǒng)中URI讀取的變更
Uri contentUri = FileProvider.getUriForFile(context, context.getPackageName() + ".provider", file);
intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
} else {
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
}
if (context.getPackageManager().queryIntentActivities(intent, 0).size() > 0) {
//如果是Activity乾忱,可以startActivityForResult
context.startActivity(intent);
}
} catch (Throwable e) {
e.printStackTrace();
}
}