【问题标题】:How to open a file in Android via an Intent如何通过 Intent 在 Android 中打开文件
【发布时间】:2012-09-17 03:15:18
【问题描述】:

如何打开以前存储在“privat”文件系统中的文件?该文件正在由 Web 服务下载,应存储在本地 fs 上。 尝试通过 Intent (Action_View) 打开文件时出现“奇怪”错误。尽管该文件存在于文件系统中(在 emulator/eclipse 的文件资源管理器中看到该文件),但它不会显示在启动的调用 galery 活动中。画廊显示的不是图片,而是一个没有内容的黑屏(操作栏除外)。尝试通过此方法打开 pdf/movie/mp3 文件时也会发生同样的情况(例如,pdf 表示文件已损坏)。

顺便说一句:已经存储在本地 fs 上的数据是有效的(没有损坏),我从调试器(通过 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();
    }
}           

【问题讨论】:

标签: android android-intent filesystems actionview


【解决方案1】:

您的代码中附件的类型是什么?也许它返回错误的 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 阅读器),但内容(文件)似乎无效。 ..
  • 附件返回正确的 mimetype,否则根本不会启动正确的活动(Galery/Mediaplayer/PDF-Reader)。
  • 错了。 getMimeTypeFromExtension 的参数必须是没有前导“.”的文件扩展名。
  • 对我有用。我打电话给Uri.parse(file.getPath()) 而不是Uri.fromFile(file)
【解决方案2】:

将位置设置为“openFileOutput("fileName", Activity.MODE_WORLD_READABLE)”时,它将起作用。设置为“Context.MODE_PRIVATE”时,其他应用无法读取存储的数据(即使查看)

other post on stackoverflow

【讨论】:

    【解决方案3】:

    你不能像这样打开不在 sdcard 上的文件。 您需要将文件复制到 SD 卡,然后打开它。

    【讨论】:

    • 你能给我一个链接,这是由谷歌确认的(在 sdk 文档中)。我在官方文档中没有找到任何相关内容...顺便说一句:当我在自己的可以处理图像的活动中打开文件时,它可以工作...
    • 不幸的是,我说的是经验,所以我没有链接。但它与上传或通过电子邮件发送 SDCARD 中不存在的文件时存在相同的问题...打开 webview 页面等时也是如此。希望对您有所帮助...抱歉,如果没有...
    • 所以我必须编写自己的查看器-“活动”来处理存储在此私人文件夹中的文件?
    • 或者只是将它们复制到 SDCARD 上的私人文件夹中,如果您想在之后删除它们。 SDCARD 上的私有(实际上不可见)文件夹:Environment.getExternalStorageDirectory() + "/.priavte_dir"
    • 但是之后文件将可以访问(通过另一个应用程序,例如文件浏览器应用程序).​​.....另外,你必须暗示用户有一个 sd 卡,它必须是也装了。嗯……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    相关资源
    最近更新 更多