2016-12-06 29 views
3

我有一個適用於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)它說它應該工作,但不要再推薦這種方式。否則,它不起作用。

有沒有新的想法?

+1

您試圖使用哪種PDF查看器?你認爲什麼是「路徑」的價值?什麼是'getViewPDFIntent()'? – CommonsWare

+0

嗨@CommonsWare我修改了回答你的問題的代碼。謝謝。 – Christian

+1

一旦你將'targetSdkVersion'提升到25或更高,''''Uri'就不能在Android 7.0+上運行,所以你可能希望已經開始移動到'FileProvider'。而且,正如我以前所問,您試圖使用哪種PDF查看器? – CommonsWare

回答

1

經過幾天的研究和一些人的參與,我們得出的結論是Android改變了Android 7上DownloadManager的行爲以添加FileProvider的權限。 (在他們解釋的Android 7更新日誌中)

我的感覺是Android自從Android 7(和7.1)以後,可能會將文件保存在臨時文件夾中,然後發送廣播FileDownloadedSuccessfully,然後將文件移動到最終目標文件夾。

由於FileDownloaded廣播在文件移動之前跳轉,因此無法將其打開。這就是爲什麼在調試或放置10秒鐘的睡眠時,它就可以工作。

沒有找到任何解決方案這個問題比停止使用DownloaderManager下載&打開並實現我自己的。 (僅用於下載文件,不涉及任何其他操作)。

希望它有助於下一個誰發現這個問題。

-1

編輯:
解決發現 有點挖已經顯示出,這似乎是一個權限問題。設置這個權限解決了這個問題,它非常奇怪,它完全可以解決問題。

「android.permission.READ_EXTERNAL_STORAGE」


雖然這個心不是真的一個回答的更多信息,以幫助識別和周圍提供一個可怕的工作,我不能作出評論。

我在使用AsyncTask下載PDF後出現同樣的問題。

doInBackground()正確完成,所有讀/寫流都關閉,使用此代碼調用onPostExecute()。

\t \t  Intent target = new Intent(Intent.ACTION_VIEW); 
 
\t \t  target.setDataAndType(Uri.fromFile(file), "application/pdf"); 
 
\t \t  target.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
 
      Intent intent = Intent.createChooser(target, "View PDF Bill...");

和PDF失敗,無效的格式錯誤推出。

第二次加載(加載在現有PDF的頂部)啓動PDF查看器大多數時間都正常工作,但仍然偶爾會失敗。

如果我調試它打開罰款(我認爲由於所花費的時間),如果我添加10秒睡眠它工作正常,如果我添加一個9秒睡眠它doens't。它幾乎就好像在操作系統中關閉文件或其他終止調用時出現故障一樣,並且超時但不會引發異常。

的10秒延遲適用即使我嘗試打開從ES的PDF文件瀏覽器

的代碼上比Android 7.0下的所有設備工作正常。