您的位置:首页 > 移动开发

APP版本更新(兼容6.0,7.0系统)

2017-10-11 14:56 465 查看
本人不会写博客,就会代码。。。见谅

版本更新示例:

一。判断版本是否需要更新

int REQUEST_EXTERNAL_STORAGE = 1;
String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
int permission = ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE);

if (permission != PackageManager.PERMISSION_GRANTED) {
// We don't have permission so prompt the user
ActivityCompat.requestPermissions(
MainActivity.this,
PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE
);
}
//判断返回的版本号与系统版本号是否一致 如果一直 UPDATA_NONEED 否则 UPDATA_CLIENT
 if (versionResult.getVersionShort().equals(Tools.getVersion(MainActivity.this))) {
Message msg = new Message();
msg.what = UPDATA_NONEED;
msg.obj="更新版本:"+versionResult.getVersionShort()+"\n"+"当前版本:"+Tools.getVersion(MainActivity.this);
mhHandler.sendMessage(msg);
} else {
Message msg2 = new Message();
msg2.what = UPDATA_CLIENT;
JSONObject jsonObject=new JSONObject();
try {
jsonObject.put("versionInfo","更新版本:"+versionResult.getVersionShort()+"\n"+"当前版本:"+Tools.getVersion(MainActivity.this));
jsonObject.put("intenturl",versionResult.getInstallUrl());
} catch (JSONException e) {
e.printStackTrace();
}
msg2.obj = jsonObject.toString();
mhHandler.sendMessage(msg2);
}

二、mhHandler 设置

Handler mhHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case UPDATA_NONEED:
/**/
//                    Tools.showToast(MainActivity.this, getString(R.string.toast_3));
break;
case UPDATA_CLIENT:
// 对话框通知用户升级程序
String updateInfo = msg.obj.toString();
try {
JSONObject jsonObject=new JSONObject(updateInfo);
showUpdataDialog(jsonObject.getString("intenturl"),jsonObject.getString("versionInfo"));
} catch (JSONException e) {
e.printStackTrace();
}

break;
case GET_UNDATAINFO_ERROR:
//                    Tools.showToast(MainActivity.this, getString(R.string.toast_4));
break;
case DOWN_ERROR:
String errormsg=msg.obj.toString();
Tools.showToast(MainActivity.this, getString(R.string.toast_4)+"错误信息:"+errormsg);
break;
}
}
};

三、showUpdataDialog 方法

/*
*
* 弹出对话框通知用户更新程序
*
* 弹出对话框的步骤: 1.创建alertDialog的builder. 2.要给builder设置属性, 对话框的内容,样式,按钮
* 3.通过builder 创建一个对话框 4.对话框show()出来
*/
protected void showUpdataDialog(final String fileurl,final String message) {
AlertDialog.Builder builer = new AlertDialog.Builder(this);
builer.setTitle("版本升级");
builer.setMessage(message);
//        builer.setMessage(getResources().getString(R.string.version_content));
// 当点确定按钮时从服务器上下载 新的apk 然后安装 װ
builer.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
//System.out.println("下载更新apk");
downLoadApk(fileurl);
}
});
builer.setNegativeButton("取消", null);
AlertDialog dialog = builer.create();
dialog.show();
}

四、downLoadApk方法

/*
* 从服务器中下载APK
*/
private final int UPDATA_NONEED = 100;// 版本号相同,不需要更新
private final int UPDATA_CLIENT = 200;// 版本不同,需要更新
private final int GET_UNDATAINFO_ERROR = 404;// 版本更新失败
private final int DOWN_ERROR = 300;// 下载失败
protected void downLoadApk(final String fileurl) {

final ProgressDialog pd; // 进度条对话框
pd = new ProgressDialog(this);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMessage("正在下载更新");
pd.show();
new Thread() {
@Override
public void run() {
try {

File file = DownLoadManager.getFileFromServer(fileurl, pd);
if (file!=null){
sleep(3000);
installApkFile(file,"包名");
pd.dismiss(); // 结束掉进度条对话框
}else{
Tools.showToast(MainActivity.this,"网络出错,请稍后再试");
pd.dismiss();
}
} catch (Exception e) {
Message msg = new Message();
msg.what = DOWN_ERROR;
msg.obj=e.getMessage();
mhHandler.sendMessage(msg);
e.printStackTrace();

}
}
}.start();
}

