调用系统下载服务下载文件。监听下载完成拿到downloadid和filename

public class DownLoadAPK {
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public static long downloadAPK(DownloadManager downloadManager, String apkUrl, String name, String desc){

        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(apkUrl));
        request.setDestinationInExternalPublicDir("zhnet", name+".apk");//表示设置下载地址为sd卡的Trinea文件夹,文件名为MeiLiShuo.apk。
        request.setTitle(name);//设置下载中通知栏提示的标题
        request.setDescription(desc);//设置下载中通知栏提示的介绍
        request.setVisibleInDownloadsUi(true);  //设置显示下载界面
        request.setMimeType("application/vnd.android.package-archive");
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);//表示下载进行中和下载完成的通知栏是否显示。
        // 默认只显示下载中通知。
        // VISIBILITY_VISIBLE_NOTIFY_COMPLETED表示下载完成后显示通知栏提示。VISIBILITY_HIDDEN表示不显示任何通知栏提示,
        // 这个需要在AndroidMainfest中添加权限android.permission.DOWNLOAD_WITHOUT_NOTIFICATION.

//        request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);//表示下载允许的网络类型,默认在任何网络下都允许下载。
        //有NETWORK_MOBILE、NETWORK_WIFI、NETWORK_BLUETOOTH三种及其组合可供选择。
        //如果只允许wifi下载,而当前网络为3g,则下载会等待。

//        request.setAllowedOverRoaming(true);//移动网络情况下是否允许漫游。

//        request.setMimeType("application/cn.trinea.download.file");//设置下载文件的mineType。
        // 因为下载管理Ui中点击某个已下载完成文件及下载完成点击通知栏提示都会根据mimeType去打开文件,所以我们可以利用这个属性。
        // 比如上面设置了mimeType为application/cn.trinea.download.file,
        // 我们可以同时设置某个Activity的intent-filter为application/cn.trinea.download.file,用于响应点击的打开文件。

//        request.allowScanningByMediaScanner();//表示允许MediaScanner扫描到这个文件,默认不允许。

        //request.addRequestHeader(String header, String value)
        //添加请求下载的网络链接的http头,比如User-Agent,gzip压缩等

        return downloadManager.enqueue(request);
    }
}

上面的工具类有详细注释说明,暂时搜集了这么些功能,下面是监听系统下载完成系统发送广播,监听广播获取下载的详细地址加文件名和id

public class DownloadReceiver extends BroadcastReceiver {
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    @Override
    public void onReceive(Context context, Intent intent) {
        long completeDownloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);

        Log.d("=====", "下载的IDonReceive: "+completeDownloadId);

        DownloadManager manager = (DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);
        if(DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(intent.getAction())){
            DownloadManager.Query query = new DownloadManager.Query();
            //在广播中取出下载任务的id
            long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
            query.setFilterById(id);
            Cursor c = manager.query(query);
            if(c.moveToFirst()) {
                //获取文件下载路径
                String filename = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
                //如果文件名不为空,说明已经存在了,拿到文件名想干嘛都好
                if(filename != null){
                    Log.d("=====", "下载完成的文件名为:"+filename);
                    //     /storage/emulated/0/zhnet/T台魅影.apk

                    //执行安装
                    Intent intent_ins = new Intent(Intent.ACTION_VIEW);
                    intent_ins.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    intent_ins.setDataAndType(Uri.parse("file://" + filename),"application/vnd.android.package-archive");
                    context.getApplicationContext().startActivity(intent_ins);
//                    filename = filename.substring(filename.lastIndexOf("/")+1, filename.lastIndexOf("."));
//                    Log.d("=====", "截取后的文件名onReceive: "+filename);
                }
            }
        }else if(DownloadManager.ACTION_NOTIFICATION_CLICKED.equals(intent.getAction())){
            long[] ids = intent.getLongArrayExtra(DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS);
            //点击通知栏取消下载
//            manager.remove(ids);
//            Toast.makeText(context, "已经取消下载", Toast.LENGTH_SHORT).show();

        }
    }
}

最后记得改清单文件

        <!--监听系统下载完成的广播-->
        <receiver android:name="com.zhnet.AD.broadcast.DownloadReceiver">
            <intent-filter>
                <action android:name="DownloadManager.ACTION_DOWNLOAD_COMPLETE"/>
                <action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
                <action android:name="android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED"/>
            </intent-filter>
        </receiver>
时间: 2024-10-22 19:36:16

调用系统下载服务下载文件。监听下载完成拿到downloadid和filename的相关文章

