使用Android系统提供的DownloadManager来下载文件_Android

在android2.3以后android系统提供了一个系统组件来供其他app调用来下载东西,使用起来非常方便。

例如我们可以拿来下载app的新版本apk,同时在同时注册一个广播接收器来接收下载完成时DownloadManager发出的的广播,然后自动安装程序。

SDK在API Level 9中加入了DownloadManager服务,可以将长时间的下载任务交给系统,完全由系统管理。

直接看实例代码:

package com.hebaijun.downloadtest; 

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder; 

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.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.webkit.MimeTypeMap; 

public class DownloadTestActivity extends Activity {
  private DownloadManager downloadManager;
  private SharedPreferences prefs;
  private static final String DL_ID = "downloadId";
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    downloadManager = (DownloadManager)getSystemService(DOWNLOAD_SERVICE);
    prefs = PreferenceManager.getDefaultSharedPreferences(this);
  }
  @Override
  protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    unregisterReceiver(receiver);
  }
  @Override
  protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    if(!prefs.contains(DL_ID)) {
      String url = "http://10.0.2.2/android/film/G3.mp4";
      //开始下载
      Uri resource = Uri.parse(encodeGB(url));
      DownloadManager.Request request = new DownloadManager.Request(resource);
      request.setAllowedNetworkTypes(Request.NETWORK_MOBILE | Request.NETWORK_WIFI);
      request.setAllowedOverRoaming(false);
      //设置文件类型
      MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
      String mimeString = mimeTypeMap.getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(url));
      request.setMimeType(mimeString);
      //在通知栏中显示
      request.setShowRunningNotification(true);
      request.setVisibleInDownloadsUi(true);
      //sdcard的目录下的download文件夹
      request.setDestinationInExternalPublicDir("/download/", "G3.mp4");
      request.setTitle("移动G3广告");
      long id = downloadManager.enqueue(request);
      //保存id
      prefs.edit().putLong(DL_ID, id).commit();
    } else {
      //下载已经开始,检查状态
      queryDownloadStatus();
    }  

    registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
  } 

  /**
   * 如果服务器不支持中文路径的情况下需要转换url的编码。
   * @param string
   * @return
   */
  public String encodeGB(String string)
  {
    //转换中文编码
    String split[] = string.split("/");
    for (int i = 1; i < split.length; i++) {
      try {
        split[i] = URLEncoder.encode(split[i], "GB2312");
      } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
      }
      split[0] = split[0]+"/"+split[i];
    }
    split[0] = split[0].replaceAll("\\+", "%20");//处理空格
    return split[0];
  } 

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

  private void queryDownloadStatus() {
    DownloadManager.Query query = new DownloadManager.Query();
    query.setFilterById(prefs.getLong(DL_ID, 0));
    Cursor c = downloadManager.query(query);
    if(c.moveToFirst()) {
      int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
      switch(status) {
      case DownloadManager.STATUS_PAUSED:
        Log.v("down", "STATUS_PAUSED");
      case DownloadManager.STATUS_PENDING:
        Log.v("down", "STATUS_PENDING");
      case DownloadManager.STATUS_RUNNING:
        //正在下载,不做任何事情
        Log.v("down", "STATUS_RUNNING");
        break;
      case DownloadManager.STATUS_SUCCESSFUL:
        //完成
        Log.v("down", "下载完成");
        break;
      case DownloadManager.STATUS_FAILED:
        //清除已下载的内容,重新下载
        Log.v("down", "STATUS_FAILED");
        downloadManager.remove(prefs.getLong(DL_ID, 0));
        prefs.edit().clear().commit();
        break;
      }
    }
  }
}

最后需要的权限是:

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

如果需要隐藏下载工具的提示和显示,修改代码:

request.setShowRunningNotification(false);
request.setVisibleInDownloadsUi(false);

加入下面的权限:

<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, downloadmanager下载
文件下载实现
download manager、downloadmanager下载、downloadmanager 暂停、freedownloadmanager、sap download manager,以便于您获取更多的相关知识。

时间: 2024-10-03 07:40:51

使用Android系统提供的DownloadManager来下载文件_Android的相关文章

使用Android系统提供的DownloadManager来下载文件

