Android中调用系统摄像并且保存到指定位置的一些问题&Uri转文件路径方法

首先是很基础的调用系统摄像头:

Intent i2 = new Intent();
// 指定开启系统摄像机的Action
i2.setAction("android.media.action.VIDEO_CAPTURE");
i2.addCategory("android.intent.category.DEFAULT");
startActivityForResult(i2, 1);

这时候记住,不要用i2.putExtra(MediaStore.EXTRA_OUTPUT, uri),因为无论怎么传递参数,
在onActivityResult方法中intent.getExtras都是null值。

那么怎么办呢,debug发现intent中的data是有数据的,一个Uri值,大概长得是这个模样:
content://media/external/video/media/822330
于是上网搜索了一下Uri转为文件路径的方式,是M1ko的《Android Uri获取真实路径以及文件名的方法》
(网址是:http://blog.csdn.net/mikogodzd/article/details/50979653),这个方法很管用,可以直接用:
public static String getRealFilePath(final Context context, final Uri uri ) {
        if ( null == uri ) return null;
        final String scheme = uri.getScheme();
        String data = null;
        if ( scheme == null )
            data = uri.getPath();
        else if ( ContentResolver.SCHEME_FILE.equals( scheme ) ) {
            data = uri.getPath();
        } else if ( ContentResolver.SCHEME_CONTENT.equals( scheme ) ) {
            Cursor cursor = context.getContentResolver().query( uri, new String[] { MediaStore.Images.ImageColumns.DATA }, null, null, null );
            if ( null != cursor ) {
                if ( cursor.moveToFirst() ) {
                    int index = cursor.getColumnIndex( MediaStore.Images.ImageColumns.DATA );
                    if ( index > -1 ) {
                        data = cursor.getString( index );
                    }
                }
                cursor.close();
            }
        }
        return data;
    }
那么就可以在onActivityResult方法中进行判断之后加上以下代码就可以把拍摄的视频保存到指定位置了:
Uri uri = data.getData();
String fn = getRealFilePath(MainActivity.this,uri);
FileInputStream fis = new FileInputStream(fn.substring(1));
// 创建文件夹
String fileName = "/sdcard/Image/" + name + ".mp4";
b = new FileOutputStream(fileName);
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fis.read(buffer)) != -1) {
    b.write(buffer, 0, len);
}
fis.close();
其中fn.substring(1)的作用是改善contains a path separator的错误,至此,拍摄的视频可以保存到指定位置了,
但是这个方法会导致出现两个一样的视频在不同的路径,是有点资源浪费的,还需要改进。

你可能感兴趣的:(Android)