Android开发获取相机拍照的原图(并非缩略图)

Android开发拍照上传是个很常见的功能,通过如下代码可以激活相机进行拍照:

        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        startActivityForResult(intent, PHOTO_REQUEST_CAREMA);

通过下边的代码获取相机返回的照片数据:

 @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == PHOTO_REQUEST_CAREMA) {
            if (null != data) {
                Bundle bundle = data.getExtras();
                Bitmap bitmap = (Bitmap) bundle.get("data");// 获取相机返回的数据,并转换为Bitmap图片格式

但是遗憾的是因为照片实在是太大了,为了在activity之间传递bitmap数据,不得不对照片进行压缩后再传递,因此通过onActivityResult方法的intent参数获取的照片,实际上是个缩略图。

大部分时候缩略图的清晰度是不能够满足要求的,所以要自己制定相机拍照文件的保存位置
使用如下的方式激活系统相机、

        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        Uri imageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),PICTURE_FILE));
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        // 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CAREMA
        startActivityForResult(intent, PHOTO_REQUEST_CAREMA);

其中两个常量设置如下:

    public static final int PHOTO_REQUEST_CAREMA=2016;
    public static final String PICTURE_FILE="temp.jpg";

这样每次调用相机拍照都会在sd卡根目录生成名为temp.jpg的图片,每次拍照都会覆盖旧的文件。这样的话就不能通过onActivityResult方法的intent参数获取照片数据,可以直接读取文件

 @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == PHOTO_REQUEST_CAREMA) {
            File f=new File(Environment.getExternalStorageDirectory()
                    +"/"+PICTURE_FILE);
                    ...

这样直接获取到的文件是高清原图,压缩后可以做各种处理
因为要读写sd卡,所以要添加相应权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

你可能感兴趣的:(Android开发)