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

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

版本更新示例:

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

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.创建alertDialogbuilder. 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;
		}
	}
}

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值