将视频从画廊复制到Kotlin中的其他文件夹

时间:2019-10-20 18:57:11

标签: android kotlin video copy gallery

我有一个活动,用户可以从画廊中选择图像/视频。对于图像,一切正常,但是我在视频方面挣扎。 如果有视频,我会这样打电话给画廊:

fun getVideoFromGallery() {
    if (Build.VERSION.SDK_INT < 19) {
        var intent = Intent()
        intent.type = "video/*"
        intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
        intent.action = Intent.ACTION_GET_CONTENT
        startActivityForResult(
            Intent.createChooser(intent, "Select Picture")
            , GALLERY_VIDEO
        )
    } else {
        var videopicker = Intent(Intent.ACTION_OPEN_DOCUMENT);
        videopicker.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
        videopicker.addCategory(Intent.CATEGORY_OPENABLE)
        videopicker.type = "video/*"
        startActivityForResult(videopicker, GALLERY_VIDEO);
    }
}

当用户在以下位置选择视频时,我会收到通知:

public override fun onActivityResult(requestCode:Int, resultCode:Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)

if(requestCode == GALLERY_VIDEO)
{
    if (data != null)
    {
        val contentURI = data.data
        try {

            if (data.getData() != null) {

            var videoURI = data.getData()
                val cR = this@EnviarMultimediaActivity.getContentResolver();
                val type = cR.getType(videoURI);
                if(!type.isNullOrEmpty() && type.contains("video/", true)){

                    val videopath = videoURI.getPath()
                    val file = File(videopath)
                    Log.d(TAG, "Video uri: "+videoURI)
                    Log.d(TAG, "Video path: "+file.getAbsolutePath())

                    var videoCopy = File(Environment.getExternalStorageDirectory().absolutePath+ IMAGE_DIRECTORY + ((Calendar.getInstance().getTimeInMillis()).toString() + ".mp4"))
                    //file.copyTo(videoCopy, true)
                    copyVideoFile(file, videoCopy)

                    Glide
                        .with(this@EnviarMultimediaActivity)
                        .asBitmap()
                        .load(videoURI)
                        .into(object : CustomTarget<Bitmap>(){
                            override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
                                val thumbnail = saveImage(resource)
                                val thumbnailUri = Uri.parse(thumbnail);


                                val videoCopyURI = Uri.parse(videoCopy.getPath())

                                listaFicherosEnviar.add(EnviarMultimediaFichero(null, false, 3,  videoCopyURI, thumbnailUri))
                                adapterEnviarMultimediaImagen.swapData(listaFicherosEnviar)
                            }
                            override fun onLoadCleared(placeholder: Drawable?) {

                            }
                        })

                }
            }
        }
        catch (e: IOException) {
            e.printStackTrace()
            Toast.makeText(this@EnviarMultimediaActivity, "Failed!", Toast.LENGTH_SHORT).show()
        }
    }
}
}

我的onActivityResult较大,但我只是粘贴了视频的相关部分。 如果我不尝试进行复制,则Glide会创建缩略图并显示在视图中。 问题是复制无效,我尝试了File方法copyTo和另一个实现的方法,该方法接收复制源和复制目标作为参数。

private fun copyVideoFile(sourceFile: File, destFile: File){
        if (!sourceFile.exists()) {
            return;
        }


        val source = FileInputStream(sourceFile).getChannel();
        val destination = FileOutputStream(destFile).getChannel();
        if (destination != null && source != null) {
            destination.transferFrom(source, 0, source.size());
        }
        if (source != null) {
            source.close();
        }
        if (destination != null) {
            destination.close();
        }
    }

问题在于sourceFile.exists()返回false,因此不进行任何复制。 我试图放弃路径和uri,是这样的:

视频uri:content://com.android.providers.downloads.documents/document/36 视频路径:/ document / 36

我有点迷茫,因为我不明白为什么uri正确(如Glide工作),我无法创建文件并将其复制到另一个文件。

我请求允许,并且在我的清单中我有:

  • android.permission.WRITE_EXTERNAL_STORAGE
  • android.permission.CAMERA
  • android.permission.INTERNET
  • android.permission.READ_EXTERNAL_STORAGE

后来我有了retrofit2 api,该api在服务器上创建了一个帖子,并作为多部分发送:

val requestBody: RequestBody = RequestBody.create(MediaType.parse("video/*"), file)
    val multiPart: MultipartBody.Part = MultipartBody.Part.createFormData("file", file.name, requestBody)
    val name = RequestBody.create(MediaType.parse("text/plain"), file.name);

这就是为什么我需要File的实例。如前所述,复制只是一个测试,但是我认为File实例是必需的(除非我在retrofir2 api中有其他代码可将文件添加到发布请求中)。

感谢您的帮助。

0 个答案:

没有答案