java manager.apk,DownloadManager下载APK并安装

最近用到了硬件更新,感觉自己写更新比较麻烦,我这个人比较懒,能不自己写的绝对不自己写,必须自己写的,再找找瞧瞧能不能不写,想了一下还是使用系统自带的DownloadManager好了,但这个坑还是很多的,还要弄兼容,现在来小结一下。

需要申明的权限,7.x以后的动态获取权限:

一开始呢你的写一个类:

DownloadInfo(不是应当得叫这个昵称,随便取),

接下来就开始撸,我注释写的比较清楚的,方便之后耐看,好理解,之前大部分我都不写注释,写之前,只有我跟笔记本晓得是干啥的,过段时间以后就只有笔记本晓得是干啥的了qq代挂全套 apk下载,问题是,电脑还不跟我分享,这个就太气人,没办法。

1599470227940_1.jpeg

public static void DownloadAPK(Context context,String url,String title,String detail){

//创建request对象

DownloadManager.Request request=new DownloadManager.Request(Uri.parse(url));

//设置什么网络情况下可以下载

request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE);

//设置通知栏的标题

request.setTitle(title);

//设置通知栏的message

request.setDescription(detail);

//设置漫游状态下是否可以下载

request.setAllowedOverRoaming(false);

request.setVisibleInDownloadsUi(true);

//设置文件存放目录

request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);

request.setDestinationInExternalPublicDir(Environment.getExternalStorageDirectory().getAbsolutePath() , "dlysc.apk");

//获取系统服务

if (downloadManager==null) {

downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);

}

//进行下载

DownLoadID = downloadManager.enqueue(request);

}

这部份是设置下载跟启动下载的,其实那样就早已可以下载了,只是为了感受好一点呢,我们还得写一个窃听,不对,人家给我们提供了技巧的,

DownLoadCompleteReceiver

当然,给我们提供的不是这个类,这个也是我们的普通类,也是自己瞎起的昵称,关键是承继:BroadcastReceiver这个类,这个类是一个抽象类,我们还要实现他的**onReceive()**方法:

@Override

public void onReceive(Context context, Intent intent) {

if (intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)){

long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);

Log.e("DownloadManager","下载完成啦!!!");

installApk(context,id);

} else if (intent.getAction().equals(DownloadManager.ACTION_NOTIFICATION_CLICKED)) {

//处理 如果还未完成下载,点击通知 ,跳转到下载中心

Intent viewDownloadIntent = new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS);

viewDownloadIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

context.startActivity(viewDownloadIntent);

}

然后那样就可以实现窃听了,下载完成后就可以提示了。

1599470227940_2.png

这个类写好了以后,别忘了去清单文件中(AndroidManifest.xml)的application中注册一下

如果是文件,那么至这儿就结束了,如果是APK的下载,那就还得安装:

private static void installApk(Context context, long downloadApkId) {

DownloadManager dManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);

Intent install = new Intent(Intent.ACTION_VIEW);

Uri downloadFileUri = dManager.getUriForDownloadedFile(downloadApkId);

if (downloadFileUri != null) {

Log.e("DownloadManager", downloadFileUri.toString());

install.setDataAndType(downloadFileUri, "application/vnd.android.package-archive");

if ((Build.VERSION.SDK_INT >= 24)){

install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件

}

install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

if (install.resolveActivity(context.getPackageManager()) != null) {

context.startActivity(install);

} else {

Log.e("DownloadManager","自动安装失败,请手动安装");

Toast.makeText(context, "下载完成,请点击下拉列表的通知手动安装", Toast.LENGTH_SHORT).show();

}

} else {

Log.e("DownloadManager", "download error");

}

}

到这就结束了,总结一下我碰到的坑:

1、文件可以下载,但是通告栏没反应,改写的都写了,结果还是没有,这就让我呕血了。

2、获取安装路径失败,我用的是:

c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));获取安装路径的,结果说早已淘汰了。

3、下载完成后,无法跳转至安装界面。

接下来解释一下我如何解决的:

1、这个是因为自己没细致,代码写少了,忘了去清单文件中注册了。

2、我仔细想了想,我可以自定义路径的,就是说,我自己早已晓得下载至哪个文件夹了,就不用后去路径了qq代挂全套 apk下载,后去路径时需要兼容7.0前后版本,太难了,不过幸好,系统给了我们一个方式,

DownloadManager dManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);

Intent install = new Intent(Intent.ACTION_VIEW);

Uri downloadFileUri = dManager.getUriForDownloadedFile(downloadApkId);

这样,我们就可以轻松的获取至uri.

3、这个是没有添加权限,安装未知应用,以及容许该APP安装应用,上面写的有,我就不重复了。

奉上我的代码:

DownloadInfo

DownLoadCompleteReceiver

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我作为一个语言模型,无法直接为您提供点击按钮下载apk安装的功能。不过,您可以参考以下步骤来实现这一功能: 1. 在您的应用中,创建一个下载按钮,通过代码实现点击按钮后下载apk文件,可以使用Android原生的DownloadManager来实现下载功能。 2. 在下载完成后,可以使用Android原生的PackageInstaller接口来实现apk安装,或者使用第三方库进行安装,例如: AppInstaller。 以下是一个简单的代码示例,仅供参考: ```java // 下载apk文件 DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); DownloadManager.Request request = new DownloadManager.Request(Uri.parse("apk下载地址")); request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE); request.setAllowedOverRoaming(false); request.setTitle("下载apk"); request.setDescription("正在下载apk,请稍后..."); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "apk名称"); long downloadId = downloadManager.enqueue(request); // 安装apk文件 Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/Download/" + "apk名称")), "application/vnd.android.package-archive"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); ``` 请注意,这只是一个简单的示例代码,您需要根据自己的实际情况进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值