五、installApkFile 方法

private void installApkFile(File apkFille,String packagename){
// 由于没有在Activity环境下启动Activity,设置下面的标签
if(Build.VERSION.SDK_INT>=24) {//判读版本是否在7.0以上

Uri apkUri = FileProvider.getUriForFile(this, packagename, apkFille);//在AndroidManifest中的android:authorities值
Intent install = new Intent(Intent.ACTION_VIEW);
install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//添加这一句表示对目标应用临时授权该Uri所代表的文件
install.setDataAndType(apkUri, "application/vnd.android.package-archive");
startActivity(install);
} else{
Intent install = new Intent(Intent.ACTION_VIEW);
install.setDataAndType(Uri.fromFile(apkFille), "application/vnd.android.package-archive");
install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(install);
}

}

六、android 6.0之后动态权限

调用:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// 检查该权限是否已经获取
int i = ContextCompat.checkSelfPermission(this, permissions[0]);
int f = ContextCompat.checkSelfPermission(this, permissions[1]);
// 权限是否已经 授权 GRANTED---授权  DINIED---拒绝
if (i != PackageManager.PERMISSION_GRANTED) {
// 如果没有授予该权限,就去提示用户请求
showDialogTipUserRequestPermission();
}else if(f!=PackageManager.PERMISSION_GRANTED){
showDialogTipUserRequestPermissionf();
}
}

配置

private void showDialogTipUserRequestPermission() {
new AlertDialog.Builder(this)
.setTitle("系统的服务信息权限不可用")
.setMessage("由于需要获取系统的服务信息,为你显示基站信息;\n否则,您将无法正常使用本程序")
.setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startRequestPermission();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
}).setCancelable(false).show();
}
private void showDialogTipUserRequestPermissionf() {
new AlertDialog.Builder(this)
.setTitle("sd卡储存权限不可用")
.setMessage("由于需要sd卡储存功能;\n否则,您将无法正常使用本程序")
.setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startRequestPermission();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
}).setCancelable(false).show();
}

// 开始提交请求权限
private void startRequestPermission() {
ActivityCompat.requestPermissions(this, permissions, 321);
}

// 用户权限 申请 的回调方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);

if (requestCode == 321) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
// 判断用户是否 点击了不再提醒。(检测该权限是否还可以申请)
boolean b = shouldShowRequestPermissionRationale(permissions[0]);
if (!b) {
// 用户还是想用我的 APP 的
// 提示用户去应用设置界面手动开启权限
showDialogTipUserGoToAppSettting();
} else
finish();
} else {
Toast.makeText(this, "权限获取成功", Toast.LENGTH_SHORT).show();
}
}
}
}

// 提示用户去应用设置界面手动开启权限

private void showDialogTipUserGoToAppSettting() {

dialog = new AlertDialog.Builder(this)
.setTitle("系统的服务信息权限不可用")
.setMessage("请在-应用设置-权限-中,允许使用系统的服务信息权限")
.setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 跳转到应用设置界面
goToAppSetting();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
}).setCancelable(false).show();
}

// 跳转到当前应用的设置界面
private void goToAppSetting() {
Intent intent = new Intent();

intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);

startActivityForResult(intent, 123);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 123) {

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// 检查该权限是否已经获取
int i = ContextCompat.checkSelfPermission(this, permissions[0]);
// 权限是否已经 授权 GRANTED---授权  DINIED---拒绝
if (i != PackageManager.PERMISSION_GRANTED) {
// 提示用户应该去应用设置界面手动开启权限
showDialogTipUserGoToAppSettting();
} else {
if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
}
Toast.makeText(this, "权限获取成功", Toast.LENGTH_SHORT).show();
}
}
}
}
下面是完整代码 仅供参考

package jane.android.performancegz;
import android.Manifest;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.FileProvider;
import android.widget.RadioButton;
import android.widget.RelativeLayout;
import android.widget.Toast;