使用NSURLSessionDownloadTask实现大文件下载-监听下载进度

(1)创建NSURLSession并设置代理,通过NSURLSessionDownloadTask并以代理的方式来完成大文件的下载 //1.创建NSULRSession,设置代理 self.session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue main

ios开发-UI基础-应用管理(单纯界面)改进5-使用代理实现监听下载按钮的点击(delegate)

[注意]转载时请注明出处博客园-吃唐僧肉的小悟空http://www.cnblogs.com/hukezhu/ 前几篇文章介绍了一个应用管理的小应用,从最开始的单纯实现功能,一步一步就行改进\封装,上篇文章是使用xib进行了优化,本篇文章使用代理实现监听下载按钮的点击. 在原来的基础上,使用代理的主要思路分析: 首先要新建一个协议 声明协议的要实现的方法(一般为optional) 声明一个遵守该协议的代理的属性 使用代理,通知其代理完成操作 在代理中的实现步骤: 遵守协议 设置代理(一般通过拖线

linux epoll机制对TCP 客户端和服务端的监听C代码通用框架实现

1 TCP简介 tcp是一种基于流的应用层协议,其"可靠的数据传输"实现的原理就是,"拥塞控制"的滑动窗口机制,该机制包含的算法主要有"慢启动","拥塞避免","快速重传". 2 TCP socket建立和epoll监听实现 数据结构设计 linux环境下,应用层TCP消息体定义如下: typedef struct TcpMsg_s { TcpMsgHeader head; void* msg; }TcpM

模拟下载进度动画 (动画监听)

//监听事件 -(void)setUpSomething{ UITapGestureRecognizer *tapGes = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapped:)];     [self addGestureRecognizer:tapGes]; } //点击动画 #pragma mark -- UITapGesture -(void)tapped:(UITapGestureRec

[Spring cloud 一步步实现广告系统] 15. 使用开源组件监听Binlog 实现增量索引准备

MySQL Binlog简介 什么是binlog? 一个二进制日志,用来记录对数据发生或潜在发生更改的SQL语句,并以而进行的形式保存在磁盘中. binlog 的作用? 最主要有3个用途: 数据复制(主从同步) Mysql 的Master-Slave协议,让Slave可以通过监听binlog实现数据复制,达到数据一致性目的 数据恢复 通过mysqlbinlog工具恢复数据 增量备份 Binlog 变量 log_bin (Binlog 开关,使用show variables like 'log_b

linux系统实现多个进程监听同一个端口

通过 fork 创建子进程的方式可以实现,其他情况下不行. 当连接到来时,子进程.父进程都可以 accept, 这就是著名的"惊群"问题(thundering herd problem). 惊群现象 在该模型下(多个子进程同时共享监听套接字)即可实现服务器并发处理客户端的连接.这里要注意的是,计算机三次握手创建连接是在内核进程里完成的,不需要应用服务进程参数的,而服务进程仅仅要做的是调用accept将已建立的连接构建对应的连接套接字connfd(可参考 http://blog.csdn

Linux系统 端口知识以及相关监听工具

在网络技术中,端口(Port)包括逻辑端口和物理端口两种类型. 物理端口指的是物理存在的端口,如ADSL Modem.集线器.交换机.路由器上用 于连接其他网络设备的接口,如RJ-45端口.SC端口等等.逻辑端口指逻辑意义上用于区分服务的端口,如TCP/IP协议中的服务端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等.由于物理端口和逻辑端口数量较多,为了对端口进行区分,将每个端口进行了编号,这就是端口号 一.端口按端口号可以分为3大类:-------

linux下开启oracle服务和开启监听

su - oracle  切换到oracle用户模式下 sqlplus /nolog  //登录sqlplus SQL> connect /as sysdba  //连接oracle SQL> startup //起动数据库 SQL> exit  //退出sqlplus ,起动监听 cd $ORACLE_HOME/bin //进入oracle安装目录 lsnrctl start  //起动监听 原文地址:https://www.cnblogs.com/foxting/p/9393973.

linux oracle 设置随系统自动启动数据库实例和监听

在root账户下修改/etc/oratab 文件: # vi /etc/oratab 找到orcl=/db/app/oracle/product/11.1.0/db_1 :N这一行 改为: orcl=/db/app/oracle/product/11.1.0/db_1 :Y 也就是将最后的N改为Y,意思是将不允许自动启动改为允许自动启动. 然后,是修改ORACLE自带的启动与关闭脚本,分别是dbstart和dbshut.执行这两个脚本就可以实现ORACLE脚本的启动与关闭. 在oracle账户下