Android学习我爱编程

安卓的更新功能

2018-04-11  本文已影响0人  心中有梦丶身边有你

本次主要实现的是安卓的自动更新功能,我把它放在了SpalshActivity中。 代码里会有注释。有什么不对的欢迎留言指正.。

package com.py.massiou.activity;

import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.v4.content.FileProvider;
import android.util.Log;

import com.py.massiou.R;
import com.py.massiou.base.BaseActivity;
import com.py.massiou.base.Constants;
import com.squareup.okhttp.Request;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.FileCallBack;
import com.zhy.http.okhttp.callback.StringCallback;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.File;

public class SpalshActivity extends BaseActivity {

    public String mLocalVersionName = "";//定义当前的APP版本号
    private ProgressDialog mDialog;//下载更新的进度条提示框

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        try {
            //获取软件版本号,对应AndroidManifest.xml下android:versionCode
            mLocalVersionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }

      //这里是请求后台接口,获取服务器上传的APP版本号,然后调用checkversion方法,用本地的和后台的服务器版本做对比,如果版本不一样就提示更新
        OkHttpUtils.post()
                .url(Constants.BASEURL)
                .addParams("type", "0")
                .build().execute(new StringCallback() {
            @Override
            public void onError(Request request, Exception e) {}

            @Override
            public void onResponse(String response) {
                Log.i("..SpalshActivity", "60_onResponse: " + response);
                checkVersion(obj.getString("versionName"));//传入后台的版本号,对比
            }
        });
    }

    public void checkVersion(String netVersionName) {
        Log.i("..SplashActivity65", "checkVersion: " + netVersionName + " ==  " + mLocalVersionName);

        if (!mLocalVersionName.equals(netVersionName)) {
            new AlertDialog.Builder(this)
                    .setMessage("发现新版本,需要更新")
                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            finish();
                        }
                    })
                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            loadNewVersion();
                        }
                    }).show();
        } else {
  
          }
        } 

    private void loadNewVersion() {
        String url = "http://www.baidu.com/Content/android.apk";//这里是链接文件的地址
        mDialog = new ProgressDialog(SpalshActivity.this);
        mDialog.setMax(100);
        mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        mDialog.show();
        Log.i("..SpalshActivity", "111_loadNewVersion: ");
        OkHttpUtils.get().url(url).build()
                .execute(new FileCallBack(getExternalCacheDir().getAbsolutePath(), "newapp.apk") {
                    @Override
                    public void inProgress(float progress) {
                      //进度条的更新
                        mDialog.setProgress((int) (100 * progress));
                    }
                    @Override
                    public void onError(Request request, Exception e) {
                        Log.i("..MainActivity33", "onError: ");
                    }
                    @Override
                    public void onResponse(File response) {
                        //下载完毕之后走这个方法,安装应用
                        installAPK(SpalshActivity.this, response);
                        mDialog.dismiss();
                    }
                });
    }

    /**
     * 安装应用,兼容7.0
     */
    private void installAPK(Context mContext, File file) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            Uri apkUri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".fileprovider", file);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
        } else {
            intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
        }
        mContext.startActivity(intent);
    }

在androidManifest清单文件中添加更新的内容提供者

<!--安装更新的内容提供者-->
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.py.massiou.fileprovider" //你的包名
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths"/> 
        </provider>

xml的file_paths文件

![image.png](https://img.haomeiwen.com/i3499890/0c864d8489fdc6b0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name = "my_images" path = ""/>
</paths>

以上便是此次的自动更新的代码了。当然如果你想要手动检查更新的话,比这个要简单多了。只需要点击的时候让他跳转到你下载apk的地址就可以了。

安卓8.0安装apk需要再Manifiest中添加权限

<!--安卓8.0安装apk权限-->
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

8.0安装apk的问题已解决

使用上面的调用installApk方法

 @RequiresApi(api = Build.VERSION_CODES.O)
    private void startInstallPermissionSettingActivity() {
    //注意这个是8.0新API
        Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
        startActivityForResult(intent, 10086);
    }
    //安装应用
    private void installApk(Context mContext, File file) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
            intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
        } else {//Android7.0之后获取uri要用contentProvider
            Uri apkUri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".fileprovider", file);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
        }
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        getBaseContext().startActivity(intent);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK && requestCode == 1) {
            //再次执行上面的流程,包含权限判等
            loadNewVersion();
        }
    }
上一篇下一篇

猜你喜欢

热点阅读