Android使用系統DownloadManager下載更新軟體,並自動跳轉到安裝頁面
介紹:https://www.jianshu.com/p/7ad92b3d9069
1.下載apk
/*
* 下載apk
* @param context
* @param title 通知的標題
* @param url 下載的地址
* @param id 返回一個加入下載佇列的id ,下載完成時會附在廣播上一起傳送過來
* */
public static long downloadApk(Context context, String title, String url) {
Log.d(TAG, "downloadApk: "); android.app.DownloadManager.Request request = new android.app.DownloadManager.Request(Uri.parse(url)); request.setAllowedNetworkTypes(android.app.DownloadManager.Request.NETWORK_WIFI); request.setAllowedNetworkTypes(android.app.DownloadManager.Request.NETWORK_MOBILE); request.setDestinationInExternalFilesDir(context, Environment.DIRECTORY_DOWNLOADS, "could.apk"); request.setNotificationVisibility(android.app.DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); /*設定notification的資訊*/ request.setTitle(title); request.setDescription("下載完成後點選開啟"); request.setVisibleInDownloadsUi(true); request.setMimeType("application/vnd.android.package-archive"); android.app.DownloadManager manager = (android.app.DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); final long refrence = manager.enqueue(request); Log.d(TAG, "downloadApk: 返回的id"+refrence); return refrence; }
2.註冊廣播,監聽 DownloadManager.ACTION_DOWNLOAD_COMPLETE 的系統廣播,apk下載完成後會發送這一條廣播
/註冊廣播/
mBroadcast = new DownloadCompleteBroadcast();
IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
registerReceiver(mBroadcast,filter);
廣播:
下載完成廣播,執行自動開啟安裝包安裝應用
*/
public class DownloadCompleteBroadcast extends BroadcastReceiver{
private final String TAG = DownloadCompleteBroadcast.class.getSimpleName();
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, “onReceive: 使用廣播”);
if (intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)){
long id = com.example.his.cloudlibaray.utils.http.DownloadManager.DOWNLOAD_ID; //這個是下載apk方法的返回值 DownloadManager manager = (DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE); /*這裡是通過下面這個方法獲取下載的id*/ long ID = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); /*這裡把下載的id和以上方法獲取的id相比較,如果是的話就獲取下載的路徑*/ Log.d(TAG, "onReceive: id:"+id+"ID:"+ID); if(ID == id){ Log.d(TAG, "onReceive: 相等"); DownloadManager.Query query = new DownloadManager.Query(); query.setFilterById(id); Cursor cursor = manager.query(query); if (cursor.moveToFirst()){ //獲取下載路徑 String fileName = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)); //如果檔名不為空,證明檔案存在,就進行安裝 if (fileName != null){ Log.d(TAG, "onReceive: 不為空 filename:"+fileName); com.example.his.cloudlibaray.utils.http.DownloadManager.openApk(context,fileName); } } cursor.close(); } } }
}
3.開啟apk
/*
* 開啟apk
* @param context
* @param filePath
* */
public static void openApk(final Context context, final String fileSavePath) {
Log.d(TAG, "openApk: 開始安裝應用");
/*android版本大於等於8.0*/
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
/*是否有安裝軟體的許可權*/
boolean canInstall = context.getPackageManager().canRequestPackageInstalls();
if (!canInstall) {
/*請求安裝軟體的許可權*/
MyDialog dialog = new MyDialog(context, R.style.customDialog, R.layout.my_dialog, new int[]{R.id.dialog_sure, R.id.dialog_cancel});
dialog.setCancelText("取消");
dialog.setContentText("書城請求安裝軟體許可權");
dialog.setSureText("授權");
dialog.setOnCenterItemClickListener(new MyDialog.OnCenterItemClickListener() {
@Override
public void setOnMyDialogClickListener(MyDialog dialog, View view) {
switch (view.getId()) {
case R.id.dialog_cancel:
break;
case R.id.dialog_sure:
AndPermission.with(context)
.runtime()
.permission(Manifest.permission.REQUEST_INSTALL_PACKAGES)
.onGranted(new Action<List<String>>() {
@Override
public void onAction(List<String> data) {
installN(context, fileSavePath);
}
}).onDenied(new Action<List<String>>() {
@Override
public void onAction(List<String> data) {
Log.d(TAG, "onAction: 許可權被拒絕");
Toast.makeText(context, "請求許可權被拒絕,無法自動安裝軟體!!!", Toast.LENGTH_SHORT).show();
}
});
break;
}
}
});
}
}
/*android版本大於等於7.1*/
else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
installN(context, fileSavePath);
}
/*androi版本小於7.0*/
else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
installDownN(context, fileSavePath);
}
}
/*
* 安裝android7.0以上的
* @param context
* @param fileSavePath
* /
public static void installN(final Context context, final String fileSavePath) {
File file = new File(Uri.parse(fileSavePath).getPath());
String filePath = file.getAbsolutePath();
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data = null;
data = FileProvider.getUriForFile(context, context.getPackageName() + “.fileprovider”, new File(filePath));
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);/給目標設定一個臨時授權/
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(data, “application/vnd.android.package-archive”);
context.startActivity(intent);
}/
* 安裝android7.0以下的
* @param context
* @param fileSavePath
* */
public static void installDownN(final Context context, final String fileSavePath) {
File file = new File(Uri.parse(fileSavePath).getPath());
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data = null;
data = Uri.fromFile(file);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(data, "application/vnd.android.package-archive");
context.startActivity(intent);
}