Android——实现网络下载资源

网络权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

MainActivity

downloadAPK(bean.getData().getApkUrl(),"APK");

private void downloadAPK(String versionUrl, String versionName) {
    //创建下载任务
    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(versionUrl));
    request.setAllowedOverRoaming(false);//漫游网络是否可以下载

    //设置文件类型,可以在下载结束后自动打开该文件
    MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
    String mimeString = mimeTypeMap.getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(versionUrl));
    request.setMimeType(mimeString);

    //在通知栏中显示,默认就是显示的
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
    request.setVisibleInDownloadsUi(true);

    //sdcard的目录下的download文件夹,必须设置
    request.setDestinationInExternalPublicDir("/download/", versionName);
    //request.setDestinationInExternalFilesDir(),也可以自己制定下载路径

    //将下载请求加入下载队列
    downloadManager = (DownloadManager) MainActivity.this.getSystemService(MainActivity.this.DOWNLOAD_SERVICE);
    //加入下载队列后会给该任务返回一个long型的id    //通过该id可以取消任务,重启任务等等,看上面源码中框起来的方法
    mTaskId = downloadManager.enqueue(request);

    //注册广播接收者,监听下载状态
    MainActivity.this.registerReceiver(receiver,new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}

private BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        checkDownloadStatus();//检查下载状态
    }
};

private void checkDownloadStatus() {
    DownloadManager.Query query = new DownloadManager.Query();
    query.setFilterById(mTaskId);//筛选下载任务,传入任务ID,可变参数
    Cursor c = downloadManager.query(query);
    if (c.moveToFirst()) {
        int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
        switch (status) {
            case DownloadManager.STATUS_PAUSED:
                Log.i("zzz",">>>下载暂停");
            case DownloadManager.STATUS_PENDING:
                Log.i("zzz",">>>下载延迟");
            case DownloadManager.STATUS_RUNNING:
                Log.i("zzz",">>>正在下载");
                break;
            case DownloadManager.STATUS_SUCCESSFUL:
                Log.i("zzz",">>>下载完成");
                File file = Environment.getExternalStorageDirectory();
                installAPK(new File(file+"/Download"));
                break;
            case DownloadManager.STATUS_FAILED:
                Log.i("zzz",">>>下载失败");
                break;
        }
    }
}

protected void installAPK(File file) {
    if (!file.exists()) return;
    Intent intent = new Intent(Intent.ACTION_VIEW);
    Uri uri = Uri.parse("file://" + file.toString());
    intent.setDataAndType(uri, "application/vnd.android.package-archive");
    //在服务中开启activity必须设置flag,后面解释
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    MainActivity.this.startActivity(intent);
}

猜你喜欢

转载自blog.csdn.net/xy8199/article/details/78857443
今日推荐