首页
JAVA笔记
数据库笔记
混乱记忆
小站记
您现在的位置
android DownloadManager 下载
简介: android 开发时可能会用到下载功能,在这里主要对 DownloadManager 组件的使用进行简单介绍。可能会产生异常 java.lang.SecurityException: Invalid value for visibility: 2

今天花了点时间把 android DownloadManager  下载进行了测试,

代码如下

button2.setOnClickListener(new OnClickListener() {
   
   @Override
   public void onClick(View v) {

DownloadManager manager =(DownloadManager)getSystemService(DOWNLOAD_SERVICE);  

   // TODO Auto-generated method stub

     DownloadManager.Request down=new DownloadManager.Request (Uri.parse("http://www.xiaoyunduo.org/MyDemos.apk"));  

                 //设置允许使用的网络类型,这里是移动网络和wifi都可以  

                down.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE|DownloadManager.Request.NETWORK_WIFI);  

                  //禁止发出通知,既后台下载  

//                down.setShowRunningNotification(true);  

                

               //因为使用了 receiver可以自动触发安装,所以在下载完成之后不显示 下载完成的 notification

               down.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION);

                 //在下载管理中显示

                 down.setVisibleInDownloadsUi(true);  

                 //设置 mimetype 后 在单击下载完成的 notification 时会触发安装

                 down.setMimeType("application/vnd.android.package-archive");

//                  down.setAllowedOverMetered(true);

                 down.setAllowedOverRoaming(true);

                 down.setTitle("基因猫");

                 down.setDescription("基因猫新特性更新");

                 //设置下载后文件存放的位置  

                 down.setDestinationUri( Uri.withAppendedPath(Uri.fromFile(Environment.getExternalStorageDirectory()), "DownloadManager.apk"));

//                down.setDestinationInExternalFilesDir(T.this.getBaseContext(), null, "DownloadManager.apk");  

                //将下载请求放入队列  

                 //sid是一个全局变量

          manager.enqueue(down);   



  });

 

实现消息接收和注册下载状态值

registerReceiver(new DownloadBroadcastReceiver(), new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); 

 

 package org.xiaoyunduo.download;


import java.io.File;


import android.app.DownloadManager;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.database.Cursor;

import android.net.Uri;

import android.util.Log;


public class DownloadBroadcastReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context arg0, Intent intent) {

DownloadManager manager = (DownloadManager) arg0

.getSystemService(Context.DOWNLOAD_SERVICE);

// TODO Auto-generated method stub

// 这里可以取得下载的id,这样就可以知道哪个文件下载完成了。适用与多个下载任务的监听

long did = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);

Log.v("intent","" + did);

DownloadManager.Query query = new DownloadManager.Query();

query.setFilterById(did);

Cursor c = manager.query(query);

// [_id, local_filename, mediaprovider_uri, destination, title, description, uri, status, hint, media_type, total_size, last_modified_timestamp, bytes_so_far, local_uri, reason]

if (c.moveToFirst()) {

int status = c.getInt(c

.getColumnIndex(DownloadManager.COLUMN_STATUS));

// 拿到状态后就可以做一些安装功能什么的了,这里就不写了

switch (status) {

case DownloadManager.STATUS_SUCCESSFUL:

Log.i("----------", status+"");

Uri uri = Uri.fromFile(new File(c.getString(c.getColumnIndex("local_filename")))); 

// Uri uri = Uri.parse(c.getString(c.getColumnIndex("local_filename")));

//创建Intent意图 

Intent install = new Intent(Intent.ACTION_VIEW); 

install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

//设置Uri和类型 

install.setDataAndType(uri, "application/vnd.android.package-archive"); 

//执行意图进行安装 

arg0.startActivity(install);

// startActivity(install);

break;


default:

manager.remove(did);

break;

}


}

}


}


 

取消下载

sid=   manager.enqueue(down);

。。。。。。。。。

manager.remove(l);

 

 

AndroidManifest.xml 需要权限如下:

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


receiver 注册配置

        <!-- 更新app -->

        <receiver android:name="org.xiaoyunduo.download.DownloadBroadcastReceiver" >

            <intent-filter>

                <action android:name="android.intent.action.DOWNLOAD_COMPLETE" />

            </intent-filter>

        </receiver>

 

注意:

12-19 15:02:52.562: E/AndroidRuntime(3743): FATAL EXCEPTION: main
12-19 15:02:52.562: E/AndroidRuntime(3743): java.lang.SecurityException: Invalid value for visibility: 2
12-19 15:02:52.562: E/AndroidRuntime(3743):  at android.os.Parcel.readException(Parcel.java:1327)

出现这个问题可能是在谋写版本中 down.setShowRunningNotification(false);   不能被调用!

 

断网后再连接上其组件会断点续传,关机后在开机后还是会继续下载,这些我都觉得可以。

 

最近更新