網絡鏈接和下載

鏈接 Internet 資源

須要在 manifest 文件中配置 <user-permission android:name="android.permission.INTERNET" />java

在最新版本的 Android 上在 UI 線程上執行網絡操做會引起 NetworkOnMainThreadException 異常,必定要再後臺線程中執行。android

try {
    URL url = new URL("http://www.baiud.com");

    // 建立 HTTP URL 鏈接
    URLConnection connection = url.openConnection();
    HttpURLConnection httpConnection = (HttpURLConnection) connection;

    int responseCode = httpConnection.getResponseCode();
    if (responseCode == HttpURLConnection.HTTP_OK) {
        InputStream in = httpConnection.getInputStream();
        processStream(in);
    }
} catch (Exception e) {
    Log.d("TAG", "IO Exception.");
}


下載文件

在 android 2.3(API Level 9)中引入了 Download Manager,做爲一個 Service 來優化長時間下載操做的處理。Download Manager 經過處理 HTTP 鏈接、監控鏈接的變化和系統從新啓動來確保每一次下載都能成功完成。api

Download Manager 能夠在多個回話之間在後臺繼續進行下載。能夠經過 getSystemService 方法請求 DOWNLOAD_SERVICE 得到一個 Download Manager 對象。緩存

String serviceString = Context.DOWNLOAD_SERVICE;
DownloadManager downloadManager;
downloadManager = (DownloadManager) getSystemService(serviceString);

Uri uri = Uri.parse("http://api.amap.com/Public/down/AMap_Android_2DMap_Lib_V2.2.0.zip");

DownloadManager.Request request = new Request(uri);

// 設置 Notification
request.setTitle("襄陽公交"); // 設置標題
request.setDescription("襄陽公交是一個很方便的產品。"); // 設置描述

// 設置 Notification 的顯示模式
request.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);

// 設置限制下載的網絡類型(移動網絡或WIFI)
// request.setAllowedNetworkTypes(Request.NETWORK_WIFI);

// 設置手機漫遊時限制下載
// request.setAllowedOverRoaming(false);

// 設置根據系統限制的下載文件大小,是否要肯定下載
// DownloadManager.getRecommendedMaxBytesOverMobile(this);

// 使下載的文件能夠被掃描器掃描到
request.allowScanningByMediaScanner();

// 使 系統的下載管理器中能夠查看到
request.setVisibleInDownloadsUi(true);

默認狀況下下載的文件是不會被掃描到的網絡

Request 的 setNotificationVisibility 方法支持一下幾種顯示方式:ide

  1. Request.VISIBILITY_VISIBLE 下載時顯示,下載完成移除
  2. Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED 下載時和下載完成都顯示,選擇或取消時移除
  3. Request.VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETED 下載完成後顯示
  4. Request.VISIBILITY_HIDDENT 不顯示,不過須要指定 DOWNLOAD_WITHOUT_NOTIFITICATION 的權限時有效。


指定下載文件位置

默認狀況下,DownloadManager 會把下載的文件保存在共享下載緩存中,並且使用系統生成的文件名。每一個下載文件均可以指定一個下載位置,可是全部的下載都必須存儲到外部存儲器中。並且須要設置外部存儲器的寫入權限:
<uses-permission android:name="android.permission.WRITE_EXTRANL_STORAGE" />優化



指定下載路徑:this

// 在外部存儲器上指定文件路徑
request.setDestinationUri(Uri.fromFile(f));

// 在應用程序的外部存儲文件夾中存儲一個文件
request.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, "tm.apk");

// 外部存儲器的公共目錄下指定一個文件夾來存儲文件
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_MUSIC, "android.mp3");

取消和刪除下載

能夠經過 DownloadManager 的 remove 方法取消一個正在等待的下載。已經下載的關聯文件也會被刪除。
downloadManager.remove(myReference);url

查詢 Download Manager

能夠經過 query 方法查詢 DownloadManager 來獲得下載請求的狀態、進度和詳細信息,該方法會返回下載的 Cursor 對象。線程

BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        long reference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
        if (myReference == reference) {
            Query query = new Query();
            query.setFilterById(myReference);

            Cursor cursor = downloadManager.query(query);
            if (cursor.moveToFirst()) {
                int fileNameIdx = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME);
                int fileUriIdx = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI);

                String fileName = cursor.getString(fileNameIdx);
                String fileUri = cursor.getString(fileUriIdx);
            }

            cursor.close();
        }
    }
};
相關文章
相關標籤/搜索