import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import butterknife.Unbinder;
import jane.android.performancegz.fragment.BaseFragment;
import jane.android.performancegz.fragment.FragmentAddress;
import jane.android.performancegz.fragment.FragmentMy;
import jane.android.performancegz.fragment.FragmentNet;
import jane.android.performancegz.fragment.FragmentSence;
import jane.android.performancegz.fragment.FragmentVillage;
import jane.android.performancegz.fragment.FragmentVolte;
import jane.android.performancegz.url.Contacts;
import jane.android.performancegz.utils.Tools;
import jane.android.performancegz.version.DownLoadManager;
import jane.android.performancegz.version.IVersionView;
import jane.android.performancegz.version.VerUpdatePresenter;
import jane.android.performancegz.version.VersionResult;
public class MainActivity extends FragmentActivity implements IVersionView {
@BindView(R.id.rela_village)
RelativeLayout rela_village;
@BindView(R.id.rela_city)
RelativeLayout rela_city;
@BindView(R.id.rela_sence)
RelativeLayout rela_sence;
@BindView(R.id.rela_net)
RelativeLayout rela_net;
@BindView(R.id.rela_my)
RelativeLayout rela_my;
@BindView(R.id.rela_volte)
RelativeLayout rela_volte;
@BindView(R.id.rb_village)
RadioButton rbVillage;
@BindView(R.id.rb_city)
RadioButton rbCity;
@BindView(R.id.rb_sence)
RadioButton rbSence;
@BindView(R.id.rb_net)
RadioButton rbNet;
@BindView(R.id.rb_my)
RadioButton rbMy;
@BindView(R.id.rb_volte)
RadioButton rb_volte;
private FragmentManager fragmentManager;
private Fragment currentFragment;
private List<BaseFragment> fragmentList = new ArrayList<>();
FragmentVillage fragmentVillage;
FragmentAddress fragmentAddress;
FragmentSence fragmentSence;
FragmentNet fragmentNet;
FragmentMy fragmentMy;
FragmentVolte fragmentVolte;
private int index = 0;
private static final String SHOW_FRAGMENT = "SHOW_FRAGMENT";
Unbinder unbinder;
ProgressDialog progressDialog;
VerUpdatePresenter verPresenter;
//6.0以上动态权限申请
private AlertDialog dialog;
private String[] permissions = {Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
unbinder = ButterKnife.bind(this);
fragmentManager = getSupportFragmentManager();
verPresenter = new VerUpdatePresenter(this);
initview();
update_version();
//内存重启的时候调用
if (savedInstanceState != null) {
//获取“内存重启”时保存的索引下标
index = savedInstanceState.getInt(SHOW_FRAGMENT, 0);
//重新给五个fragment赋值
fragmentVillage = (FragmentVillage) fragmentManager.findFragmentByTag(FragmentVillage.class.getName());
fragmentAddress = (FragmentAddress) fragmentManager.findFragmentByTag(FragmentAddress.class.getName());
fragmentSence = (FragmentSence) fragmentManager.findFragmentByTag(FragmentSence.class.getName());
fragmentNet = (FragmentNet) fragmentManager.findFragmentByTag(FragmentNet.class.getName());
fragmentMy = (FragmentMy) fragmentManager.findFragmentByTag(FragmentMy.class.getName());
fragmentVolte=(FragmentVolte)fragmentManager.findFragmentByTag(FragmentVolte.class.getName());
fragmentList.clear();
fragmentList.add(fragmentAddress);
fragmentList.add(fragmentVillage);
fragmentList.add(fragmentVolte);
fragmentList.add(fragmentSence);
fragmentList.add(fragmentNet);
fragmentList.add(fragmentMy);

//显示隐藏fragment
reNewFragment();
} else {
//正常启动时调用
showFragment(fragmentAddress);
}
if (savedInstanceState != null) {
String FRAGMENTS_TAG = "Android:support:fragments";
savedInstanceState.remove(FRAGMENTS_TAG);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 检查该权限是否已经获取 int i = ContextCompat.checkSelfPermission(this, permissions[0]); int f = ContextCompat.checkSelfPermission(this, permissions[1]); // 权限是否已经 授权 GRANTED---授权 DINIED---拒绝 if (i != PackageManager.PERMISSION_GRANTED) { // 如果没有授予该权限,就去提示用户请求 showDialogTipUserRequestPermission(); }else if(f!=PackageManager.PERMISSION_GRANTED){ showDialogTipUserRequestPermissionf(); } }
}

private void initview() {
fragmentMy = new FragmentMy();
fragmentSence = new FragmentSence();
fragmentNet = new FragmentNet();
fragmentAddress = new FragmentAddress();
fragmentVillage = new FragmentVillage();
fragmentVolte=new FragmentVolte();
}

private void update_version() {
Map<String, Object> map = new HashMap<>();
map.put("api_token", Contacts.VERSION_TOKEN);
verPresenter.updateVer(Contacts.VERSION_UPDATE + Contacts.VERSION_ID, map);
}
private void showDialogTipUserRequestPermission() {
new AlertDialog.Builder(this)
.setTitle("系统的服务信息权限不可用")
.setMessage("由于需要获取系统的服务信息,为你显示基站信息;\n否则,您将无法正常使用本程序")
.setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startRequestPermission();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
}).setCancelable(false).show();
}
private void showDialogTipUserRequestPermissionf() {
new AlertDialog.Builder(this)
.setTitle("sd卡储存权限不可用")
.setMessage("由于需要sd卡储存功能;\n否则,您将无法正常使用本程序")
.setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startRequestPermission();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
}).setCancelable(false).show();
}

