• Stars
    star
    368
  • Rank 115,958 (Top 3 %)
  • Language
    Java
  • License
    Apache License 2.0
  • Created about 8 years ago
  • Updated about 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Android APK Update 版本更新的下载和安装,适配7.0-11.0系统

MNUpdateAPK

Android APK Update Version APK版本更新的下载和安装,适配7.0-11.0下载安装

功能:

1:下载APK
2:安装APK

截图:

如何添加(请认真读完下面步骤和注意事项)

Gradle添加:

1.在Project的build.gradle中添加仓库地址

	allprojects {
		repositories {
			...
			maven { url "https://jitpack.io" }
		}
	}

2.在Module目录下的build.gradle中添加依赖

	dependencies {
        //AndroidX
        implementation 'com.squareup.okhttp3:okhttp:3.11.0'
	    implementation 'com.github.maning0303:MNUpdateAPK:V2.0.5'

        //Suport版本,建议升级AndroidX,不更新
        implementation 'com.squareup.okhttp3:okhttp:3.11.0'
	    implementation 'com.github.maning0303:MNUpdateAPK:V2.0.3'
	}

使用步骤:

1:在Manifest.xml中添加配置

      <!--网络权限问题-->
      <uses-permission android:name="android.permission.INTERNET"/>
      <!--8.0安装需要的权限-->
      <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
      <!--读写权限-->
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
      <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
      <!--读写权限Android11-->
      <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

2:代码使用

Android 11 适配问题:

1.存储权限需要自行适配
2.安装权限:REQUEST_INSTALL_PACKAGES,11用户授权安装权限后会自动的重启App,所以建议在下载新版本之前优先检查有没有安装权限,就不要再下载完成后检查权限,防止出现需要用户下载两次问题。

本地下载安装:

      //1.先判断有没有安装权限---适配8.0
      //如果不想用封装好的,可以自己去实现8.0适配
      InstallUtils.checkInstallPermission(context, new InstallUtils.InstallPermissionCallBack() {
          @Override
          public void onGranted() {
              //去下载Apk
              downloadApk(...);
          }

          @Override
          public void onDenied() {
              //弹出弹框提醒用户
              AlertDialog alertDialog = new AlertDialog.Builder(context)
                      .setTitle("温馨提示")
                      .setMessage("必须授权才能安装APK,请设置允许安装")
                      .setNegativeButton("取消", null)
                      .setPositiveButton("设置", new DialogInterface.OnClickListener() {
                          @Override
                          public void onClick(DialogInterface dialog, int which) {
                              //打开设置页面
                              InstallUtils.openInstallPermissionSetting(context, new InstallUtils.InstallPermissionCallBack() {
                                  @Override
                                  public void onGranted() {
                                      //去下载Apk
                                      downloadApk(...);
                                  }

                                  @Override
                                  public void onDenied() {
                                      //还是不允许咋搞?
                                      Toast.makeText(context, "不允许安装咋搞?强制更新就退出应用程序吧!", Toast.LENGTH_SHORT).show();
                                  }
                              });
                          }
                      })
                      .create();
              alertDialog.show();
          }
      });

      //2.下载APK
      InstallUtils.with(this)
              //必须-下载地址
              .setApkUrl(Constants.APK_URL_01)
              //非必须-下载保存的文件的完整路径+/name.apk,使用自定义路径需要获取读写权限
              .setApkPath(Constants.APK_SAVE_PATH)
              //非必须-下载回调
              .setCallBack(new InstallUtils.DownloadCallBack() {
                  @Override
                  public void onStart() {
                     //下载开始
                  }
      
                  @Override
                  public void onComplete(String path) {
                     //下载完成
                     InstallUtils.installAPK();
                  }
      
                  @Override
                  public void onLoading(long total, long current) {
                     //下载中
                  }
      
                  @Override
                  public void onFail(Exception e) {
                     //下载失败
                  }
      
                  @Override
                  public void cancle() {
                     //下载取消
                  }
              })
              //开始下载
              .startDownload();
           
              
      //3.安装APK
      InstallUtils.installAPK(context, path, new InstallUtils.InstallCallBack() {
                  @Override
                  public void onSuccess() {
                      //onSuccess:表示系统的安装界面被打开
                      //防止用户取消安装,在这里可以关闭当前应用,以免出现安装被取消
                      Toast.makeText(context, "正在安装程序", Toast.LENGTH_SHORT).show();
                  }
      
                  @Override
                  public void onFail(Exception e) {
                      //安装出现异常,这里可以提示用用去用浏览器下载安装
                  }
              });
              
      //取消下载
      InstallUtils.cancleDownload();
      
      //是否正在下载
      InstallUtils.isDownloading();
      
      //单独设置下载监听
      InstallUtils.setDownloadCallBack(new InstallUtils.DownloadCallBack() {
                  @Override
                  public void onStart() {
                      
                  }
      
                  @Override
                  public void onComplete(String path) {
      
                  }
      
                  @Override
                  public void onLoading(long total, long current) {
      
                  }
      
                  @Override
                  public void onFail(Exception e) {
      
                  }
                  
                  @Override
                  public void cancle() {
                      
                  }
              });
              
              
      //安装APK
      /**
       * 安装APK工具类
       * @param activity       上下文
       * @param filePath      文件路径
       * @param callBack      安装界面成功调起的回调
       */
      InstallUtils.installAPK(activity, path, new InstallUtils.InstallCallBack() {
          @Override
          public void onSuccess() {
              //onSuccess:表示系统的安装界面被打开
              //防止用户取消安装,在这里可以关闭当前应用,以免出现安装被取消
              Toast.makeText(context, "正在安装程序", Toast.LENGTH_SHORT).show();
          }
      
          @Override
          public void onFail(Exception e) {
              Toast.makeText(context, "安装失败:" + e.toString(), Toast.LENGTH_SHORT).show();
          }
      });
      

