如何获取视频路径

前言

有时候,需要使用系统文件管理器选择需要的音视频文件。
今天的文章小结下这类问题。

目标

1)如何调用系统文件管理器
2)如何判断选择的文件就是视频文件

调用系统文件管理器-概括

在android中查找文件,是使用Uri方式标记的,获得到的Uri基本是2种形式: content:// or file://
接下来会提到2种方式的使用, content://标识的Uri 获取的cursor不会为空,然后通过cursor去取得你需要的音视频文件信息。
但是file://的稍微麻烦些,需要使用MediaPlayer的方式去获取视频的相关信息。

方法1—4.4之前方法

打开文件管理器

    private void openFileManager() {
        //Intent it = new Intent(Intent.ACTION_GET_CONTENT);
        Intent it = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        it.setType("video/*");
        it.addCategory(Intent.CATEGORY_OPENABLE);
        try {
            startActivityForResult(it, REQUEST_CODE);
        } catch (ActivityNotFoundException exp) {
            Toast.makeText(this, getResources().getString(R.string.view_no_filemanager),
                    Toast.LENGTH_SHORT);
        } catch (Exception exp) {
            Toast.makeText(this, getResources().getString(R.string.view_filemanager_error),
                    Toast.LENGTH_SHORT);
        }
    }

处理选择某个视频文件后的代码:

    private void ShowVideoInfo(Intent data) {
        Uri selectedUri = data.getData();
        String videoPath = null;
        Cursor cursor = null;
        String mimeType = null;

        int duration = 0;
        boolean isVideo = false;

        try {
            cursor = getContentResolver().query(selectedUri, null, null, null,
                    null);
            Log.e(TAG, "selectedUri = " + selectedUri + "\n cursor = " + cursor
                    + "\n started string = "
                    + selectedUri.toString().substring(0, 7));

            // 应该有2种形式:
            // (1)以content:// 开始
            // (2)以file:// 开始

            if (selectedUri != null
                    && selectedUri.toString().substring(0, 10)
                            .equals("content://") && cursor != null
                    && cursor.moveToFirst()) {

                mimeType = cursor
                        .getString(cursor
                                .getColumnIndexOrThrow(MediaStore.Video.Media.MIME_TYPE));
                Log.e(TAG, "mimeType 111  = " + mimeType);
                videoPath = cursor.getString(cursor
                        .getColumnIndexOrThrow(MediaStore.Video.Media.DATA));
                Log.e(TAG, "videoPath 222 = " + videoPath);
                duration = cursor
                        .getInt(cursor
                                .getColumnIndexOrThrow(MediaStore.Video.Media.DURATION));
                Log.e(TAG, "videoPath = " + videoPath + ", duration = "
                        + duration);

                isVideo = true;

                // debug video info
                if (cursor != null && cursor.moveToFirst()) {
                    tvShowInfo.setText(dumpVideo(cursor));
                }

            } else if (selectedUri != null
                    && selectedUri.toString().substring(0, 7).equals("file://")
                    && cursor == null) {
                // 简单的方式判断。 常用的也就几个 MP4, AVI, 3GPP, WMV
                String pickPath = selectedUri.toString();

                int lastDot = pickPath.lastIndexOf(".");
                if (lastDot < 0) {
                    Toast.makeText(this,
                            getResources().getString(R.string.view_not_video),
                            Toast.LENGTH_SHORT);
                    return;
                }

                for (int i = 0; i < VIDEO_TYPE.length; i++) {
                    if (pickPath.substring(lastDot + 1).toUpperCase()
                            .equals(VIDEO_TYPE[i])) {
                        isVideo = true;
                        break;
                    }
                }

                if (!isVideo) {
                    Toast.makeText(this,
                            getResources().getString(R.string.view_not_video),
                            Toast.LENGTH_SHORT);
                    return;
                }

                // 使用MediaPlayer获得视频时间
                MediaPlayer mPlayer = new MediaPlayer();
                mPlayer.setDataSource(this, selectedUri);
                mPlayer.prepare();
                duration = mPlayer.getDuration();

                isVideo = true;

            } else {
                Toast.makeText(this,
                        getResources().getString(R.string.view_not_video),
                        Toast.LENGTH_SHORT);
                return;
            }

        } catch (Exception exp) {
            exp.printStackTrace();
            return;
        } finally {
            if (cursor != null && !cursor.isClosed()) {
                cursor.close();
            }
        }
    }

这种方式只能在4.4之前的android手机上获得到video的信息,
华为P7手机显示的是 DATA字段出现了异常,没有这个字段。
以及得到的路径不正常,类似:/document/video%3A28917

videoPath = cursor.getString(cursor
                        .getColumnIndexOrThrow(MediaStore.Video.Media.DATA));

当时还觉得我的p7有问题,后来搜索了下,发现不是p7的问题,而是使用方式不对,细节代码可以在文章末尾下载。

方法2—4.4版本

为了解决这个问题,网上提供了解决思路,请看下文的参考文章

Intent it = new Intent(Intent.ACTION_PICK, 
                android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
        it.setDataAndType(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, "video/*");

这样就可以获得你选择的视频 路径了。

结果图片

演示结果

参考文章

Android 4.4从图库选择图片,获取图片路径并裁剪
Android4.4以上从图库选择图片返回的路径不正确的解决方法
感谢网友的分享!!!

小结

针对通过Cursor的方式获得video信息,确实解决了。但是本文代码并没有去测试选择非文件或是不在 MP4,3gpp, avi之列的视频,有什么样的表现。
而且, 以file://方式的获取不到video path, 这个还需要修改其中的相关代码。file:/// 的处理。

免积分源码下载

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值