将每个 Uri 转换为文件
Convert every Uri to file
我的 activity 得到一个 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 转换为文件,我该如何自己做?
I was wondering how apps like Google Keep for example, knows to convert all these Uri's to files
我不知道你为什么这么想 Google 保持意志 "convert all these Uri's to files".
Uri
类似于 URL。它是远程资源的不透明句柄,您可以通过应用程序中的流访问该资源。在 Uri
的情况下,您使用 ContentResolver
来获取该流,而不是使用某些 HTTP 客户端 API(例如,HttpUrlConnection
、OkHttp)来获取流在 Web URL.
表示的数据上
理想情况下,您只需使用流。如果由于某种原因你绝对必须有一个文件,使用流为你的应用程序制作数据的本地副本,在你指定的地方,你有文件系统访问权限.再一次,这与使用 http
或 https
URLs 没有太大区别,在后者中你不能神奇地将 URL 转换为文件,除非使用流下载内容。
请记住,Uri
不必指向文件,就像 URL 不必指向文件一样。例如,此网页的 URL 很可能不对应某处服务器上的某个文件。相反,该网页可能是由 Web 应用程序生成的。 Uri
也是如此。 Uri
可能指向:
您的应用可以访问的文件
您的应用无法访问的文件,因为您无权访问该位置(例如,另一个应用的内部存储)
本地设备上不存在的文件,但需要由其他应用程序下载以响应某些应用程序请求内容
本地文件加密存储,需要解密
一个动态生成的文件,就像这个网页一样
等等
因此,将 Uri
视为句柄,获取有关 Uri
指向的内容的流,而不必担心该内容实际来自何处。
我的 activity 得到一个 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 转换为文件,我该如何自己做?
I was wondering how apps like Google Keep for example, knows to convert all these Uri's to files
我不知道你为什么这么想 Google 保持意志 "convert all these Uri's to files".
Uri
类似于 URL。它是远程资源的不透明句柄,您可以通过应用程序中的流访问该资源。在 Uri
的情况下,您使用 ContentResolver
来获取该流,而不是使用某些 HTTP 客户端 API(例如,HttpUrlConnection
、OkHttp)来获取流在 Web URL.
理想情况下,您只需使用流。如果由于某种原因你绝对必须有一个文件,使用流为你的应用程序制作数据的本地副本,在你指定的地方,你有文件系统访问权限.再一次,这与使用 http
或 https
URLs 没有太大区别,在后者中你不能神奇地将 URL 转换为文件,除非使用流下载内容。
请记住,Uri
不必指向文件,就像 URL 不必指向文件一样。例如,此网页的 URL 很可能不对应某处服务器上的某个文件。相反,该网页可能是由 Web 应用程序生成的。 Uri
也是如此。 Uri
可能指向:
您的应用可以访问的文件
您的应用无法访问的文件,因为您无权访问该位置(例如,另一个应用的内部存储)
本地设备上不存在的文件,但需要由其他应用程序下载以响应某些应用程序请求内容
本地文件加密存储,需要解密
一个动态生成的文件,就像这个网页一样
等等
因此,将 Uri
视为句柄,获取有关 Uri
指向的内容的流,而不必担心该内容实际来自何处。