安装工具类
public class SystemIntentUtils {
/**
* 安装Apk文件
*
* @param context 上下文对象
* @param path 文件全名称路径
*/
public static void installApk(Context context, String path) {
File file = new File(path);
Intent intentUpdate = new Intent("android.intent.action.VIEW");
intentUpdate.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //对Android N及以上的版本做判断
Uri apkUriN = FileProvider.getUriForFile(context, ImageFileProvider.getFileProviderName(context), file);
intentUpdate.addCategory("android.intent.category.DEFAULT");
intentUpdate.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //表示我们需要什么权限
intentUpdate.setDataAndType(apkUriN, "application/vnd.android.package-archive");
} else {
intentUpdate.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
}
context.startActivity(intentUpdate);
}
}
7.0适配ImageFileProvider
public class ImageFileProvider extends FileProvider {
public static String getFileProviderName(Context context) {
return context.getPackageName() + ".provider";
}
}
<provider
android:name=".provider.ImageFileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
file_paths:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<!--"."表示所有路径-->
<files-path path="." name="base_camera_photos" />
<cache-path name="base_image" path="." />
<external-path name="base_name" path="." />
<external-files-path name="base_image_name" path="." />
<external-cache-path name="base_camera_image" path="." />
</paths>
安装路径
public class AppUtils {
public static File createFile(Context context){
File appCacheDir = null;
//判断sd卡正常挂载并且拥有权限的时候创建文件
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) && hasExternalStoragePermission(context)) {
appCacheDir = new File(Environment.getExternalStorageDirectory()+File.separator+"image");
}
if (appCacheDir == null || !appCacheDir.exists() && !appCacheDir.mkdirs()) {
appCacheDir = context.getCacheDir();
}
return appCacheDir ;
}
private static boolean hasExternalStoragePermission(Context context) {
int perm = context.checkCallingOrSelfPermission("android.permission.WRITE_EXTERNAL_STORAGE");
return perm == 0;
}
}
BasApplication加入:
public static String filePath= AppUtils.createFile(context).getAbsolutePath()+ File.separator;
下载的工具类
public class DownloadUtils {
//下载器
private DownloadManager downloadManager;
//上下文
private Context mContext;
//下载的ID
private long downloadId;
private String path;
public DownloadUtils(Context context){
this.mContext = context;
}
BroadcastReceiver receiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
checkStatus();
}
};
//下载apk
public void downloadAPK(String url, String name) {
clearCurrentTask(downloadId);
IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
mContext.registerReceiver(receiver, intentFilter);
downloadManager = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE);
//以下两行代码可以让下载的apk文件被直接安装而不用使用Fileprovider,系统7.0或者以上才启动。
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
// 仅允许在WIFI连接情况下下载
// request.setAllowedNetworkTypes(Request.NETWORK_WIFI);
// 通知栏中将出现的内容
request.setTitle("新版本Apk");
request.setDescription("Apk Downloading");
//7.0以上的系统适配
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
request.setRequiresDeviceIdle(false);
request.setRequiresCharging(false);
}
//制定下载的文件类型为APK
request.setMimeType("application/vnd.android.package-archive");
// 下载过程和下载完成后通知栏有通知消息。
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE | DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
//设置下载的路径
path=BaseApplication.filePath+name;
request.setDestinationInExternalPublicDir(BaseApplication.filePath, name);
//mContext.startActivity(new android.content.Intent(DownloadManager.ACTION_VIEW_DOWNLOADS));//启动系统下载界面
downloadId = downloadManager.enqueue(request);
}
//检查下载状态
private void checkStatus() {
DownloadManager.Query query = new DownloadManager.Query();
//通过下载的id查找
query.setFilterById(downloadId);
Cursor c = downloadManager.query(query);
if (c.moveToFirst()) {
int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
switch (status) {
//下载暂停
case DownloadManager.STATUS_PAUSED:
break;
//下载延迟
case DownloadManager.STATUS_PENDING:
break;
//正在下载
case DownloadManager.STATUS_RUNNING:
break;
//下载完成
case DownloadManager.STATUS_SUCCESSFUL:
//下载完成安装APK
installAPK();
break;
//下载失败
case DownloadManager.STATUS_FAILED:
Toast.makeText(mContext, "下载失败", Toast.LENGTH_SHORT).show();
break;
}
}
c.close();
}
//下载到本地后执行安装
private void installAPK() {
//获取下载文件的Uri
SystemIntentUtils.installApk(mContext, path);
mContext.unregisterReceiver(receiver);
}
/**
* 下载前先移除前一个任务,防止重复下载
*
* @param downloadId
*/
public void clearCurrentTask(long downloadId) {
DownloadManager dm = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE);
try {
dm.remove(downloadId);
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
}
}
}
使用方式:
DownloadUtils downloadUtils=new DownloadUtils(this);
downloadUtils.downloadAPK(“http://xxxxxxx”,“xxxx.apk”);