// 开始提交请求权限
private void startRequestPermission() {
ActivityCompat.requestPermissions(this, permissions, 321);
}

// 用户权限 申请 的回调方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);

if (requestCode == 321) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
// 判断用户是否 点击了不再提醒。(检测该权限是否还可以申请)
boolean b = shouldShowRequestPermissionRationale(permissions[0]);
if (!b) {
// 用户还是想用我的 APP 的
// 提示用户去应用设置界面手动开启权限
showDialogTipUserGoToAppSettting();
} else
finish();
} else {
Toast.makeText(this, "权限获取成功", Toast.LENGTH_SHORT).show();
}
}
}
}

// 提示用户去应用设置界面手动开启权限

private void showDialogTipUserGoToAppSettting() {

dialog = new AlertDialog.Builder(this)
.setTitle("系统的服务信息权限不可用")
.setMessage("请在-应用设置-权限-中,允许使用系统的服务信息权限")
.setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 跳转到应用设置界面
goToAppSetting();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
}).setCancelable(false).show();
}

// 跳转到当前应用的设置界面
private void goToAppSetting() {
Intent intent = new Intent();

intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);

startActivityForResult(intent, 123);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 123) {

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// 检查该权限是否已经获取
int i = ContextCompat.checkSelfPermission(this, permissions[0]);
// 权限是否已经 授权 GRANTED---授权 DINIED---拒绝
if (i != PackageManager.PERMISSION_GRANTED) {
// 提示用户应该去应用设置界面手动开启权限
showDialogTipUserGoToAppSettting();
} else {
if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
}
Toast.makeText(this, "权限获取成功", Toast.LENGTH_SHORT).show();
}
}
}
}

//小区
@OnClick({R.id.rela_village, R.id.rela_city, R.id.rela_sence, R.id.rela_net, R.id.rela_my,R.id.rela_volte})
public void btn_village_click(RelativeLayout relaLayout) {
switch (relaLayout.getId()) {
case R.id.rela_city:
index = 0;
showFragment(fragmentAddress);
changeState(true, false, false, false, false,false);
break;
case R.id.rela_village:
index = 1;
showFragment(fragmentVillage);
changeState(false, true, false, false, false,false);
break;
case R.id.rela_sence:
index = 3;
showFragment(fragmentSence);
changeState(false, false, true, false, false,false);
break;
case R.id.rela_net:
index = 4;
showFragment(fragmentNet);
changeState(false, false, false, true, false,false);
break;
case R.id.rela_my:
index = 5;
showFragment(fragmentMy);
changeState(false, false, false, false, true,false);
break;
case R.id.rela_volte:
index = 2;
showFragment(fragmentVolte);
changeState(false, false, false, false, false,true);
break;
}
}

