2016-06-10 91 views
0

我有一個應用程序,它爲用戶檢索文件,它使api調用,然後返回到文件的鏈接。我的問題是,應用程序應該在應用程序本身內部顯示文件還是利用手機中存在的任何其他應用程序來查看文件。如果應用程序顯示文件,那麼我應該使用什麼?打開webview和使用谷歌文檔不是一個選項,因爲它非常慢。此外,我正在使用react-native,因此如果有任何組件已經存在,那將會很好,否則我沒有寫橋的問題。Android應用程序查看文檔文件('。docx','.pdf'...)

回答

1

你應該去選擇2.不要試圖自己做所有事情。詢問系統是否有任何可以打開文件的應用程序,如果沒有這樣的應用程序存在,通知用戶沒有應用程序來打開該文件。您也可以提供指向可能打開相關文件的應用程序的鏈接。

使用此方法的重要部分是您需要MIME類型的文件,因爲系統會根據所提供的類型做出決定。此外,您可能需要一個內容提供商,以便其他應用程序可以實際打開沙箱中的文件。幸運的是,框架的確提供了File Provider只是爲了這種情況。如果您沒有將文件存儲在應用程序目錄中,則不需要提供者。

的代碼看起來是這樣的

File yourFile; //expecting the file to exist 
String extension; //expecting the file extension (pdf, doc, ...) to exist 
String mimetype; //may be null. You may obtain the mimetype from the server request in the http Content-Type header. 
if (mimetype == null || mimetype.trim().isEmpty()) { 
    //mimetype does no exist, try to guess mimetype from the extension 
    mimetype = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension); 
} 
if (mimetype == null || mimetype.trim.isEmpty()) { 
    //don't know what the mime type is. All we know is that it is a file we want to open. 
    mimetype = "file/*"; 
} 

Intent openFileIntent = new Intent(Intent.ACTION_VIEW).setDataAndType(Uri.fromFile(yourFile)), mimetype); 

if (openFileIntent.resolveActivity(getPackageManager()) != null) { 
    this.startActivity(openFileIntent); 
} else { 
    Toast.makeText(this, R.string.no_application_can_open_file, Toast.LENGTH_SHORT).show(); 
} 
+0

但我的應用程序是所有有關文件,如果用戶已去到另一個應用程序來查看我提供他不會是打敗鏈接中的文件目的? –

+0

不是。您仍在提取並顯示指向用戶的鏈接。這是應用程序的工作,它應該做得很好。爲其他應用程序委派顯示鏈接內容是這類用例的推薦方式。看看文件管理器等其他應用程序。你很少會找到一個能夠完成所有工作的實現。 – GPuschka