我有一個適用於Android 4,5和6的應用程序。該應用程序列出服務器中的遠程文件,並允許您從服務器下載它們(PDF文件)。一旦你點擊一個文件,它將它下載到「Android Downloads文件夾」上,當它完成時,它會用默認的PDF閱讀器打開它。Android 7 - 無法顯示PDF(pdf_name格式無效)
問題是,Android 7中的相同代碼未能給出下一個錯誤:「無法顯示PDF(pdf_name是無效格式)」。
這很有趣,因爲:
- 如果我訪問下載文件夾,點擊下載的文件,它會打開正確。
- 下載完成後,會顯示一條通知,點擊它即可正常打開它。
所以,只有當相同的應用程序嘗試下載它後自動打開文件時,纔會出現問題。
我怎麼辦下載:
fileName="file.pdf";
request = new DownloadManager.Request(Uri.parse(Constants.GetURL()));
request.setMimeType(mime)
.setTitle(fileName).setVisibleInDownloadsUi(true)
.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE)
.setDescription(mContext.getString(R.string.app_name))
.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);
enqueue = dm.enqueue(request);
一旦下載:
Uri path = Uri.parse(c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)));
//path contains the route where file was downloaded. Something like: file:///storage/emulated/0/Download/file.pdf
Intent pdfOpenintent = IntentHelper.getViewPDFIntent(path);
mContext.startActivity(pdfOpenintent);
我怎麼打開它:
public static Intent getViewPDFIntent(Uri path){
Intent i = new Intent(Intent.ACTION_VIEW);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
pdfOpenintent.setDataAndType(path, "application/pdf");
return i;
}
關於FileProvider: 我一直在使用實施FileProvider和問題是t他一樣。它與權限無關,下載文件夾是公用文件夾,並且沒有SecurityException引發或任何其他與權限相關的異常。
它與任何PDF應用程序無關,因爲它發生與Gmail共享發送文檔的相同內容。
Extrange行爲:當我一步一步地調試應用程序,它完美的作品。當我執行正常時,它失敗。如果我睡覺或延遲5秒,不起作用。所以只能調試。
關於安卓7:閱讀Android 7的正式更改(https://developer.android.com/about/versions/nougat/android-7.0-changes.html)它說它應該工作,但不要再推薦這種方式。否則,它不起作用。
有沒有新的想法?
您試圖使用哪種PDF查看器?你認爲什麼是「路徑」的價值?什麼是'getViewPDFIntent()'? – CommonsWare
嗨@CommonsWare我修改了回答你的問題的代碼。謝謝。 – Christian
一旦你將'targetSdkVersion'提升到25或更高,''''Uri'就不能在Android 7.0+上運行,所以你可能希望已經開始移動到'FileProvider'。而且,正如我以前所問,您試圖使用哪種PDF查看器? – CommonsWare