浏览器下载安装:

     //通过浏览器去下载APK
     InstallUtils.installAPKWithBrower(this, APK_URL);

默认下载路径(支持自定义下载路径):

        
     /Android/data/包名/cache/
     或者
     /data/data/包名/cache/

注意注意注意:

8.0权限问题解决方案:

         //自己去判断
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
             //先获取是否有安装未知来源应用的权限
             boolean haveInstallPermission = getPackageManager().canRequestPackageInstalls();
             if (!haveInstallPermission) {
                 //跳转设置开启允许安装
                 Uri packageURI = Uri.parse("package:"+context.getPackageName());
                 Intent intent =new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES,packageURI);
                 startActivityForResult(intent,1000);
                 return;
             }
         }
         //安装APK
         installAPK(...);
        
        
         //------------------------分界线-----------------------
         
         
         //当然这个东西已经封装好了。可以这样使用,详细可以查看Demo
         //先判断有没有安装权限
         InstallUtils.checkInstallPermission(context, new InstallUtils.InstallPermissionCallBack() {
             @Override
             public void onGranted() {
                  //安装APK
                  installAPK(...);
             }
         
             @Override
             public void onDenied() {
                 //弹出弹框提醒用户
                 AlertDialog alertDialog = new AlertDialog.Builder(context)
                         .setTitle("温馨提示")
                         .setMessage("必须授权才能安装APK,请设置允许安装")
                         .setNegativeButton("取消", null)
                         .setPositiveButton("去设置", new DialogInterface.OnClickListener() {
                             @Override
                             public void onClick(DialogInterface dialog, int which) {
                                 //打开安装权限设置页面
                                 InstallUtils.openInstallPermissionSetting(context, new InstallUtils.InstallPermissionCallBack() {
                                     @Override
                                     public void onGranted() {
                                         //安装APK
                                         installAPK(...);
                                     }
         
                                     @Override
                                     public void onDenied() {
                                         //还是不允许咋搞?
                                         Toast.makeText(context, "不允许安装咋搞?强制更新就退出应用程序吧!", Toast.LENGTH_SHORT).show();
                                     }
                                 });
                             }
                         })
                         .create();
                 alertDialog.show();
             }
         });
        

混淆注意:

请添加okhttp3混淆

版本记录:

版本 V2.0.5:
1.优化安装Intent设置FLAG_GRANT_READ_URI_PERMISSION,防止出现权限问题

推荐:

Name Describe
GankMM (Material Design & MVP & Retrofit + OKHttp & RecyclerView ...)Gank.io Android客户端:每天一张美女图片,一个视频短片,若干Android,iOS等程序干货,周一到周五每天更新,数据全部由 干货集中营 提供,持续更新。
MNUpdateAPK Android APK 版本更新的下载和安装,适配7.0,简单方便。
MNImageBrowser 交互特效的图片浏览框架,微信向下滑动动态关闭
MNCalendar 简单的日历控件练习,水平方向日历支持手势滑动切换,跳转月份;垂直方向日历选取区间范围。
MClearEditText 带有删除功能的EditText
MNCrashMonitor Debug监听程序崩溃日志,展示崩溃日志列表,方便自己平时调试。
MNProgressHUD MNProgressHUD是对常用的自定义弹框封装,加载ProgressDialog,状态显示的StatusDialog和自定义Toast,支持背景颜色,圆角,边框和文字的自定义。
MNXUtilsDB xUtils3 数据库模块单独抽取出来,方便使用。
MNVideoPlayer SurfaceView + MediaPlayer 实现的视频播放器,支持横竖屏切换,手势快进快退、调节音量,亮度等。------代码简单,新手可以看一看。
MNZXingCode 快速集成二维码扫描和生成二维码
MNChangeSkin Android夜间模式,通过Theme实现
SwitcherView 垂直滚动的广告栏文字展示。
MNPasswordEditText 类似微信支付宝的密码输入框。
MNSwipeToLoadDemo 利用SwipeToLoadLayout实现的各种下拉刷新效果(饿了吗,京东,百度外卖,美团外卖,天猫下拉刷新等)。