@Override
protected void onSaveInstanceState(Bundle outState) {
//内存重启时保存fragment对应的下标
outState.putInt(SHOW_FRAGMENT, index);
super.onSaveInstanceState(outState);
}

//改变RadioButton的状态
private void changeState(boolean cityB, boolean villageB, boolean senceB, boolean netB, boolean MyB,boolean VolteB) {
rbCity.setChecked(cityB);
rbVillage.setChecked(villageB);
rbSence.setChecked(senceB);
rbNet.setChecked(netB);
rbMy.setChecked(MyB);
rb_volte.setChecked(VolteB);
}

//内存重启后显示和隐藏framgent
private void reNewFragment() {

FragmentTransaction ft = fragmentManager.beginTransaction();

for (int x = 0; x < fragmentList.size(); x++) {
if (x == index) {
ft.show(fragmentList.get(x));
} else {
ft.hide(fragmentList.get(x));
}
}

ft.commit();

//记录当前显示的fragment
currentFragment = fragmentList.get(index);
}

// 显示选中的 Fragment
private void showFragment(BaseFragment bfg) {

if (bfg == null) {
return;
}

FragmentTransaction ft = fragmentManager.beginTransaction();

//如果当前的fragment已经添加,直接显示当前的fragmnet
if (bfg.isAdded()) {
ft.show(bfg);
} else {//否则添加当前的fragment
ft.add(R.id.fragment_container, bfg, bfg.getClass().getName());//第三个参数是绑定一个tag,tag是当前fragment的类名(内存重启时调用)
}

//如果当前的fragment不为空
if (currentFragment != null) {
//并且和传入的fragment相同直接显示
if (currentFragment == bfg) {
ft.show(bfg);
} else {
//否则隐藏
ft.hide(currentFragment);
}
}
ft.commit();
currentFragment = bfg;
}

@Override
public void showLoading() {
progressDialog = Tools.showLoading(MainActivity.this, getString(R.string.loading));
}

@Override
public void hideLoading() {
progressDialog.dismiss();
}

@Override
public void showFail() {
Tools.showToast(MainActivity.this, getString(R.string.loading_error));
}

@Override
public void updateVersion(VersionResult versionResult) {
int REQUEST_EXTERNAL_STORAGE = 1;
String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
int permission = ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE);

if (permission != PackageManager.PERMISSION_GRANTED) {
// We don't have permission so prompt the user
ActivityCompat.requestPermissions(
MainActivity.this,
PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE
);
}
if (versionResult.getVersionShort().equals(Tools.getVersion(MainActivity.this))) {
Message msg = new Message();
msg.what = UPDATA_NONEED;
msg.obj="更新版本:"+versionResult.getVersionShort()+"\n"+"当前版本:"+Tools.getVersion(MainActivity.this);
mhHandler.sendMessage(msg);
} else {
Message msg2 = new Message();
msg2.what = UPDATA_CLIENT;
JSONObject jsonObject=new JSONObject();
try {
jsonObject.put("versionInfo","更新版本:"+versionResult.getVersionShort()+"\n"+"当前版本:"+Tools.getVersion(MainActivity.this));
jsonObject.put("intenturl",versionResult.getInstallUrl());
} catch (JSONException e) {
e.printStackTrace();
}
msg2.obj = jsonObject.toString();
mhHandler.sendMessage(msg2);
}
}

