Видео из ACTION_VIDEO_CAPTURE возвращает нулевое видео после воспроизведения - PullRequest
0 голосов
/ 16 апреля 2020

Я отправляю намерение записать видео таким образом

  private fun openCamera(url: String) {
        if (!viewModel.isAttachmentSaved) {
            val takeVideoIntent = Intent(MediaStore.ACTION_VIDEO_CAPTURE)
            val file = File(url)
            val videoURI = if (Build.VERSION_CODES.N <= android.os.Build.VERSION.SDK_INT) {
                FileProvider.getUriForFile(
                    localActivity,
                    BuildConfig.APPLICATION_ID + ".fileprovider",
                    file
                )
            } else {
                Uri.fromFile(file)
            }
            takeVideoIntent.putExtra(MediaStore.EXTRA_OUTPUT, videoURI)
            val resInfoList = requireActivity()
                .packageManager
                .queryIntentActivities(takeVideoIntent, PackageManager.MATCH_DEFAULT_ONLY)
            for (resolveInfo in resInfoList) {
                val packageName = resolveInfo.activityInfo.packageName
                localActivity?.grantUriPermission(
                    packageName, Uri.parse(url),
                    Intent.FLAG_GRANT_WRITE_URI_PERMISSION and Intent.FLAG_GRANT_READ_URI_PERMISSION
                )
            }
            takeVideoIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION and
                Intent.FLAG_GRANT_WRITE_URI_PERMISSION and
                Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION and
                Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)
            startActivityForResult(takeVideoIntent, REQUEST_VIDEO)
        }
    }

После того, как я записал видео и воспроизвел его в Mi Video, нажмите и подтвердите видеофайл. И попробуйте получить видео в onActivityResult, но есть нулевой файл. Намерение содержит URI, как это content:///external_files/..... Путь FileProvider: external_files

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == REQUEST_VIDEO && resultCode == Activity.RESULT_OK) {
            Log.d("bouxView", "onActivityResult $data $requestCode")
            //Toast.makeText(localActivity, R.string.text_start_compressing, Toast.LENGTH_LONG).show()
            if (isViewModelInitialized()) {
                val path = viewModel.videoPathLiveData.value?.run {
                    substringBeforeLast(FilesRepository.DELIMITER) + "copied" + FilesRepository.DELIMITER + substringAfterLast(FilesRepository.DELIMITER)
                }
                data?.data?.let {
                    try {
                        val fis: InputStream? = context?.contentResolver?.openInputStream(data?.data)
                        val videoFile = File(path)
                        val fos = FileOutputStream(videoFile)
                        val buffer = ByteArray(1024)
                        var length: Int = 0
                        var oldLength:Int = 0
                        while (fis?.read(buffer).also { length = (it ?: 0) } ?: 0 > 0) {
                            if (oldLength==0){
                                oldLength = length
                            }
                            fos.write(buffer, 0, length)
                        }
                        fis?.close()
                        fos.close()
                        Toast.makeText(requireContext(),"oldLength = $oldLength, path = $path, data = ${data.data.toString()}, pathLiveData = ${viewModel.videoPathLiveData.value}", Toast.LENGTH_LONG).show()
                    } catch (e: IOException) {
                    }
                }
                viewModel.onVideoSaved(path?:viewModel.videoPathLiveData.value)
            }
        }
    }

Если я записываю видео и подтверждаю его, не воспроизводя все нормально. Что может быть не так? Я также попытался найти видео в пути videoUri, который я указал в параметре MediaStore.EXTRA_OUTPUT, но безуспешно. Попытка получить путь к видео из URI ( Как получить полный путь к файлу из URI ), безуспешно. Воспроизводится только в MIUI 11, android версия 9

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...