More Repositories

1

MNImageBrowser

一个图片浏览框架,支持AndroidX,支持Fresco,支持微博长图,类似微信图片浏览,手势向下滑动关闭,图片加载引擎自定义,支持长按,单击监听,切换监听,自定义任意的遮罩层,实现各种效果,支持横竖屏切换,简单方便。
Java
738
star
2

GankMM

(Material Design & MVP & Retrofit + OKHttp & RecyclerView ...)Gank.io Android客户端:每天一张美女图片,一个视频短片,若干Android,iOS等程序干货,周一到周五每天更新,数据全部由 干货集中营 提供。
Java
572
star
3

MNProgressHUD

一个常用的自定义弹框封装(适配AndroidX),加载ProgressDialog,状态显示的StatusDialog和自定义Toast,全部支持背景颜色,圆角,边框和文字的自定义,构建者模式,链式调用。
Java
401
star
4

MNCrashMonitor

MNCrashMonitor 监听程序崩溃日志,直接页面展示崩溃日志列表,调试方便,测试人员可以随时给程序猿查看日志详情,可以动态添加日志内容,手机直接查看日志内容可以分享,复制,生成长截图。
Java
283
star
5

MNCalendar

[暂停维护] 简单的日历控件,水平方向日历支持手势滑动切换,跳转月份;垂直方向日历选取区间范围。
Java
264
star
6

MNZXingCode

快速集成zxing二维码扫描,生成二维码,可配置相册,闪光灯,相机可以调整焦距放大缩小,自定义扫描线颜色,自定义背景颜色,自定义遮罩层,自定义Activity,多个二维码扫码(zxing:core:3.3.3/3.4.0)
Java
254
star
7

MNMLKitScanner

基于Google ML Kit 快速集成二维码扫描,速度比zxing快,可配置相册,闪光灯,相机可以调整焦距放大缩小,自定义扫描线颜色,自定义背景颜色,自定义遮罩层,支持同时扫多个二维码和条形码
Java
189
star
8

MNPasswordEditText

Android验证码和密码输入框,能自定义输入框个数和样式(连体,下划线和方形框) 类似微信支付宝的密码输入框等
Java
177
star
9

MNSwipeToLoadDemo

利用SwipeToLoadLayout实现的各种下拉刷新效果(饿了吗,京东,百度外卖,美团外卖,天猫下拉刷新等)
Java
134
star
10

MNVideoPlayer

(暂停维护)SurfaceView + MediaPlayer 实现的视频播放器,支持横竖屏切换,手势快进快退、调节音量,亮度等。------代码简单,基础应用-----
Java
124
star
11

SwitcherView

滚动的广告栏文字展示控件
Java
81
star
12

MClearEditText

带有删除功能的EditText,可以自定义删除图片,自定义下划线等
Java
62
star
13

MNChangeSkin

Android夜间模式,通过Theme实现
Java
49
star
14

GankMM_iOS

(iOS版)干货集中营:每天提供一张美女图片和若干程序干货。
Objective-C
26
star
15

MNCustomCamera

一个自定义相机,只拍摄相框中的图片(身份证拍摄等场景)
Java
13
star
16

MNXUtilsDB

xUtils3 数据库模块单独抽取出来,方便使用!
Java
6
star
17

MNCustomCamera-iOS

自定义相机(拍摄指定区域)
Objective-C
4
star
18

MNBaseRecyclerViewAdapter

抽取BaseRecyclerViewAdapter,简化代码,支持添加头尾布局。
Java
4
star
19

MNGitHubStars-Android

归类自己GitHub标记的项目
4
star
20

MNHotFix

QQ空间热修复实践,动态添加dex文件,ASM插桩
Java
3
star
21

MNPickerView-iOS

iOS 滚轮选择器(时间选择和单项选择)
Objective-C
2
star
22

GankMM-WX

练手微信小程序:使用干货集中营的数据!
JavaScript
1
star
23

RobustDemo

美团robust热修复测试
Java
1
star
24

MNOkhttpUtils

okhttp 网络请求
Java
1
star