基于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())
}
}
答案 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
向您发送流。
其次,您很可能无论如何都没有文件系统访问该文件。