首页 文章

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

提问于
浏览
0

基于the docs用于将您的应用程序配置为共享媒体文件的平台,如何使用FileProvider存储实际文件而不是其原始URI位置,即使我已经从Intent提供了URI?例如,如果我想要一个"content://com.android.sample.fileprovider/my_images/JPEG_20180315_162048_-1397281749.jpg"的URI字符串 . 因为截至目前,我使用以下代码获得"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 回答

  • 1

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

    第1步:在 Activity 上调用 getContentResolver() ,获得 ContentResolver

    步骤2:在 ContentResolver 上调用 openInputStream() ,获取 Uri 标识的内容 InputStream

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

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

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

    首先,并不要求每个Android应用程序的每个开发人员都使用 FileProvider 通过 ACTION_SEND 向您发送流 .

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

相关问题