Android 8.0版本更新下载

原创 2018年04月14日 20:54:46

  关于8.0的一个一个apk的下载更新,由于做的软件是内部用的,所以之前8.0的还是很少,一直也不知道会出现问题。但是后来领导突然提出来了,所以就更新了一下。

  其实8.0和7.0相比其实就一个权限的添加。
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

  下面完整下载代码


    在res下的xml创建名字为provider_paths的文件


 

<?xml version="1.0" encoding="utf-8"?>
<paths 
    <external-path

        path="." name="files_path" />
</paths>


    在application下创建provider

    

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>

    java代码

    拿取当前版本和服务器返回的版本想对比,如果低于服务器就开始下载

    以下是在fragment中做的下载动作。

    

 在buide.gradle中添加依赖,也就是下面动态申请权限的一个依赖

compile 'com.tbruyelle.rxpermissions:rxpermissions:0.7.0@aar'

 compile 'io.reactivex:rxjava:1.1.6' //需要引入RxJava    


//动态申请权限
private void quanxian(){
        RxPermissions.getInstance(getActivity())
                // 申请权限
                .request(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                .subscribe(new Action1<Boolean>() {
                    @Override
                    public void call(Boolean granted) {
                        if(granted){
                            //请求成功
                            showNoticeDialog();

                        }else{
                            // 请求失败回收当前服务


                        }
                    }
                });

    }

//更新当前app版本
    private void showNoticeDialog() {
        // 更新
        AlertDialog.Builder dialog = new AlertDialog.Builder(getActivity());

        dialog.setTitle("检测到新版本,立即更新吗")
                .setMessage("检测到新版本,立即更新吗").setMessage("更新内容:\n")//更新内容根据拿取版本时候服务器返回的进行书写
                .setPositiveButton("更新", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        Toast.makeText(getActivity(), "正在通知栏下载中", Toast.LENGTH_SHORT).show();

                        // 显示下载对话框
                        showDownloadDialog();
                    }
                });
       
            dialog.setNegativeButton("下次再说", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });
        



        dialog.setCancelable(false);
        dialog.show();
    }


 /**
     * 显示软件下载对话框
     */
    private void showDownloadDialog() {

        String downPath = http://xiaz.apk;//下载路径 根据服务器返回的apk存放路径
        //使用系统下载类
        mDownloadManager = (DownloadManager) getActivity().getSystemService(DOWNLOAD_SERVICE);
        Uri uri = Uri.parse(downPath);
        DownloadManager.Request request = new DownloadManager.Request(uri);
        request.setAllowedOverRoaming(false);

        //创建目录下载
        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "下载.apk");
        // 把id保存好,在接收者里面要用
        downloadId = mDownloadManager.enqueue(request);
        //设置允许使用的网络类型,这里是移动网络和wifi都可以
        request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);
        //机型适配
        request.setMimeType("application/vnd.android.package-archive");
        //通知栏显示
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        request.setTitle("下载");
        request.setDescription("正在下载中...");
        request.setVisibleInDownloadsUi(true);
        getActivity().registerReceiver(mReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
    }



private BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            checkStatus();
        }
    };


