Android7.0-8.0app更新
阿新 • • 發佈:2018-12-17
在做app時,你想上線就必須要做更新的介面
首先在做驗證時你需要打包,把AS安裝的解除安裝掉然後在安裝打包的apk;
7.0,8.0都需要許可權
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
在AndroidManifest中加入:
/*
注意:在有的手機上你做測試時會發現一直在
Uri apkUri = FileProvider.getUriForFile(Frag_Set_Set.this, BuildConfig.APPLICATION_ID+".provider", file);
這裡一直卡住報錯;有可能和我最開始的原因一樣,在BuildConfig.APPLICATION_ID+".provider"及authorities="你的包名.provider"使用的是authorities="你的包名.fileprovider",把兩個地方的fileprovider改成provider就可以了
*/
<provider android:name="android.support.v4.content.FileProvider" android:authorities="你的包名.provider" android:grantUriPermissions="true" android:exported="false" > <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
怎麼下載安裝包就不說了,網上大把教材,我在下載好後安裝更新這卡了半天!
7.0-8.0安裝其實差不大多,只不過8.0,需要申請許可權
/** * 判斷是否是8.0,8.0需要處理未知應用來源許可權問題,否則直接安裝 */ private void checkIsAndroidO(File file) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { boolean b = getPackageManager().canRequestPackageInstalls(); if (b) { installApk(file);//安裝應用的邏輯(寫自己的就可以) } else { //請求安裝未知應用來源的許可權 new ToastUtil().showToast(Frag_Set_Set.this,"請開啟安裝未知來源應用的許可權,否則無法正常安裝!",2000); ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.REQUEST_INSTALL_PACKAGES}, 0); } }else { installApk(file); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case 0: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { installApk(file); } else { //沒有許可權 在 yourAppPackageName 設定你的app包名 Uri packageURI = Uri.parse("package:" + getPackageName()); Logutil.w(tag,"-->"+packageURI); Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI); Frag_Set_Set.this.startActivityForResult(intent, 1); } break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case 1: checkIsAndroidO(file); break; default: break; } }
然後就是安裝了:
/**
* 安裝apk
*/
private void installApk(File file) {
if (Build.VERSION.SDK_INT>=24){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
boolean hasInstallPermission = getPackageManager().canRequestPackageInstalls();
if (!hasInstallPermission) {
checkIsAndroidO(file);
return;
}
// intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
Intent i = new Intent(Intent.ACTION_VIEW);
i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
i.addFlags(Intent
.FLAG_ACTIVITY_NEW_TASK);//開啟一個執行緒,防止安裝好後開啟時閃退
Uri apkUri = FileProvider.getUriForFile(Frag_Set_Set.this, BuildConfig.APPLICATION_ID+".provider", file);
Logutil.w(tag,"-->"+BuildConfig.APPLICATION_ID+".provider");
i.setDataAndType(apkUri, "application/vnd.android.package-archive");
startActivity(i);
}
//7.0以下相容
else {
try {
Intent i = new Intent(Intent.ACTION_VIEW);
i.setDataAndType(Uri.parse("file://" + file.toString()), "application/vnd.android.package-archive");
startActivity(i);
}catch (Exception e){
}
}
}
/*
注意:你在安裝好後殿開啟時出現閃退,是因為你需要開一個執行緒出來:i.addFlags(Intent .FLAG_ACTIVITY_NEW_TASK);
Android7.0,8.0更新app
*/