在android2.3以后android系统提供了一个系统组件来供其他app调用来下载东西,使用起来非常方便. 例如我们可以拿来下载app的新版本apk,同时在同时注册一个广播接收器来接收下载完成时DownloadManager发出的的广播,然后自动安装程序. SDK在API Level 9中加入了DownloadManager服务,可以将长时间的下载任务交给系统,完全由系统管理. 直接看实例代码: package com.hebaijun.downloadtest; import java.i

百度云Android版避免上传和下载文件消耗流量方法

给各位百度云软件的用户们来详细的解析分享一下百度云Android版避免上传和下载文件消耗流量的方法. 方法分享: 百度云Android版上传下载会消耗流量,因此请尽量选择在Wi-Fi环境下进行操作.您也可以在设置界面中选择"仅在Wi-Fi下上传下载"选项,当您的网络环境在非Wi-Fi环境下,不会对传输列表中的文件进行传输,请您放心.   好了,以上的信息就是小编给各位百度云的这一款软件的用户们带来的详细的百度云Android版避免上传和下载文件消耗流量的方法解析分享的全部内容了,各位看

深入剖析Android系统中Service和IntentService的区别_Android

Android中的Service是用于后台服务的,当应用程序被挂到后台的时候,问了保证应用某些组件仍然可以工作而引入了Service这个概念,那么这里面要强调的是Service不是独立的进程,也不是独立的线程,它是依赖于应用程序的主线程的,也就是说,在更多时候不建议在Service中编写耗时的逻辑和操作,否则会引起ANR. 那么我们当我们编写的耗时逻辑,不得不被service来管理的时候,就需要引入IntentService,IntentService是继承Service的,那么它包含了Serv

Android程序版本更新之通知栏更新下载安装_Android

Android应用检查版本更新后,在通知栏下载,更新下载进度,下载完成自动安装,效果图如下: •检查当前版本号 AndroidManifest文件中的versionCode用来标识版本,在服务器放一个新版本的apk,versioncode大于当前版本,下面代码用来获取versioncode的值 PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); int

Android系统检测程序内存占用各种方法_Android

1.检查系统总内存 复制代码 代码如下: liuhx@uc ~ $ adb shell cat /proc/meminfo MemTotal:         840868 kB MemFree:          457344 kB Buffers:            1744 kB Cached:           203064 kB SwapCached:            0 kB Active:           234932 kB Inactive:         12

win7系统禁止浏览器网页自动下载文件的方法

  1.打开win7系统下载纯净版开始菜单,并在附件下选择"运行"选项(如下图所示); 2.打开运行窗口后输入"gpedit.msc"命令,然后按确定或回车键; 3.打开本地组策略编辑器设置窗口后,依次打开"计算机配置"-"管理模板"."Windows组件"-"Internet Explorer"-"安全功能"-"限制文件下载"选项; 4.最后找到

linux系统中SecureCRT上传下载文件使用方法

1.在securecrt设置下载上传路径,位于: 英文版 options - session options - X/Y/Zmodem. 中文版 选项- 会话选项- X/Y/Zmodem 2.securct命令 sz用法(send相对于服务器): 下载一个文件 sz filename  下载多个文件 sz filename1 filename2 下载test目录下的所有文件,不包含test的文件夹 sz test/* rz用法(received相对于服务器): 进入要上传到的文件夹,然后输入rz

Ubuntu中为Android系统实现内置Java应用程序测试Application Frameworks层的硬件服务_Android

我们在Android系统增加硬件服务的目的是为了让应用层的APP能够通过Java接口来访问硬件服务.那么, APP如何通过Java接口来访问Application Frameworks层提供的硬件服务呢?在这一篇文章中,我们将在Android系统的应用层增加一个内置的应用程序,这个内置的应用程序通过ServiceManager接口获取指定的服务,然后通过这个服务来获得硬件服务.        一. 参照在Ubuntu Android实现Application Frameworks层增加硬件访问服

Android 系统中 Location Service 的实现与架构

前言 定位服务是移动设备上最常用的功能之一,下文以 Android 源码为基础,详细分析了 Android 系统中定 位服务的架构和实现.定位服务是 Android 系统提供的一项系统服务,在 Android 系统中,所有系统服务 的架构都是类似的.只要明白其中一个,然后再去理解其他是很容易的.对于 Android 的应用开发人员来说 ,本文可以帮助他们了解他们所使用的 API 背后的实现.对于 Android 的系统开发人员来说,本文可以帮 助他们更好的了解 Android 系统架构.关于如何