1. 程式人生 > >Android使用系統DownloadManager下載更新軟體,並自動跳轉到安裝頁面

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);
}