代码之家  ›  专栏  ›  技术社区  ›  DaveNOTDavid

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

  •  0
  • DaveNOTDavid  · 技术社区  · 6 年前

    基于 the docs 用于将应用程序配置为共享媒体文件的平台,如何使用 FileProvider 即使我已经从意图中获得了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 回复  |  直到 6 年前
        1
  •  1
  •   CommonsWare    6 年前

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

    步骤#1:呼叫 getContentResolver() 在您的 Activity ,以获取 ContentResolver

    第2步:呼叫 openInputStream() 内容解析器 ,以获取 InputStream 关于 Uri

    步骤#3:从 输入流 到某物(例如 FileOutputStream 在您控制的文件上)

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

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

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

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