博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android 之 DownloadManager
阅读量:5835 次
发布时间:2019-06-18

本文共 3207 字,大约阅读时间需要 10 分钟。

基础使用:

DownloadManager.Request request;try{    request = new DownloadManager.Request(Uri.parse("String url"));    // 放入下载队列    Context appContext = getApplicationContext();    DownloadManager manager = (DownloadManager)appContext.getSystemService(Context.DOWNLOAD_SERVICE);    manager.enqueue(request);}catch (Exception e){    e.printStackTrace();    return;}

加入下载队列后可以获得一个下载ID用于创建下载进度观察者或者下载完成的广播通知

long downloadId = manager.enqueue(request);

下载进度观察者:

final DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);getContentResolver().registerContentObserver(Uri.parse("content://downloads/my_downloads"), true, new ContentObserver(new Handler()) {    @Override    public void onChange(boolean selfChange) {        int[] bytesAndStatus = new int[]{-1, -1, 0};        DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId);        Cursor cursor = null;        try {            cursor = dm.query(query);            if (cursor != null && cursor.moveToFirst()) {                //已经下载文件大小                bytesAndStatus[0] = cursor.getInt(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));                //下载文件的总大小                bytesAndStatus[1] = cursor.getInt(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));                //下载状态                bytesAndStatus[2] = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));                //计算下载进度                float progress = (float)bytesAndStatus[0]/bytesAndStatus[1];                                // 当进度完全执行好了记得 注销观察者 不注销的话 可能会多跑几次                if(progress == 1){                    getContentResolver().unregisterContentObserver(this);                }            }        } finally {            if (cursor != null) {                cursor.close();            }        }    }});

注册广播接收者

IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {    @Override    public void onReceive(Context context, Intent intent) {        long ID = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);        if (ID == downloadId) {            // 执行完成后的代码            Toast.makeText(getApplicationContext(), "任务:" + downloadId + " 下载完成!", Toast.LENGTH_LONG).show();            // 记得注销广播接收者  不注销的话这个会一直在的            unregisterReceiver(this);        }    }};registerReceiver(broadcastReceiver, intentFilter);

其他:

1.保存路径问题

request.setDestinationInExternalPublicDir("保存路径","保存的文件名称");

2.通知栏显示下载信息

request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);request.setTitle("下载");request.setDescription("应用正在下载");request.setAllowedOverRoaming(false);

3.个人使用目的:下载apk,完成后调用安装

String serviceString = Context.DOWNLOAD_SERVICE;DownloadManager dManager = (DownloadManager) context.getSystemService(serviceString);// 根据下载管理获取下载文件的URI 自己写Uri.pase("文件路径")也是可以的Uri downloadFileUri = dManager.getUriForDownloadedFile(downloadId);Intent intent = new Intent(Intent.ACTION_VIEW);intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 该语句会授予临时的访问权限 否则会秒退intent.setDataAndType(fileuri, "application/vnd.android.package-archive");startActivity(intent);

转载地址:http://hkycx.baihongyu.com/

你可能感兴趣的文章
SAE+Java+jetty
查看>>
Java 权限框架 Shiro 实战一:理论基础
查看>>
如何在 OS X 中安装 ruby
查看>>
大话数据结构之四(串)
查看>>
加热炉简是新来的整个系统的板
查看>>
Mockito使用注意事项
查看>>
Apache配置
查看>>
[LeetCode] Palindrome Linked List 回文链表
查看>>
UVA - 825Walking on the Safe Side(dp)
查看>>
android大概是通过logcat拦截Log
查看>>
android HDMI 清晰度 分辨率
查看>>
Codeforces 480C Riding in a Lift dp
查看>>
JQuery发送Put、Delete请求 - 摘自网络
查看>>
Android基于mAppWidget实现手绘地图(九)–如何处理地图对象的touch事件
查看>>
OCP解决问题052-- DROP PROFILE app_user
查看>>
ContentProvider的一些总结
查看>>
关于codeMirror插件使用的一个坑
查看>>
chrome插件演示,经js转让chrome api清除浏览器缓存
查看>>
瞎子摸象与刻舟求剑
查看>>
多个相同name的文本输入框,输入其中一个后,使剩下的不能输入值
查看>>