检索实际文件而不是URI原始位置

时间:2018-03-19 20:41:17

标签: android android-file android-fileprovider

基于the docs用于将您的应用配置为共享媒体文件的平台,如何使用FileProvider存储实际文件而不是其原始URI位置,即使我已经从意图中提供了一个URI?例如,如果我想要一个URI内容为“content://com.android.sample.fileprovider/my_images/JPEG_20180315_162048_-1397281749.jpg”。因为截至目前,我使用以下代码获取“content:// media / external / images / media / 142607”:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_media)


        val intent = intent
        val action = intent.action
        val type = intent.type

        type?.let {
            when (action) {
                Intent.ACTION_SEND -> {
                    if (it == getString(R.string.mime_type_text)) {
                        handleSendText(intent)
                    } else if (it.startsWith(getString(R.string.mime_type_image_any))) {
                        handleSendImage(intent)
                    }
                }
        }
}

private fun handleSendImage(intent: Intent?) {
        val imageUri = intent?.getParcelableExtra<Uri>(Intent.EXTRA_STREAM)
        imageUri?.let {

            // Logs "content://media/external/images/media/142607"
            Log.d("tag", it.toString())

            // Logs "/external/images/media/142607"
            Log.d("tag", File(it.path).toString())
        }       
}

1 个答案:

答案 0 :(得分:1)

  

如何存储实际文件而不是其原始URI位置

第1步:致电getContentResolver()上的Activity,获取ContentResolver

步骤2:致电openInputStream()上的ContentResolver,获取InputStream

标识的内容Uri

步骤3:将InputStream中的字节复制到某个(例如,您控制的文件上的FileOutputStream

步骤#4:一旦完成所有工作,将其移至后台线程,以便您的I / O不会占用主应用程序线程

  

例如,如果我想要一个URI内容为“content://com.android.sample.fileprovider/my_images/JPEG_20180315_162048_-1397281749.jpg”

首先,并不要求每个Android应用的每个开发者都使用FileProvider通过ACTION_SEND向您发送流。

其次,您很可能无论如何都没有文件系统访问该文件。