我的活动获得了shared intent
,可能还有媒体。
这是Activity
声明:
<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转换为文件,我怎么能自己做呢?
答案 0 :(得分:1)
我想知道像Google Keep这样的应用程序如何知道将所有这些Uri转换为文件
我不知道为什么你认为Google Keep会将所有这些Uri转换成文件&#34;。
Uri
类似于网址。它是远程资源的不透明句柄,您可以通过应用程序中的流访问它。对于Uri
,您使用ContentResolver
来获取该流,而不是使用某些HTTP客户端API(例如,HttpUrlConnection
,OkHttp)来获取所表示数据的流通过网址。
理想情况下,您只需使用流。如果出于某种原因,您绝对必须拥有一个文件,请使用该流为您的应用程序创建数据的本地副本,并在您指定的位置为您提供文件系统访问权限。再一次,这与使用http
或https
网址没有什么明显不同,在这些网址中,除了使用流下载内容之外,您无法将网址神奇地转换为文件。
请记住,Uri
不必指向文件,就像URL不必指向文件一样。例如,此Web页面的URL很可能与某个服务器上的某个文件不对应。相反,Web页面可能是由Web应用程序生成的。 Uri
也是如此。 Uri
可能指向:
您的应用可以设想访问的文件
您的应用无法访问的文件,因为您无权访问该位置(例如,其他应用的内部存储空间)
本地设备上不存在的文件,但需要由其他应用程序下载以响应某个应用程序要求提供的内容
一个本地文件但加密存储并需要解密的文件
即时生成的文件,就像此网页
依此类推
因此,将Uri
视为句柄,获取Uri
指向的内容的流,并且不要担心该内容实际来自何处。