2023年11月26日发(作者:)

Android应⽤更新-⾃动检测版本及⾃动升级

步骤:

1.检测当前版本的信息-->manifest-->[Android]

更新

下载1

下载2

安装

下⾯介绍⼀下代码的实现:

1.获取应⽤的当前版本号,我是封装了⼀个⼯具类来获取

// 获取本版本号,是否更新

int vision = sion(this);

获取当前版本号⼯具类:

public class Tools {

/**

* 检查是否存在SDCard

*

* @return

*/

public static boolean hasSdcard() {

String state = ernalStorageState();

// 获取更新版本号

private void getVersion(final int vision) {

// {"data":{"content":"其他bug修复。","id":"2","api_key":"android",

// // "version":"2.1"},"msg":"获取成功","status":1}

String data = "";

//⽹络请求获取当前版本号和下载链接

//实际操作是从服务器获取

//demo写死了

String newversion = "2.1";//更新新的版本号

String content = "n" +

"就不告诉你我们更新了什么--n" +

"n" +

"----------万能的分割线-----------n" +

"n" +

"(o) 被⽼板打了⼀顿,还是来告诉你吧:n" +

"1.下架商品误买了?恩。。。我搞了点⼩动作就不会出现了n" +

"2.侧边栏、弹框优化 —— 这个你⾃⼰去探索吧,总得留点悬念嘛--n";//更新内容

String url = "/index/d/sid/3429345";//安装包下载地址

double newversioncode = Double

.parseDouble(newversion);

int cc = (int) (newversioncode);

n(newversion + "v" + vision + ",,"

+ cc);

if (cc != vision) {

if (vision < cc) {

n(newversion + "v"

+ vision);

// 版本号不同

ShowDialog(vision, newversion, content, url);

}

}

}

3.接下来就是下载⽂件了

/**

* 升级系统

*

* @param content

* @param url

*/

private void ShowDialog(int vision, String newversion, String content,

final String url) {

final MaterialDialog dialog = new MaterialDialog(this);

t(content).btnText("取消", "更新").title("版本更新 ")

.titleTextSize(15f).show();

celedOnTouchOutside(false);

tnClickL(new OnBtnClickL() {// left btn click listener

new r(this)

.setTitle("版本更新")

.setMessage(content)

.setPositiveButton("更新", new kListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

s();

pBar = new CommonProgressDialog();

celedOnTouchOutside(false);

le("正在下载");

tomTitle((

).inflate(

_dialog, null));

+ ponseCode() + " "

+ ponseMessage();

}

// this will be useful to display download percentage

protected void progress) {

ressUpdate(progress);

// if we get here, length is known, now set indeterminate to false

eterminate(false);

(100);

gress(progress[0]);

}

@Override

protected void onPostExecute(String result) {

e();

s();

if (result != null) {

// // 申请多个权限。⼤神的界⾯

// ()

// .requestCode(REQUEST_CODE_PERMISSION_OTHER)

@Override

public void onClick(DialogInterface dialog, int which) {

();

();

}

})

.show();

}

};

//----------------------------------SD权限----------------------------------//

@PermissionYes(REQUEST_CODE_PERMISSION_SD)

private void getMultiYes(List grantedPermissions) {

xt(this, e_post_succeed, _SHORT).show();

}

@PermissionNo(REQUEST_CODE_PERMISSION_SD)

private void getMultiNo(List deniedPermissions) {

xt(this, e_post_failed, _SHORT).show();

// ⽤户否勾选了不再提⽰并且拒绝了权限,那么提⽰⽤户到设置中授权。

if (aysDeniedPermission(this, deniedPermissions)) {

tSettingDialog(this, REQUEST_CODE_SETTING)

.setTitle(_dialog)

private void update() {

//安装应⽤

Intent intent = new Intent(_VIEW);

aAndType(le(new File(Environment

.getExternalStorageDirectory(), DOWNLOAD_NAME)),

"application/e-archive");

startActivity(intent);

}

Android 7.0 FileUriExposedException 的处理

发现问题

前⼏天把⼿机系统升级到基于 Android 7.0,后来在升级调试⼀个应⽤时抛出如下异常信息:

解决问题

官⽅给出的解决⽅式是通过 FileProvider 来为所共享的⽂件 Uri 添加临时权限,详细请看这⾥

标签下添加 FileProvider 节点

...>

...

android:name="ovider"

android:authorities="ovider"

android:exported="false"

android:grantUriPermissions="true">

android:name="_PROVIDER_PATHS"

android:resource="@xml/file_paths" />

...

androidauthority包名.fileprovider

属性指定要⽤于 FileProvider ⽣成的 content URI 的 URI 权限,这⾥推荐使⽤ 以确保其唯⼀性。

⼦元素指向⼀个 XML ⽂件,⽤于指定要共享的⽬录。

⽬录下创建⽂件 file_ 内容如下:

res/xml

cache/Android/data//cache/

表⽰应⽤程序内部存储⽬录下的 ⽬录,完整路径为

path

属性⽤于指定⼦⽬录。

nameAndroid/data//cache/app/apk

属性告诉 FileProvider 为 创建⼀个名为 的路径字段。

想要通过 FileProvider 为⽂件⽣成 content URI 只能在此处指定⽬录,以上⽰例就表⽰我将要共享 这个⽬

ernalFilesDir()

标签路径

ernalCacheDir()

完成以步骤后,我们修改出问题的代码如下:

/**

* 安装apk

*/

public static void installApk(Context context,String apkPath) {

if (y(apkPath)){

xt(context,"更新失败!未找到安装包", _SHORT).show();

return;

}

File apkFile = new File(apkPath

+ apkCacheName);

Intent intent = new Intent(_VIEW);

//Android 7.0 系统共享⽂件需要通过 FileProvider 添加临时权限,否则系统会抛出 FileUriExposedException .

if (_INT>=N_CODES.N){

gs(_GRANT_READ_URI_PERMISSION);

Uri contentUri = ForFile(context,"ovider",apkFile);

aAndType(contentUri,"application/e-archive");

}else {

gs(_ACTIVITY_NEW_TASK);