最近在做一個較簡單的項目:通過一個webview來顯示一個網頁的App
這個網頁有下載的功能,關於這一功能需要用到兩個知識點:
1、webview監聽網頁的下載鏈接。(webview默認情況下是沒有開啟,在這個情況下,你會發現,在瀏覽器上可以正常下載的網頁里的某個點擊。在你的webview里面,點擊是沒有反應的);
2、使用系統的DownloadManager進行下載。
提前說下,在這兩個小知識點遇到的坑:
1、第一個坑,就是前面說的,需要Webview開啟下載監聽,否則,你會發現,點擊下載,沒有反應。
extends Activity implements DownloadListener //這里某個類實現這個下載監聽
@Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { startDownload(url); }
2、第二個坑,已經開啟下載監聽,但是依舊點擊沒有反應。並且,這個網站在pc瀏覽器上,點擊相應的下載鏈接,能夠下載。這會兒就陷入巨坑,緊接着要抓狂了。不斷的查看是不是自己少寫了什么。不過包括看了API也就這兩行代碼。最后在Android的瀏覽器上面發現也不能夠下載,這會兒我就理直氣壯得找網頁開發端,告訴他們,你們的網頁不能夠下載。他們的解決辦法就是將這個下載鏈接新開一個頁簽。結果神奇得可以了。安卓瀏覽器能夠正常得下載網頁相應的鏈接,我的webview也就能夠監聽到網頁下載點擊事件。
能夠監聽到下載點擊事件,那么接下來就是使用這個監聽到的url進行下載。起初我想到的是像遠程更新APP一樣的方案:通過一個IO,將文件下載到指定的文件路徑,然后通過Intent進行安裝。顯然這樣可以,不過過於麻煩,因為系統提供了DownloadManager比較簡單。代碼如下:
private void startDownload(String url) { dm = (DownloadManager) this.getSystemService(Context.DOWNLOAD_SERVICE); DownloadManager.Request request = new DownloadManager.Request( Uri.parse(url)); request.setMimeType("application/vnd.android.package-archive"); request.setVisibleInDownloadsUi(true); request.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, "fileName"); enqueue = dm.enqueue(request); }
3、第三個坑就是,插入了這段代碼后,貌似可以下載了。為什么說貌似呢,因為手機頂部已經能夠看到這個下載的標志,但是沒有多久就消失了。並且下拉看不到已下載的項目,此時,就無從點擊安裝下載的app。經過抓狂,以及最后的沉着冷靜,最后發現,只要添加上一段代碼就可以了。
private void startDownload(String url) { dm = (DownloadManager) this.getSystemService(Context.DOWNLOAD_SERVICE); DownloadManager.Request request = new DownloadManager.Request( Uri.parse(url)); request.setMimeType("application/vnd.android.package-archive"); request.setVisibleInDownloadsUi(true); request.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS,"fileName");
//添加下面這段代碼 //添加下面這段代碼
request.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
enqueue = dm.enqueue(request); }
此時就能夠在下拉,看到所下載的項目,點擊,對下載的app進行安裝。
至此實現了:
1、webview監聽網頁的下載鏈接。
2、使用系統的DownloadManager進行下載。