Android 版本更新下载自动安装APK,并解决Android6.0安装失败的问题
2017-04-27 01:57
1246 查看
现在APP都有版本更新的功能,有的是跳转到浏览器进行下载,感觉比较麻烦,用户体验也不好,简便的方法就是直接下载安装即可。即使用Android自带的DownManager,通过启动一个后台服务进行下载,下载完成之后以广播的形式通知用户安装,方便很多。
比较闹心的还是6.0权限的问题,下载安装需要一个路径,也就需要读写SD卡权限,不过发现一个问题就是:如果自己不定义一个路径,6.0手机下载完成之后,并没有出现安装的界面,只有自己设置了路径才正常。。。activity跳转到service进行下载
private Intent updataService ; private static int REQUESTPERMISSION = 110 ; public void upData(){ updataService = new Intent(SplashActivity.this, UpdataService.class); updataService.putExtra("downloadurl",version.url); if(ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ //申请权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUESTPERMISSION); CommonToast.showToast("请允许权限进行下载安装"); }else{ startService(updataService); } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(requestCode==REQUESTPERMISSION){ if(permissions[0].equals(Manifest.permission.WRITE_EXTERNAL_STORAGE)){ if (grantResults[0] == PackageManager.PERMISSION_GRANTED){ if(updataService!=null) startService(updataService); }else{ //提示没有权限,安装不了咯 } } } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
updataService 类直接拿来用
public class UpdataService extends Service { /** * 安卓系统下载类 **/ private DownloadManager manager; /** * 接收下载完的广播 **/ private DownloadCompleteReceiver receiver; private String url; private String DOWNLOADPATH = "/apk/";//下载路径,如果不定义自己的路径,6.0的手机不自动安装 /** * 初始化下载器 **/ private void initDownManager() { manager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); receiver = new DownloadCompleteReceiver(); //设置下载地址 DownloadManager.Request down = new DownloadManager.Request(Uri.parse(url)); // 设置允许使用的网络类型,这里是移动网络和wifi都可以 down.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI); down.setAllowedOverRoaming(false); MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton(); String mimeString = mimeTypeMap.getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(url)); down.setMimeType(mimeString); // 下载时,通知栏显示途中 down.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE); // 显示下载界面 down.setVisibleInDownloadsUi(true); // 设置下载后文件存放的位置 down.setDestinationInExternalPublicDir(DOWNLOADPATH, "member.apk"); down.setTitle("member"); // 将下载请求放入队列 manager.enqueue(down); //注册下载广播 registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); } @Override public int onStartCommand(Intent intent, int flags, int startId) { url = intent.getStringExtra("url"); String path = Environment.getExternalStorageDirectory().getAbsolutePath() +DOWNLOADPATH+ "member.apk"; File file = new File(path); if (file.exists()) { file.delete(); } try { // 调用下载 initDownManager(); } catch (Exception e) { e.printStackTrace(); Toast.makeText(getApplicationContext(), "下载失败", Toast.LENGTH_SHORT).show(); } return Service.START_NOT_STICKY; } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onDestroy() { if (receiver != null) // 注销下载广播 unregisterReceiver(receiver); super.onDestroy(); } // 接受下载完成后的intent class DownloadCompleteReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //判断是否下载完成的广播 if (intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) { //获取下载的文件id long downId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); if (manager.getUriForDownloadedFile(downId) != null) { //自动安装apk installAPK(manager.getUriForDownloadedFile(downId), context); //installAPK(context); } else { Toast.makeText(context, "下载失败", Toast.LENGTH_SHORT).show(); } //停止服务并关闭广播 UpdataService.this.stopSelf(); } } private void installAPK(Uri apk, Context context) { if (Build.VERSION.SDK_INT < 23) { Intent intents = new Intent(); intents.setAction("android.intent.action.VIEW"); intents.addCategory("android.intent.category.DEFAULT"); intents.setType("application/vnd.android.package-archive"); intents.setData(apk); intents.setDataAndType(apk, "application/vnd.android.package-archive"); intents.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intents); } else { File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +DOWNLOADPATH+ "member.apk"); if (file.exists()) { openFile(file, context); } } } private void installAPK(Context context) { File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +DOWNLOADPATH+ "member.apk"); if (file.exists()) { openFile(file, context); } else { Toast.makeText(context, "下载失败", Toast.LENGTH_SHORT).show(); } } } public void openFile(File file, Context context) { Intent intent = new Intent(); intent.addFlags(268435456); intent.setAction("android.intent.action.VIEW"); String type = getMIMEType(file); intent.setDataAndType(Uri.fromFile(file), type); try { context.startActivity(intent); } catch (Exception var5) { var5.printStackTrace(); Toast.makeText(context, "没有找到打开此类文件的程序", Toast.LENGTH_SHORT).show(); } } public String getMIMEType(File var0) { String var1 = ""; String var2 = var0.getName(); String var3 = var2.substring(var2.lastIndexOf(".") + 1, var2.length()).toLowerCase(); var1 = MimeTypeMap.getSingleton().getMimeTypeFromExtension(var3); return var1; } }http://blog.csdn.net/asialyf/article/details/53259579
相关文章推荐
- Android 版本更新下载自动安装APK,并解决Android6.0,7.0安装失败的问题
- Android 版本更新下载自动安装APK,并解决Android6.0安装失败的问题
- 关于android中版本自动更新,从服务器下载下来的文件不能安装的问题
- Android 一步一步实现版本自动更新(第二步 下载和安装apk)
- Android 8.0版本更新无法自动安装问题的解决方法
- android 7.0 apk版本更新,下载之后自动安装
- Android 下载apk提示更新以及解决Android 6.0 Marshmallow提示更新报错问题
- xp安装了SP3以后无法更新的解决办法(XP自动更新下载后安装失败)
- android之apk自动更新解析包失败问题
- Android问题】解决 Android SDK下载和更新失败“Connection to https://dl-ssl.google.com refused...
- android 6.0以上系统apk自动安装失败问题
- Android APK 版本更新的下载和安装 直接上代码
- 解决Android版本更新,安装失败
- 【解决】APK下载到Cache目录安装失败的问题
- Android安装包apk文件在某些版本操作系统上安装解析包出错问题的解决办法
- Android开发日志3——解决 Android SDK下载和更新失败“Connection to https://dl-ssl.google.com refused”的问题
- android之apk自动更新解析包失败问题
- Android客户端apk自动检测更新自动下载自动安装的实现方法
- Android 解决apk覆盖安装的时候,出现安装失败,与旧版本部兼容的问题
- 【Android问题】解决 Android SDK下载和更新失败“Connection to https://dl-ssl.google.com refused”的问题