前言
有时候,需要使用系统文件管理器选择需要的音视频文件。
今天的文章小结下这类问题。
目标
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:/// 的处理。