【问题标题】:Intent with ACTION_VIEW and uri pointing to a ParcelFileDescriptor in EXTRA_STREAM意图与 ACTION_VIEW 和 uri 指向 EXTRA_STREAM 中的 ParcelFileDescriptor
【发布时间】:2014-04-19 13:01:29
【问题描述】:

我应该如何形成在第 3 方查看者中显示我的应用内容的意图的正确方法是什么?我需要在画廊(或任何其他图像查看器)中显示图像,在某些 pdf 阅读器中显示 pdf,..

数据通过实现 openFile() 方法并返回输出管道的内容提供程序获取服务器..

ParcelFileDescriptor[] pipe=ParcelFileDescriptor.createPipe();
...
ParcelFileDescriptor.AutoCloseOutputStream stream = new ParcelFileDescriptor.AutoCloseOutputStream(pipe[1]);
PipeThread pipeThread = new PipeThread(fileContents, stream);
pipeThread.start();
return pipe[0];

对于图片我使用这个:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_STREAM, uri);

然后我像往常一样为此意图创建一个选择器,这不是问题.. 我的问题是,尽管我在选择器中看到了例如照片应用程序,但我只是无法打开其中的文件..它只是打开带有我的图像的画廊。 当我使用发送操作时,它正在工作,像 gmail、drive、dropbox 等应用程序都能够正确地从提供程序读取图像。 此外,Skitch 似乎是我测试过的唯一一款能够使用Intent.ACTION_VIEW 操作打开图像的应用程序。

请不要告诉我我应该只发送 URI,我确实需要将文件作为流或以某种方式作为一系列字节提供(IPC 限制可能会反对这一点)。我无法将文件保存到公共目录。

【问题讨论】:

    标签: android android-intent stream android-contentprovider


    【解决方案1】:

    所以问题是在两个单独的方法调用中设置 Intent 类型和数据.. 我不知道的是Intent.setType()清除了它的数据,Intent.setData()清除了它的类型..

    当我通过 Intent.setDataAndType() 方法调用同时设置数据和类型时,它甚至适用于指向流的 URI。

    不幸的是,最终的实现仍然无法在所有地方完美运行。 它适用于默认的 android 画廊应用程序、G+ 照片应用程序、QuickPic 和索尼画廊应用程序,但它不适用于默认的 HTC 画廊和默认的三星画廊。 遗憾的是,它实际上并不那么依赖于我的实现,而是它在 3rd 方查看器应用程序中的实现方式。

    【讨论】:

      猜你喜欢
      • 2013-07-18
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      • 1970-01-01
      • 2019-07-22
      相关资源
      最近更新 更多