本人不会写博客,就会代码。。。见谅

版本更新示例:

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

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};@Overrideprotected 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);//显示隐藏fragmentreNewFragment();} 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() {@Overridepublic void onClick(DialogInterface dialog, int which) {startRequestPermission();}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic 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() {@Overridepublic void onClick(DialogInterface dialog, int which) {startRequestPermission();}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {finish();}}).setCancelable(false).show();}// 开始提交请求权限private void startRequestPermission() {ActivityCompat.requestPermissions(this, permissions, 321);}// 用户权限 申请 的回调方法@Overridepublic 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();} elsefinish();} else {Toast.makeText(this, "权限获取成功", Toast.LENGTH_SHORT).show();}}}}// 提示用户去应用设置界面手动开启权限private void showDialogTipUserGoToAppSettting() {dialog = new AlertDialog.Builder(this).setTitle("系统的服务信息权限不可用").setMessage("请在-应用设置-权限-中,允许使用系统的服务信息权限").setPositiveButton("立即开启", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// 跳转到应用设置界面goToAppSetting();}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic 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);}@Overrideprotected 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;}}@Overrideprotected 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);}//内存重启后显示和隐藏framgentprivate 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();//记录当前显示的fragmentcurrentFragment = fragmentList.get(index);}// 显示选中的 Fragmentprivate void showFragment(BaseFragment bfg) {if (bfg == null) {return;}FragmentTransaction ft = fragmentManager.beginTransaction();//如果当前的fragment已经添加,直接显示当前的fragmnetif (bfg.isAdded()) {ft.show(bfg);} else {//否则添加当前的fragmentft.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;}@Overridepublic void showLoading() {progressDialog = Tools.showLoading(MainActivity.this, getString(R.string.loading));}@Overridepublic void hideLoading() {progressDialog.dismiss();}@Overridepublic void showFail() {Tools.showToast(MainActivity.this, getString(R.string.loading_error));}@Overridepublic 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 userActivityCompat.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() {@Overridepublic 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;}}};@Overrideprotected 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;}}
}

以上是版本更新 下载的 有关代码 写的不好,欢迎各位博友提出意见,本人虚心学习 改进

APP版本更新(兼容6.0,7.0系统)相关推荐

  1. 解密Android7.0 8.0进程保活与拉活的实现方式 如何才能让APP常驻内存 躲避系统的追杀

    进程保活 前言 APP进程被系统杀死 Low Memory Killer 进程优先级 进程保活 1px Activity 前台Service 进程拉活 粘性Service JobScheduler 双 ...

  2. Android 6.0 7.0 8.0 一个简单的app内更新版本-okgo app版本更新

    登陆时splash初始页调用接口检查app版本.如有更新,使用okGo的文件下载,保存到指定位置,调用Android安装apk. <!-- Android 8.0 (Android O)为了针对 ...

  3. android 11.0 12.0第三方输入法app设置系统默认输入法

    1.概述 在11.0 12.0的产品开发中,有功能需要要求设置默认输入法,替换掉系统的输入法,所以这就需要了解设置 输入法的相关功能需求,然后根据输入法包名来设置默认输入法 2.第三方输入法app设置 ...

  4. Android 11.0 12.0在系统app安装第三方app弹出 解析安装包出现问题 的解决方案

    1.概述 在11.0 12.0的系统定制化开发中,对于系统内置app中用代码调用系统安装接口安装app时抛出Permission Denial: that is not exported from U ...

  5. 红旗linux操作系统+v8.0,红旗Linux操作系统 v8.0 ,和微软的操作系统一样吗?红旗也是操作系统吗?红旗可以兼容现在安装在微软系统上的软件吗?有人用过红旗吗?...

    红旗Linux操作系统 v8.0 ,和微软的操作系统一样吗?红旗也是操作系统吗?红旗可以兼容现在安装在微软系统上的软件吗?有人用过红旗吗? 更新时间:2019-03-17 03:23 最满意答案 1. ...

  6. 探讨Android6.0及以上系统APP常驻内存(保活)实现-争宠篇

    探讨Android6.0及以上系统APP常驻内存(保活)实现-争宠篇 (转载请声明出处:http://blog.csdn.net/andrexpert/article/details/75045678 ...

  7. 小米鸿蒙os2.0,HarmonyOS 2.0鸿蒙app预约下载-鸿蒙os(手机系统)2.0小米版预约下载_全球下载...

    <华为鸿蒙os2.0小米版>是一款非常的厉害而且强大的手机适配功能的系统软件,在这款软件之中来通过这个系统获得更多的华为的智能化的服务以及帮助,来让国人来感受到国家科技的强大之处.也让更多 ...

  8. Android 系统(80)---Android 8.0 7.0 6.0 动态权限管理

    Android 8.0 7.0 6.0 动态权限管理 1.Android6.0之后运行时权限策略变化 从Android6.0(API23)开始,对系统权限做了很大的改变,在之前用户安装app前,只是把 ...

  9. big sur darwin6.iso下载_苹果macOS Big Sur 11.0 正式版系统适配机型 附升级教程和系统镜像下载...

    新版 macOS 采用了全新的设计风格,通知中心.小组件以及多个系统应用的界面都与 iPadOS 更加接近,系统对于隐私的保护也像往年一样进一步增强,还有短信.音乐的应用也获得了重新设计等. 包括 M ...

最新文章

  1. 用递归方法对二叉树进行先序、中序和后序遍历
  2. 神舟笔记本电源管理软件_笔记本电脑是一直插着电源好,还是拔了电源好?
  3. centos6.5 安装python3.5
  4. api es7 删除所有数据_【Elasticsearch7.0】文档接口之查询delete接口
  5. Go实现 爬虫v0.1
  6. Javascript位置 body之前、后执行顺序
  7. git详细使用教程入门到精通(史上最全的git教程)
  8. 模板的实例化和具体化
  9. 3D变形tranform(附实例、图解)
  10. 【电机测速】M法、T法、M/T法测速系统设计实现
  11. 小白也能通俗易懂的Mac环境变量配置教程
  12. 什么是SPU、SKU、ARPU
  13. 2021水利水电安全员考试每日一练单选题库
  14. Golang学习日志 ━━ 调用系统默认浏览器打开指定链接(全平台)
  15. springboot+vue在线答疑系统(源码+说明文档)
  16. MySQL死锁套路:一次诡异的批量插入死锁问题分析
  17. 解决Flutter键盘弹起导致与输入框有间距问题(Flutter键盘弹起Scaffold布局流程)解析
  18. opentstack使用keypair文件登陆实例
  19. Isight9.0 desc文件解析
  20. 重组的脱氧核糖核酸酶 I,生物工艺级相关研究

热门文章

  1. Java操作Neo4J就是这么简单,#yyds盘点#
  2. JavaWeb学习第二十七天——项目实例
  3. 世界4个头号Linux认证浅析
  4. 今天你对我爱搭不理,明天我让你高攀不起
  5. 2023秋招--腾讯天美--游戏客户端--三面面经
  6. iClient for Leaflet解决地图放大问题
  7. 双麦克风语音增强之ANF 自适应零点形成
  8. 埃森哲董事长兼首席执行官南佩德因健康原因离任
  9. “元宇宙”,究竟离我们有多远?(下)
  10. 使用Three.js在浏览器绘制OFF格式的3D文件