Получение фактического файла вместо исходного местоположения URI

На основе документации, используемой для настройки вашего приложения в качестве платформы для обмена медиафайлами. , как мне сохранить фактический файл, а не его исходное расположение URI, используя FileProvider, хотя мне уже был предоставлен URI из Intent? Например, если мне нужна строка 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())
        }       
}

person DaveNOTDavid    schedule 19.03.2018    source источник


Ответы (1)


как мне сохранить фактический файл в отличие от его исходного местоположения URI

Шаг № 1. Позвоните getContentResolver() на свой Activity, чтобы получить ContentResolver

Шаг № 2: позвоните openInputStream() на ContentResolver, чтобы получить InputStream по содержанию, идентифицированному Uri

Шаг № 3: Скопируйте байты из InputStream во что-нибудь (например, FileOutputStream в файле, который вы контролируете)

Шаг №4: После того, как вы все это заработаете, переместите его в фоновый поток, чтобы ваш ввод-вывод не связывал основной поток приложения.

Например, если мне нужна строка URI «content: //com.android.sample.fileprovider/my_images/JPEG_20180315_162048_-1397281749.jpg»

Во-первых, не требуется, чтобы каждый разработчик каждого приложения для Android использовал FileProvider для отправки вам потоков через ACTION_SEND.

Во-вторых, вполне вероятно, что у вас все равно нет доступа файловой системы к файлу.

person CommonsWare    schedule 19.03.2018