如何通过意图在Android中打开文件

16
如何打开先前存储在“privat”文件系统中的文件?该文件是通过webservice下载并应该被存储在本地文件系统中。尝试使用Intent(Action_View)打开文件时出现“奇怪”的错误。虽然文件存在于文件系统中(在模拟器/ Eclipse中的文件浏览器中看到了文件),但它不会显示在启动的相册活动中。相反,相册显示一个黑屏,里面没有任何内容(除了操作栏)。当尝试通过此方法打开pdf /电影/ mp3文件时,情况也是如此(例如,pdf表示文件已损坏)。
顺便说一下:已存储在本地文件系统上的数据是有效的(未损坏),我通过调试器从中下载了文件(通过pull方法),并且可以在我的工作站上打开这些文件...
public void onAttachment(Context context, Attachment attachment) {
    try {
        //Attachment is a structured data object that contains of a byte[], filename and mimetype (like image/jpeg)
        FileOutputStream fos = FileOutputStream fos = context.openFileOutput(attachment.getAttachmentFileName(), Context.MODE_PRIVATE);
        fos.write(attachment.getBinary());
        fos.flush();
        fos.close();
        File f = context.getFileStreamPath(attachment.getAttachmentFileName());
        Uri uri = Uri.fromFile(f);          
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(uri,attachment.getAttachmentMimetype());
        context.startActivity(intent);                  
    } catch (IOException e) {
        e.printStackTrace();
    }
}           

也许这个链接可以帮到你:https://dev59.com/HGgu5IYBdhLWcg3wzKAb#11088980 - ademar111190
3个回答

12
你的代码中的“Attachment”类型是什么?也许它返回了错误的MIME类型?
这段代码对我有用:
File file = new File("EXAMPLE.JPG");

// Just example, you should parse file name for extension
String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(".JPG");

Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), mime);
startActivityForResult(intent, 10);

不,这样行不通... 问题在于活动已经成功启动(图库、电影/音频播放器、PDF 阅读器),但内容(文件)似乎无效... - tim.kaufner
附件返回正确的MIME类型,否则正确的活动(Galery / Mediaplayer / PDF-Reader)将根本无法启动。 - tim.kaufner
错误。getMimeTypeFromExtension的参数必须是没有前导'.'的文件扩展名。 - user1376112
那对我有用。我之前调用的是Uri.parse(file.getPath())而不是Uri.fromFile(file) - IgniteCoders

2

您不能直接打开不在SD卡上的文件,需要先将文件复制到SD卡上再进行打开。


你能给我一个谷歌确认的链接吗(在sdk文档中)。我在官方文档中没有找到任何相关内容... 顺便说一句:当我在自己的活动中打开文件时,它可以正常工作... - tim.kaufner
不幸的是,我是根据经验谈论的,所以我没有链接。但是,这与上传或发送电子邮件中的文件不在SDCARD中的问题相同...打开Webview页面等也是如此。希望能有所帮助...如果不能,很抱歉。 - Givi
那么我必须编写自己的“活动”查看器,以处理存储在此私有文件夹中的文件? - tim.kaufner
将它们复制到SDCARD上的私人文件夹中,如果您想要删除它们,可以随时进行操作。 SDCARD上的私人文件夹(实际上是不可见的): Environment.getExternalStorageDirectory() + "/.priavte_dir" - Givi
但是在那之后,这些文件将是可访问的(例如,由另一个应用程序,如文件浏览器应用程序)... 同时,您必须暗示用户拥有SD卡,并且它也必须被挂载。嗯… - tim.kaufner

2

当将位置设置为"openFileOutput("fileName", Activity.MODE_WORLD_READABLE)"时,它可以正常工作。当设置为"Context.MODE_PRIVATE"时,其他应用程序无法读取存储的数据(甚至无法查看)。

请参见stackoverflow上的其他帖子


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接