美文网首页
Android-在线apk更新

Android-在线apk更新

作者: a1a4b0d9e20c | 来源:发表于2020-05-25 08:47 被阅读0次

    1、先建一个DownloadAPKFileTask类,继承AsyncTask

    public class DownloadAPKFileTask extends AsyncTask<String, Void, File> {
    
        // 文件路径
        private String filePath;
        private String fileName;
        private Activity mContext;
        private DownloadAPKListener listener;
        private String savePath;
    
        public DownloadAPKFileTask(Activity context, String downloadUrl, String fileName, DownloadAPKListener listener) {
            mContext = context;
            this.filePath = downloadUrl;//"http://192.168.0.125:8081/static/publish/app-debug.apk";
            this.listener = listener;
            this.fileName = fileName;
        }
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            if (null != listener) {
                listener.showProgressBar();
            }
        }
        //HGYDNew--自己的项目名
        @Override
        protected File doInBackground(String... params) {
            savePath = Environment
                    .getExternalStorageDirectory().getAbsolutePath()
                    + File.separator
                    + "HGYDNew"
                    + File.separator
                    + fileName;
            File downloadFile = new File(savePath);
            if (downloadFile.exists()) {
                downloadFile.delete();
            }
            if (!downloadFile.getParentFile().exists()) {
                downloadFile.getParentFile().mkdirs();
            }
            try {
                URL url = new URL(filePath);
                URLConnection conn = url.openConnection();
                InputStream inputStream = conn.getInputStream();
                // 获取文件输出流对象
                OutputStream outputStream = new FileOutputStream(downloadFile);
                int bytesRead = 0;
                // 创建缓冲区字节数组
                byte[] buffer = new byte[2048];
                int lastProgress = 0;
                int currentProgress = 0;
    
                while ((bytesRead = inputStream.read(buffer, 0, buffer.length)) != -1) {
                    if (isCancelled()) {
                        break;
                    }
                    outputStream.write(buffer, 0, bytesRead);
                    currentProgress = (int) (downloadFile.length() * 100 / conn.getContentLength());
                    if (currentProgress != lastProgress) {
                        lastProgress = currentProgress;
                        listener.onProgress(lastProgress);
                    }
                }
                outputStream.close();
                inputStream.close();
                return downloadFile;
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return null;
        }
    
        @Override
        protected void onPostExecute(File result) {
            super.onPostExecute(result);
            if (isCancelled()) {
                listener.onResult(null);
            }
            if (result != null && result.exists() && null != listener) {
                listener.onResult(result);
            } else {
    //            ToastUtil.showToast(mContext.getResources().getString(R.string.download_file_fail));
    
                //提示下载失败
    
                listener.onResult(null);
            }
        }
    
        public interface DownloadAPKListener {
            void onResult(File file);
    
            void onProgress(int progress);
    
            void showProgressBar();
        }
    }
    
    

    2、在res下新建xml文件夹,然后新建filepaths.xml文件

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <paths>
            <external-path
                name="external_path"
                path="." />
    
        </paths>
    </resources>
    

    3、在drawable下新建bg_progress_download.xml文件,下载进度条的方法

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:id="@+id/progress">
            <clip>
                <shape>
                    <corners android:radius="10dp" />
                    <gradient
                        android:angle="0"
                        android:endColor="@color/color_ccb799"
                        android:startColor="@color/color_ccb799" />
                </shape>
            </clip>
        </item>
    </layer-list>
    

    4、在layout下,main.xml中添加进度条创建方法

        <ProgressBar
                android:id="@+id/pb_update"
                android:visibility="gone"
                android:layout_width="277.5dp"
                android:layout_height="7.5dp"
                android:layout_centerInParent="true"
                android:indeterminate="false"
                android:indeterminateOnly="false"
                android:max="100"
                android:progressDrawable="@drawable/bg_progress_download" />
    

    5、color文件下添加进度条颜色值

        <!--下载条颜色-->
        <color name="color_ccb799">#ccb799</color>
    

    6、配置AndroidManifest.xml

    一、读取文件权限
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
        <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
        <uses-permission android:name="android.permission.INSTALL_PACKAGES_REQUESTCODE" />
    
    二、application配置方法
            <!--配置方法,com.example.hgydnew是你自己项目的包名-->
            <provider
                    android:name="androidx.core.content.FileProvider"
                    android:authorities="com.example.hgydnew.fileprovider"
                    android:exported="false"
                    android:grantUriPermissions="true">
                <meta-data
                        android:name="android.support.FILE_PROVIDER_PATHS"
                        android:resource="@xml/filepaths" />
            </provider>
    

    7、MainActivity中调用方法

    一、全局定义
        //更新
        private DownloadAPKFileTask task;
        private ProgressBar pb_update;
    
        private static final int UPDATE = 1000;
        private static final int HIDE = 1001;
        private static final int SHOW = 1002;
    
    二、onCreate
           //更新代码
            pb_update = view.findViewById(R.id.pb_update);
    
            task = new DownloadAPKFileTask(getActivity(), "https://download.baonahao.com/client/android/baonahao/jiayischool.apk", "zhxsfApp.apk", new DownloadAPKFileTask.DownloadAPKListener() {
                @Override
                public void onResult(File file) {
                    Message obtain = Message.obtain();
                    obtain.what = HIDE;
                    obtain.arg1 = 0;
                    handler.sendMessage(obtain);
                    if (null != file) {
                        getInstallIntent(file);
                    }
                }
                @Override
                public void onProgress(int progress) {
    
    //                LogUtil.e("progress : " + progress);
                    Message obtain = Message.obtain();
                    obtain.what = UPDATE;
                    obtain.arg1 = progress;
                    handler.sendMessage(obtain);
                }
                @Override
                public void showProgressBar() {
    
                    Message obtain = Message.obtain();
                    obtain.what = SHOW;
                    obtain.arg1 = 0;
                    handler.sendMessage(obtain);
    
                }
            });
    
    三、Handler调用
       //Handler方法
        private Handler handler = new Handler() {
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case UPDATE:
                        pb_update.setProgress(msg.arg1);
                        break;
                    case SHOW:
                        pb_update.setVisibility(View.VISIBLE);
                        break;
                    case HIDE:
                        pb_update.setVisibility(View.GONE);
                        try {
                            if (null != task) {
                                task.cancel(true);
                                task = null;
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
    
                        break;
                }
            }
        };
    
    四、定义getInstallIntent方法
       private void getInstallIntent(File file) {
    
            Uri uri = null;
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.addCategory("android.intent.category.DEFAULT");
            try {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//7.0 Android NF
                    //com.xxx.xxx.fileprovider为上述manifest中provider所配置相同
                    //com.example.hgydnew是你自己项目的包名
                    uri = FileProvider.getUriForFile(getContext(), "com.example.hgydnew.fileprovider", file);
                    intent.setAction(Intent.ACTION_INSTALL_PACKAGE);
                    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//7.0以后,系统要求授予临时uri读取权限,安装完毕以后,系统会自动收回权限,该过程没有用户交互
                } else {//7.0以下
                    uri = Uri.fromFile(file);
                    intent.setAction(Intent.ACTION_VIEW);
                }
                intent.setDataAndType(uri, "application/vnd.android.package-archive");
                getContext().startActivity(intent);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    五、重写方法
     @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    
         switch (requestCode){
                case 1:
                    task.execute();
                    break;
                default:
                    break;
            }
            super.onRequestPermissionsResult(requestCode,permissions,grantResults);
        }
    
    六、点击调用-先获取权限,然后调用 task.execute()
    if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE)
                            != PackageManager.PERMISSION_GRANTED&&ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.READ_EXTERNAL_STORAGE)
                            != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE},1);
    } else {
       task.execute();
    }
    

    相关文章

      网友评论

          本文标题:Android-在线apk更新

          本文链接:https://www.haomeiwen.com/subject/mmseahtx.html