/*
*
* 弹出对话框通知用户更新程序
*
* 弹出对话框的步骤: 1.创建alertDialog的builder. 2.要给builder设置属性, 对话框的内容,样式,按钮
* 3.通过builder 创建一个对话框 4.对话框show()出来
*/
protected void showUpdataDialog(final String fileurl,final String message) {
AlertDialog.Builder builer = new AlertDialog.Builder(this);
builer.setTitle("版本升级");
builer.setMessage(message);
// builer.setMessage(getResources().getString(R.string.version_content));
// 当点确定按钮时从服务器上下载 新的apk 然后安装 װ
builer.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
//System.out.println("下载更新apk");
downLoadApk(fileurl);
}
});
builer.setNegativeButton("取消", null);
AlertDialog dialog = builer.create();
dialog.show();
}
/*
* 从服务器中下载APK
*/
private final int UPDATA_NONEED = 100;// 版本号相同,不需要更新
private final int UPDATA_CLIENT = 200;// 版本不同,需要更新
private final int GET_UNDATAINFO_ERROR = 404;// 版本更新失败
private final int DOWN_ERROR = 300;// 下载失败
protected void downLoadApk(final String fileurl) {

final ProgressDialog pd; // 进度条对话框
pd = new ProgressDialog(this);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMessage("正在下载更新");
pd.show();
new Thread() {
@Override
public void run() {
try {

File file = DownLoadManager.getFileFromServer(fileurl, pd);
if (file!=null){
sleep(3000);
installApkFile(file,"jane.android.performancegz");
pd.dismiss(); // 结束掉进度条对话框
}else{
Tools.showToast(MainActivity.this,"网络出错,请稍后再试");
pd.dismiss();
}
} catch (Exception e) {
Message msg = new Message();
msg.what = DOWN_ERROR;
msg.obj=e.getMessage();
mhHandler.sendMessage(msg);
e.printStackTrace();

}
}
}.start();
}
private void installApkFile(File apkFille,String packagename){ // 由于没有在Activity环境下启动Activity,设置下面的标签 if(Build.VERSION.SDK_INT>=24) {//判读版本是否在7.0以上 Uri apkUri = FileProvider.getUriForFile(this, packagename, apkFille);//在AndroidManifest中的android:authorities值 Intent install = new Intent(Intent.ACTION_VIEW); install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//添加这一句表示对目标应用临时授权该Uri所代表的文件 install.setDataAndType(apkUri, "application/vnd.android.package-archive"); startActivity(install); } else{ Intent install = new Intent(Intent.ACTION_VIEW); install.setDataAndType(Uri.fromFile(apkFille), "application/vnd.android.package-archive"); install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(install); } }
Handler mhHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case UPDATA_NONEED:
/**/
// Tools.showToast(MainActivity.this, getString(R.string.toast_3));
break;
case UPDATA_CLIENT:
// 对话框通知用户升级程序
String updateInfo = msg.obj.toString();
try {
JSONObject jsonObject=new JSONObject(updateInfo);
showUpdataDialog(jsonObject.getString("intenturl"),jsonObject.getString("versionInfo"));
} catch (JSONException e) {
e.printStackTrace();
}

break;
case GET_UNDATAINFO_ERROR:
// Tools.showToast(MainActivity.this, getString(R.string.toast_4));
break;
case DOWN_ERROR:
String errormsg=msg.obj.toString();
Tools.showToast(MainActivity.this, getString(R.string.toast_4)+"错误信息:"+errormsg);
break;
}
}
};

@Override
protected void onDestroy() {
unbinder.unbind();
super.onDestroy();
}
}


下面是 下载管理类:

package jane.android.performancegz.version;

import android.app.ProgressDialog;
import android.os.Environment;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class DownLoadManager {
public static File getFileFromServer(String path, ProgressDialog pd) throws Exception{
//如果相等的话表示当前的sdcard挂载在手机上并且是可用的

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
//获取到文件的大小
pd.setMax(conn.getContentLength());
InputStream is = conn.getInputStream();
File file = new File(Environment.getExternalStorageDirectory(), "updata.apk");
FileOutputStream fos = new FileOutputStream(file);
BufferedInputStream bis = new BufferedInputStream(is);
byte[] buffer = new byte[1024];
int len ;
int total=0;
while((len =bis.read(buffer))!=-1){
fos.write(buffer, 0, len);
total+= len;
//获取当前下载量
pd.setProgress(total);
}
fos.close();
bis.close();
is.close();
return file;
}
else{
return null;
}
}
}

以上是版本更新 下载的 有关代码 写的不好,欢迎各位博友提出意见,本人虚心学习 改进
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: