2016-01-29 51 views
0

我的活动获得shared intent,可能与媒体。 这里是Activity声明:转换每个Uri到文件

<activity 
     android:name=".name" 
     android:excludeFromRecents="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="name"> 
     <intent-filter> 
      <action android:name="android.intent.action.SEND" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <data android:mimeType="image/*" /> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.intent.action.SEND" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <data android:mimeType="text/plain" /> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.intent.action.SEND_MULTIPLE" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <data android:mimeType="image/*" /> 
     </intent-filter> 
    </activity> 

我提取使用以下代码的媒体:

Uri mediaUri = intent.getParcelableExtra(Intent.EXTRA_STREAM); 

不幸的是,媒体采用的是Uri(可能是content://或任何其他)
我想知道例如Google Keep等应用程序知道如何将所有这些Uri文件转换为文件,我该怎么做?

回答

1

我想知道像谷歌的应用程序是如何保持,例如,知道所有这些的URI转换为文件

我不知道为什么你认为谷歌保存会“将所有这些的URI到文件”。

A Uri类似于URL。这是一个不透明的远程资源句柄,您可以通过应用程序中的流访问它。对于Uri,您使用ContentResolver来获取该流,而不是使用某些HTTP客户端API(例如HttpUrlConnection,OkHttp)获取由Web URL表示的数据流。

理想情况下,您只需使用流。如果由于某种原因,您绝对是必须有文件,请使用该流在您指定的位置为您的应用程序创建数据的本地副本,您可以为其访问文件系统。再次,这与使用httphttps网址的工作方式没有太大区别,在这种网址中,除了使用流下载内容之外,您无法将URL神奇地转换为文件。

请记住,Uri不必指向文件,就像URL不必指向文件一样。例如,此Web页面的URL很可能与某个服务器上的某个文件不对应。相反,网页可能是由Web应用程序生成的。 Uri也是如此。该Uri可以指向:

  • 您的应用程序可以想见访问

  • 一个文件的文件,你的应用程序无法访问,因为你没有权利到该位置(例如,另一个应用程序的内部存储)

  • 不会在本地设备上存在的,而是需要通过响应某些应用程序中的其他应用程序要求的内容

  • 文件被下载的文件这是本地,而是保存加密,需要解密

  • 是实时生成的文件,就像这个网页是

因此,将Uri当作句柄,获取该Uri指向的内容的流,并且不必担心内容实际来自哪里。

+0

谢谢,不应该有任何保证不能够访问该文件,因为它来自“共享”意图?我需要这个文件来创建一个'MimeMessage'并发送一封附带这个文件的电子邮件,我可以在没有获取物理文件的情况下执行吗? – SagiLow

+0

@SagiLow:“不应该有任何担保病态能够访问文件,因为它来自共享意图?” - 没有。请重新阅读我的答案,特别是项目符号列表。 “我可以在没有获得物理文件的情况下做到这一点” - 正如我在回答中所写的那样:如果由于某种原因,您绝对必须拥有一个文件,请使用该流为您的应用在某个地方制作本地数据副本您指定的文件系统访问权限。 – CommonsWare

+0

您能否请我分享或指出我如何检查辅助功能并从“Uri”中获取流? – SagiLow