介绍: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);
}