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

猜你喜欢

转载自blog.csdn.net/weixin_42705415/article/details/83869623