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
xt(this, e_post_succeed, _SHORT).show();
}
@PermissionNo(REQUEST_CODE_PERMISSION_SD)
private void getMultiNo(List
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 添加临时权限,详细请看这⾥
在
...> ... android:name="ovider" android:authorities="ovider" android:exported="false" android:grantUriPermissions="true"> android:name="_PROVIDER_PATHS" android:resource="@xml/file_paths" /> ...
android:authority包名.fileprovider
属性指定要⽤于 FileProvider ⽣成的 content URI 的 URI 权限,这⾥推荐使⽤ 以确保其唯⼀性。
的 ⼦元素指向⼀个 XML ⽂件,⽤于指定要共享的⽬录。
在 ⽬录下创建⽂件 file_ 内容如下:
res/xml
表⽰应⽤程序内部存储⽬录下的 ⽬录,完整路径为 。
path
属性⽤于指定⼦⽬录。
nameAndroid/data//cache/app/apk
属性告诉 FileProvider 为 创建⼀个名为 的路径字段。
想要通过 FileProvider 为⽂件⽣成 content URI 只能在此处指定⽬录,以上⽰例就表⽰我将要共享 这个⽬
标签路径
完成以步骤后,我们修改出问题的代码如下:
/**
* 安装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);


发布评论