若是你是apk或者android系統能夠識別的問題,那麼必定是服務器MIME文件類型沒有配置正確 java
APK文件配置以下: android
<mime-mapping> <extension>apk</extension> <mime-type>applicationnd/vnd.android.package-archive</mime-type> </mime-mapping>
下面是android不能下載自定義文件或者不能識別問題的解決方案。 瀏覽器
Android的默認瀏覽器,在下載文件時,會驗證MimeType,若是這個MimeType不被「識別」,那麼Download Manager會拒絕對其進行下載。Download Crutch可讓Download Manager無論是不是可識別的MimeType都進行下載。
凡是掛入系統的應用,總讓人以爲很神奇。而Download Crutch這個小軟件,更是實現的很是巧妙,理論上講,它能夠一行代碼都不寫就實現這個功能。
想要探究Download Crutch的工做原理,咱們就要從Browser和Download Manager的工做原理提及。 服務器
Browser的核心是WebView組件,它負責處理全部WebView能夠接受(或者說顯示)的文件類型。好比HTML頁面,或者各類 Image。當WebView遇到一個他不認識的MimeType時,好比application/zip,它就會把它提交給 DownloadManager,請求DownloadManager進行下載。
DownloadManager在接收到下載請求的時候,並會立 即啓動HTTP線程進行下載,它先會構造一個Intent,詢問系統內是否有某個應用程序對這個要下載的文件類型該興趣(或者說,能夠在下載後處理這種文 件類型)。若是迴應的結果是沒有哪一個應用程序處理這個MimeType,那麼DownloadManager會拒絕下載這個文件。關鍵代碼以下: app
/* * file: DownloadService.java * package: com.android.providers.downloads */ Intent mimetypeIntent = new Intent(Intent.ACTION_VIEW); mimetypeIntent.setDataAndType(Uri.fromParts("file", "", null), info.mimetype); ResolveInfo ri = getPackageManager().resolveActivity(mimetypeIntent, PackageManager.MATCH_DEFAULT_ONLY); //若是找不到ResolveInfo,則認爲沒有應用程序能夠處理這種mimetype。 //下載工做將被終止 if (ri == null) { …… return; }
因此,要想解決DownloadManager拒絕下載的問題,只須要編寫一個應用程序,告訴系統全部的MimeType我都能處理,你就儘管下吧。因而就誕生了DownloadCrutch。
要實現DownloadCrutch的功能,只須要創建一個Android Project,編寫一個空的Activity,命名爲DownloadCrutch,而且在AndroidManifest.xml裏進行註冊。關鍵代碼以下 ide
<activity android:name=".DownloadCrutch"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="file" /> <data android:mimeType="*/*" /> </intent-filter> </activity>
其中,android:scheme標記對file://xxxxx的URI結構進行處理,android:mimeType標記能夠處理任意類型的文件。 spa
如今你的文件能默認瀏覽器下載下來了,你打開文件後就會條跳轉到DownloadCrutch這個activity,後面就須要本身編寫代碼處理文件了。 線程