将每个Uri转换为文件

时间:2016-01-29 21:06:39

标签: android uri android-contentprovider

我的活动获得了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转换为文件,我怎么能自己做呢?

1 个答案:

答案 0 :(得分:1)

  

我想知道像Google Keep这样的应用程序如何知道将所有这些Uri转换为文件

我不知道为什么你认为Google Keep会将所有这些Uri转换成文件&#34;。

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

理想情况下,您只需使用流。如果出于某种原因,您绝对必须拥有一个文件,请使用该流为您的应用程序创建数据的本地副本,并在您指定的位置为您提供文件系统访问权限。再一次,这与使用httphttps网址没有什么明显不同,在这些网址中,除了使用流下载内容之外,您无法将网址神奇地转换为文件。

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

  • 您的应用可以设想访问的文件

  • 您的应用无法访问的文件,因为您无权访问该位置(例如,其他应用的内部存储空间)

  • 本地设备上不存在的文件,但需要由其他应用程序下载以响应某个应用程序要求提供的内容

  • 一个本地文件但加密存储并需要解密的文件

  • 即时生成的文件,就像此网页

  • 一样
  • 依此类推

因此,将Uri视为句柄,获取Uri指向的内容的流,并且不要担心该内容实际来自何处。