目的
使用DownloadManager下載檔案,並取出下載進度
問題
- permission denial
解:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> - 使用 DownloadManager.Request.VISIBILITY_HIDDEN 時,發生SecurityException
解:
加入<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
實作
public class DownloadActivity extends Activity { private TextView mConsole; private void setupUnit() { mConsole = (TextView) findViewById(R.id.console); } private void init() { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_download); setupUnit(); init(); Downloader d = new Downloader(); d.download(this, "http://www.wall001.com/1280x1024/" + "1280_1024_nature_scene_wallpapers_06/" + "mxxx01/1280_1024_nature_wallpaper_3210710877.jpg"); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_download, menu); return true; } private Handler mHander = new Handler() { public void handleMessage(Message msg) { String log = (String) msg.obj; mConsole.append(log); } }; private class Downloader { DownloadManager downloadManager; long downloadId; boolean is = true; Cursor c; public void download(Context context, String url) { downloadManager = (DownloadManager) context .getSystemService(Context.DOWNLOAD_SERVICE); Uri uri = Uri.parse(url); downloadId= downloadManager.enqueue(new DownloadManager.Request( uri) .setAllowedNetworkTypes( DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE) .setAllowedOverRoaming(false) .setNotificationVisibility( DownloadManager.Request.VISIBILITY_HIDDEN) .setDestinationInExternalPublicDir( Environment.DIRECTORY_DOWNLOADS, "test.jpg")); final Query query = new DownloadManager.Query(); query.setFilterById(downloadId); // 取出下載進度 new Thread(new Runnable() { long size = 0; long total = 0; @Override public void run() { while (is) { c = downloadManager.query(query); if (c != null) { if (c.moveToFirst()) { size = c.getInt(c .getColumnIndex( downloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); total = c.getLong(c .getColumnIndex(downloadManager.COLUMN_TOTAL_SIZE_BYTES)); mHander.sendMessage(mHander.obtainMessage(-1, "Progress- " + size + " / " + total + "\n")); if (size == total) is = false; } } try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } } }