我试图打开使用DownloadManager下载的文件。下载完成后我收到本地文件名。之后,我建议我的用户打开文件(或拒绝)。我用来打开文件的方法是:
private void openFile(String fileName) {
MimeTypeMap map = MimeTypeMap.getSingleton();
String ext = MimeTypeMap.getFileExtensionFromUrl((fileName));
String type = map.getMimeTypeFromExtension(ext);
Intent install = new Intent(Intent.ACTION_VIEW);
Log.d(TAG, "openFile Trying to open file: " + Uri.fromFile(new File(fileName)));
install.setDataAndType(Uri.fromFile(new File(fileName)), type);
try {
mCx.startActivity(install);
} catch (Exception e) {
//Si no hay ninguna app capaz de abrir el archivo, fallará.
e.printStackTrace();
Toast.makeText(mCx, mCx.getString(R.string.sin_app_archivo), Toast.LENGTH_LONG).show();
}
}
我传递给该方法的文件名是从DownloadManager查询方法接收的:
@Override
public void onReceive(Context context, Intent intent) {
long reference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
if (myDownloadreference == reference) {
Log.d(TAG, "onReceive descarga es la nuestra");
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterById(reference);
Cursor cursor = mDownloadManager.query(query);
cursor.moveToFirst();
int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
//This is String I pass to openFile method
String savedFilePath = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
...
}
}
它通常适用于大多数文件类型。如果没有任何应用能够打开它,它将显示Toast
。
奇怪的行为发生在名称中包含空格的文件中。当我执行openFile方法时,它总是显示Toast(即使安装了该mime类型的应用程序)。然而,通过单击DownloadManager通知,Android打开PDF文件(如果两个或更多应用程序可以处理文件打开,则显示应用程序选择器)。那么,当用户点击通知时,SO启动的Intent是什么?如何更改我的方法以打开其名称上还有空格的文件?
可以使用openFile方法打开的文件示例:
D / GdDocumentacionDownloaderHelper:openFile试图打开文件:file:///storage/emulated/0/Android/data/es.ineco.app/files/Download/ic_action_delete-11.zip
另一个无法使用openFile方法打开的文件示例:
D / GdDocumentacionDownloaderHelper:openFile试图打开文件: 文件:///storage/emulated/0/Android/data/es.ineco.app/files/Download/10-02_Prevbat_363%2B570_363%2B820_V1%20(1)-5.pdf
修改
在@CommonsWare建议之后,它现在正在运行。问题在于我从DownloadManager使用的收到的参数。在我的openFile()
方法中使用的正确文件名是
cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
而不是:
cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));