/**
     * 检查下载状态
     */
    private void checkStatus() {
        DownloadManager.Query query = new DownloadManager.Query();
        query.setFilterById(downloadId);
        Cursor cursor = mDownloadManager.query(query);
        if (cursor.moveToFirst()) {
            int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
            switch (status) {
                //下载暂停
                case DownloadManager.STATUS_PAUSED:
                    break;
                //下载延迟
                case DownloadManager.STATUS_PENDING:
                    break;
                //正在下载
                case DownloadManager.STATUS_RUNNING:
                    break;
                //下载完成
                case DownloadManager.STATUS_SUCCESSFUL:
                    installAPK();
                    break;
                //下载失败
                case DownloadManager.STATUS_FAILED:
                    Toast.makeText(getActivity(), "下载失败", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
        cursor.close();
    }

    /**
     * 7.0兼容
     */
    private void installAPK() {
        File apkFile =
                new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "下载.apk");
        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(getActivity(), getActivity().getPackageName() + ".provider", apkFile);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
        } else {
            intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
        }
        getActivity().startActivity(intent);
    }

Android版本更新、热更新以及权限管理

-
  • 1970年01月01日 08:00

Android app实现自更新和安装,权限检测适配Android6.0以下和Android6.0和Android7.0和Android8.0总结篇

首先下载问文件需要在AndroidManifest.xml里添加SD卡读写权限,下面两个权限:&amp;lt;uses-permission android:name=&quot;android.pe...
  • qq_16601407
  • qq_16601407
  • 2018-03-21 09:27:13
  • 444

安卓8.0应用内apk安装更新问题

谷歌开发大会后安卓8.0发布,刚好自己提前在花粉俱乐部发起的新系统体验申请,于是将现在的华为mate9升级到android O,调试项目的时候发现应用内安装apk出了问题,打开应用的时候屏幕只是一闪,...
  • knockheart
  • knockheart
  • 2018-01-17 15:50:14
  • 1402

你需要的安卓8.0权限适配(二)未知来源应用安装权限

前一段时间写了关于8.0的一篇文章,讲述的主要是8.0的通知栏的适配问题,最近在项目开发的时候又遇到了另外一种情况。 现在基本上每个安卓应用都有在线更新功能,应该很多人都知道7.0添加了文件夹限...
  • lixuce1234
  • lixuce1234
  • 2018-02-01 15:26:49
  • 1662

Android通知栏微技巧,8.0系统中通知栏的适配

转载请注明出处:https://blog.csdn.net/guolin_blog/article/details/79854070 大家好,今天我们继续来学习Android 8.0系统的适配。 ...
  • sinyu890807
  • sinyu890807
  • 2018-04-17 07:39:11
  • 6846

Android 8.0版本更新下载

  关于8.0的一个一个apk的下载更新,由于做的软件是内部用的,所以之前8.0的还是很少,一直也不知道会出现问题。但是后来领导突然提出来了,所以就更新了一下。  其实8.0和7.0相比其实就一个权限...
  • wenyaguang
  • wenyaguang
  • 2018-04-14 20:54:46
  • 297

安卓开发实战之app之版本更新升级(DownloadManager和http下载)完整实现

前言本文将讲解app的升级与更新。一般而言用户使用App的时候升级提醒有两种方式获得: 一种是通过应用市场 获取 一种是打开应用之后提醒用户更新升级 而更新操作一般是在用户点击了升级按钮之后开始执行的...
  • u013278099
  • u013278099
  • 2016-09-28 17:08:07
  • 30137

android 实现版本更新和下载安装

在开发android APP时候 经常用到的一个技术 就是检查目前手机端APP的版本,如果手机端版本较低 ,就会实现下载新版本和安装。 实现的过程的大体思路是这样的: 首先得到本地的版本,其次向服...
  • xq43701200
  • xq43701200
  • 2015-05-17 19:36:30
  • 1219

apk更新、下载、安装(一)

思路是: 1、解析服务器xml文件,获取服务器版本号,确定是否需要进行更新版本vercode 2、弹出软件更新提示框 3、点击更新,显示正在更新框,进行更新 4、更新状态下,如果点击取消就取消更新 ...
  • u013210620
  • u013210620
  • 2015-12-07 15:58:28
  • 757

android app 更新下载安装 适配android 7.0

1.申请权限 app的下载需要申请sd卡的读写权限,所以在android6.0之后需要动态申请 if (ContextCompat.checkSelfPermission(this, Manifes...
  • guangyu_sun
  • guangyu_sun
  • 2017-09-22 14:43:15
  • 1382
收藏助手
不良信息举报
您举报文章:Android 8.0版本更新下载
举报原因:
原因补充:

(最多只允许输入30个字)