UpdateBiz 增加一个下载apk的方法
public class UpdateBiz {
public static final String TAG = "UpdateBiz";
public void downloadApk(final String apkUrl,Handler handler){
final RequestParams requestParams = new RequestParams(apkUrl);
//访问文件
String apkSavePath = "/mnt/sdcard/1.apk";
requestParams.setSaveFilePath(apkSavePath);
x.http().get(requestParams, new Callback.CommonCallback<File>() {
@Override
public void onSuccess(File result) {
Log.d(TAG,"success:"+result.getAbsolutePath());
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
Log.d(TAG,"error:"+ex.getMessage());
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
}
......
}
MeFragment中在弹出更新提示后,点击确定时,下载apk
public class MeFragment extends Fragment {
......
//biz发送通知 通知MeFragment显示版本
public static final int MSG_SHOW = 1;
//biz发送通知 通知MeFragment安装apk
public static final int MSG_INSTALL = 2;
public static final int MSG_ERROR = 3;
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
int msgId = msg.what;
Bundle bundle = msg.getData();
final VersionEntity versionEntity = (VersionEntity)bundle.getSerializable("versionEntity");
switch (msgId){
case MSG_SHOW:
//判断服务器上的版本是不是最新的
String currentVersion = null;
try {
currentVersion = Tools.getCurrentVersion(getActivity());
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
String serverApkVersion = versionEntity.data.version;
if(Double.parseDouble(serverApkVersion)>Double.parseDouble(currentVersion)){
//有最新的应用,显示Dialog
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(versionEntity.data.version+"\n"+versionEntity.data.app_android_update_content);
builder.setPositiveButton("升级", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Log.d(TAG,"升级地址:"+versionEntity.data.update_url);
UpdateBiz updateBiz = new UpdateBiz();
updateBiz.downloadApk(versionEntity.data.update_url,handler);
}
});
builder.setNegativeButton("取消",null);
builder.show();
}else {
Toast.makeText(getActivity(),"当前为最新应用,无需升级",Toast.LENGTH_SHORT).show();
}
break;
case MSG_INSTALL:
break;
case MSG_ERROR:
break;
}
}
};
......
}
点击升级后,即可下载应用
查看/mnt/sdcard目录下已经有了1.apk
记得给存储权限,并且手机打开该权限
下载成功后,发送通知进行安装
public class UpdateBiz {
public static final String TAG = "UpdateBiz";
public void downloadApk(final String apkUrl, final Handler handler){
final RequestParams requestParams = new RequestParams(apkUrl);
//访问文件
final String apkSavePath = "/mnt/sdcard/1.apk";
File apkFile = new File(apkSavePath);
if(apkFile.exists()){
apkFile.delete();
}
requestParams.setSaveFilePath(apkSavePath);
x.http().get(requestParams, new Callback.CommonCallback<File>() {
@Override
public void onSuccess(File result) {
Log.d(TAG,"success:"+result.getAbsolutePath());
Message message = handler.obtainMessage();
message.what = MeFragment.MSG_INSTALL;
Bundle bundle = new Bundle();
bundle.putString("apkSavePath",apkSavePath);
message.setData(bundle);
handler.sendMessage(message);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
Log.d(TAG,"error:"+ex.getMessage());
Message message = handler.obtainMessage();
message.what = MeFragment.MSG_ERROR;
handler.sendMessage(message);
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
}
......
}
MeFragment处理消息
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
int msgId = msg.what;
Bundle bundle = msg.getData();
final VersionEntity versionEntity = (VersionEntity)bundle.getSerializable("versionEntity");
switch (msgId){
case MSG_SHOW:
......
break;
case MSG_INSTALL:
String apkSavePath = bundle.getString("apkSavePath");
//android中有安装apk的activity
Intent intent = new Intent(Intent.ACTION_VIEW);
File apkFile = new File(apkSavePath);
Uri uri = Uri.fromFile(apkFile);
String type = "application/vnd.android.package-archive";
intent.setDataAndType(uri,type);
startActivity(intent);
break;
case MSG_ERROR:
break;
}
}
};
坑
1、SD卡位置
由于sd卡位置可能不同,有可能是/mnt/sdcard/
或者/storage/sdcard0/
所以不能写死,所以UpdateBiz中获取SD卡位置应改为如下代码
String sdcardRoot = Environment.getExternalStorageDirectory().getAbsolutePath();
final String apkSavePath = sdcardRoot+"/1.apk";
2、Android7.0安装apk
Android 7.0以下版本程序是可以正常执行的:
点击更新,弹出对话框提示更新
然后点击更新,开始下载最新apk
下载完之后,打开安装界面
但是7.0系统有些不同,可能会报错,解决办法如下:
xx.apk exposed beyond app through Intent.getData()
3、Android 8.0安装apk
你以为这就完了么…如果在8.0运行程序,可能会这样执行:
点击更新,弹出对话框提示更新
然后点击更新,开始下载最新apk
下载完之后,应该自动安装,结果你发现界面一闪而过,就没有然后了…
解决办法如下:
Package xxx is currently frozen