Android 使用 DowanloadManager 实现下载并获取下载进度实例代码

Android 使用 DowanloadManager 实现下载并获取下载进度实例代码

实现代码:

package com.koolsee.gallery;

import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.app.DownloadManager;
import android.app.DownloadManager.Request;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnKeyListener;
import android.view.View.OnTouchListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.koolsee.gallery.adapter.RecommendAdapter;
import com.koolsee.gallery.model.Recommend;
import com.koolsee.gallery.widget.GalleryFlow;

/**
 * 首页
 *
 * @author zengxiaotao
 */
public class testActivity extends Activity {
 private DownloadManager dowanloadmanager = null;
 private DownloadChangeObserver downloadObserver;
 private long lastDownloadId = 0;
 public static final Uri CONTENT_URI = Uri.parse("content://downloads/my_downloads");
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);
  setContentView(R.layout.test);
  String serviceString = Context.DOWNLOAD_SERVICE;
  dowanloadmanager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);

  Uri uri = Uri.parse("http://commonsware.com/misc/test.mp4");
  Environment.getExternalStoragePublicDirectory(
   Environment.DIRECTORY_DOWNLOADS).mkdir();

  lastDownloadId = dowanloadmanager.enqueue(new DownloadManager.Request(uri)
           .setAllowedNetworkTypes(
            DownloadManager.Request.NETWORK_MOBILE
            | DownloadManager.Request.NETWORK_WIFI)
           .setAllowedOverRoaming(false)
           .setDestinationInExternalPublicDir(
            Environment.DIRECTORY_DOWNLOADS, "test.mp4"));
  registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
  downloadObserver = new DownloadChangeObserver(null);
  getContentResolver().registerContentObserver(CONTENT_URI, true, downloadObserver);
 }
 class DownloadChangeObserver extends ContentObserver {

  public DownloadChangeObserver(Handler handler) {
   super(handler);
   // TODO Auto-generated constructor stub
  }

  @Override
  public void onChange(boolean selfChange) {
   queryDownloadStatus();
  }
 }

 private BroadcastReceiver receiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
   //这里可以取得下载的id,这样就可以知道哪个文件下载完成了。适用与多个下载任务的监听
   Log.v("tag", "" + intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0));
   queryDownloadStatus();
  }
 };

 private void queryDownloadStatus() {
  DownloadManager.Query query = new DownloadManager.Query();
  query.setFilterById(lastDownloadId);
  Cursor c = dowanloadmanager.query(query);
  if(c != null && c.moveToFirst()) {
   int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));

   int reasonIdx = c.getColumnIndex(DownloadManager.COLUMN_REASON);
   int titleIdx = c.getColumnIndex(DownloadManager.COLUMN_TITLE);
   int fileSizeIdx =
    c.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES);
   int bytesDLIdx =
    c.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR);
   String title = c.getString(titleIdx);
   int fileSize = c.getInt(fileSizeIdx);
   int bytesDL = c.getInt(bytesDLIdx);

   // Translate the pause reason to friendly text.
   int reason = c.getInt(reasonIdx);
   StringBuilder sb = new StringBuilder();
   sb.append(title).append("\n");
   sb.append("Downloaded ").append(bytesDL).append(" / " ).append(fileSize);

   // Display the status
   Log.d("tag", sb.toString());
   switch(status) {
   case DownloadManager.STATUS_PAUSED:
    Log.v("tag", "STATUS_PAUSED");
   case DownloadManager.STATUS_PENDING:
    Log.v("tag", "STATUS_PENDING");
   case DownloadManager.STATUS_RUNNING:
    // 正在下载,不做任何事情
    Log.v("tag", "STATUS_RUNNING");
    break;
   case DownloadManager.STATUS_SUCCESSFUL:
    // 完成
    Log.v("tag", "下载完成");
    // dowanloadmanager.remove(lastDownloadId);
    break;
   case DownloadManager.STATUS_FAILED:
    // 清除已下载的内容,重新下载
    Log.v("tag", "STATUS_FAILED");
    dowanloadmanager.remove(lastDownloadId);
    break;
   }
  }
 }

 @Override
 protected void onDestroy() {
  // TODO Auto-generated method stub
  super.onDestroy();
  unregisterReceiver(receiver);
  getContentResolver().unregisterContentObserver(downloadObserver);
 }
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Android实现文件下载进度显示功能

    和大家一起分享一下学习经验,如何实现Android文件下载进度显示功能,希望对广大初学者有帮助. 先上效果图: 上方的蓝色进度条,会根据文件下载量的百分比进行加载,中部的文本控件用来现在文件下载的百分比,最下方的ImageView用来展示下载好的文件,项目的目的就是动态向用户展示文件的下载量. 下面看代码实现:首先是布局文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xm

  • Android下载进度监听和通知的处理详解

    本文实例为大家分享了Android下载进度监听和通知的具体代码,供大家参考,具体内容如下 下载管理器 关于下载进度的监听,这个比较简单,以apk文件下载为例,需要处理3个回调函数,分别是: 1.下载中 2.下载成功 3.下载失败 因此对应的回调接口就有了: public interface DownloadCallback { /** * 下载成功 * @param file 目标文件 */ void onComplete(File file); /** * 下载失败 * @param e */

  • Android Retrofit文件下载进度显示问题的解决方法

    综述 在Retrofit2.0使用详解这篇文章中详细介绍了retrofit的用法.并且在retrofit中我们可以通过ResponseBody进行对文件的下载.但是在retrofit中并没有为我们提供显示下载进度的接口.在项目中,若是用户下载一个文件,无法实时给用户显示下载进度,这样用户的体验也是非常差的.那么下面就介绍一下在retrofit用于文件的下载如何实时跟踪下载进度. 演示 Retrofit文件下载进度更新的实现 在retrofit2.0中他依赖于Okhttp,所以如果我们需要解决这个

  • android中DownloadManager实现版本更新,监听下载进度实例

    DownloadManager简介 DownloadManager是Android 2.3(API level 9)用系统服务(Service)的方式提供了DownloadManager来处理长时间的下载操作.它包含两个静态内部类DownloadManager.Query(用来查询下载信息)和DownloadManager.Request(用来请求一个下载). DownloadManager主要提供了下面几个方法: public long enqueue(Request request)把任务加

  • Android中使用AsyncTask做下载进度条实例代码

    android AsyncTask做下载进度条 AsyncTask是个不错的东西,可以使用它来做下载进度条.代码讲解如下: package com.example.downloadfile; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import android.a

  • Android文件下载进度条的实现代码

    main.xml: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="fill_paren

  • Android实现Service下载文件,Notification显示下载进度的示例

    先放个gif..最终效果如果: 主要演示了Android从服务器下载文件,调用Notification显示下载进度,并且在下载完毕以后点击通知会跳转到安装APK的界面,演示是在真实的网络环境中使用真实的URL进行演示,来看看代码: MainActivity代码非常简单,就是启动一个Service: public class MainActivity extends AppCompatActivity { String download_url="http://shouji.360tpcdn.co

  • Android之ProgressBar即时显示下载进度详解

    这里利用 ProgressBar 即时显示下载进度. 途中碰到的问题: 1.主线程中不能打开 URL,和只能在主线程中使用 Toast 等 2.子线程不能修改 UI 3.允许网络协议 4.暂停下载和继续下载   ........ fragment_main 布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.

  • Android 使用 DowanloadManager 实现下载并获取下载进度实例代码

    Android 使用 DowanloadManager 实现下载并获取下载进度实例代码 实现代码: package com.koolsee.gallery; import java.util.ArrayList; import java.util.List; import java.util.Timer; import java.util.TimerTask; import android.app.Activity; import android.app.DownloadManager; imp

  • Android 获取屏幕尺寸实例代码

    Android 获取屏幕尺寸实例代码 实现代码: /** * <supports-screens * android:smallScreens="true" * android:normalScreens="true" * android:largeScreens="true" * android:resizeable="true" * android:anyDensity="true" />

  • 微信服务器中下载文件到本地的实例代码

    从微信服务器中下载文件到本地的实例代码,如下所示: //从微信服务器中下载文件到本地 public JsonResult UploadRecord(string ServerId) { try { member m = base.CurrentUser; string msg = "成功"; bool success = true; SiteSettingsInfo setting = base.CurrentSiteSetting; string file = string.Empt

  • Android基于高德地图poi的仿微信获取位置功能实例代码

    1.打开页面自动定位,同时搜索周边所有poi 2.点击搜索按钮,输入关键子,获取关键字搜索结果 3.选取listview中的一项即可定位到该位置,或者获取任何消息 4.文件类 1.MapActivity public class MapActivity extends Activity implements PoiSearch.OnPoiSearchListener { private MapView mMapView = null; private AMap aMap; private MyL

  • Android实现桌面悬浮窗、蒙板效果实例代码

    现在很多安全类的软件,比如360手机助手,百度手机助手等等,都有一个悬浮窗,可以飘浮在桌面上,方便用户使用一些常用的操作. 今天这篇文章,就是介绍如何实现桌面悬浮窗效果的. 首先,看一下效果图. 悬浮窗一共分为两个部分,一个是平常显示的小窗口,另外一个是点击小窗口显示出来的二级悬浮窗口. 首先,先看一下这个项目的目录结构. 最关键的就是红框内的四个类. 首先,FloatWindowService是一个后台的服务类,主要负责在后台不断的刷新桌面上的小悬浮窗口,否则会导致更换界面之后,悬浮窗口也会随

  • Android手机通过蓝牙连接佳博打印机的实例代码

    所使用的打印机为佳博打印机,支持蓝牙.wifi.usb我所使用的是通过蓝牙来连接. 在网上找到一个佳博官方针对安卓开发的App源码,但是各种的跳转,没有看太懂,所以又去问度娘,找到了一个不错的文章 Android对于蓝牙开发从2.0版本的sdk才开始支持,而且模拟器不支持,测试至少需要两部手机,所以制约了很多技术人员的开发. 1. 首先,要操作蓝牙,先要在AndroidManifest.xml里加入权限 // 管理蓝牙设备的权限 <uses-permissionandroid:name="

  • Android TV开发:实现3D仿Gallery效果的实例代码

    本文讲述了Android TV开发:实现3D仿Gallery效果的实例代码.分享给大家供大家参考,具体如下: 1.实现效果: 滚动翻页+ 页面点击+页码指示器+焦点控制 2.实现这个效果之前必须要了解 Android高级图片滚动控件实现3D版图片轮播器这篇文章,我是基于他的代码进行修改的,主要为了移植到电视上做了按键事件和焦点控制. 3.具体代码: public class Image3DSwitchView extends LinearLayout { private int currentP

  • Android 改变图标原有颜色和搜索框的实例代码

    图标改变颜色:Drawable的变色,让Android也能有iOS那么方便的图片色调转换,就像同一个图标,但是有多个地方使用,并且颜色不一样,就可以用这个方法了. 搜索框: 一般是EditText实现,本文 实现 TextView图片和文字居中,键盘搜索. 来看看效果图: 图标改变颜色:第一个界面的左边(二维码)和右边(更多)两个实现,我放进去的图片是黑色的,显示出来是白色的. 搜索框:第一个界面的图片和文字居中,还可以设置间距,第二个见面搜索设置键盘搜索按钮,点击搜索监听事件,清除内容的图标.

  • Android HelloChart开源库图表之折线图的实例代码

    前面我们介绍了开源图表库MPAndroidChart,请参考: Android MPAndroidChart开源库图表之折线图的实例代码 我们今天介绍的将是一个更为优秀的图表库,比MPAndroidChart性能更好,功能更完善,UI风格更美观,坐标轴更精细. 支持缩放.滑动以及平移.Zoom(pinch to zoom, double tap zoom), scroll and fling 支持自定义坐标轴(比如坐标轴位置:上下左右内部),支持自动生成坐标轴.Custom and auto-g

  • Android第三方登录之腾讯QQ登录的实例代码

    布局文件 <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="登录成功" android:textSize="25sp" android:layout_marginTop="100dp" /> 清单文件中的配置 <activity android:n

随机推荐