开启系统相机拍照并输出显示保存到指定位置

有时候我们需要调用系统的相机务, 并且处理拍照成功之后的一些业务

开启相机 是这样的: 

 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            if (intent.resolveActivity(getPackageManager()) != null) {
                startActivityForResult(intent, THUMBNAIL);
            }    

然后输出代码 在onActivityResult()方法中

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {
            switch (requestCode) {
                case THUMBNAIL: {//输出缩略图
                    if (data != null) {
                        final Bundle extras = data.getExtras();
                        final Bitmap bitmap = (Bitmap) extras.get("data");
                        mImg.setImageBitmap(bitmap);
                    }
                    break;
                }
            }
        }
    }

稍稍解释一下, MediaStorexxxx是指定系统的意图, 跟我们平时比如跳转activity开启的意图是一个意思, 并且判断一下照相机是否为空, 可以保证在某些情况下, 比如root把照相机卸载了, 导致空指针会程序崩溃, 另外, 由于我们开启的是系统的api, 因此通常都是startActivityForResult(), 因为我们需要拿到系统操作之后的数据, 里面THUMBNAIL是我自定义的一个int常量, 类似这样 private static final int THUMBNAIL = 1; 用作requestCode, 输出的图片其实是一张缩略图, 观察一下你会发现质量很小...最后别忘记在manifest中当前类添加intent-filter和权限...

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


 <intent-filter>
        <action android:name="android.media.action.IMAGE_CAPTURE"/>
        <category android:name="android.intent.category.DEFAULT"/>
      </intent-filter>

但是我发现不加上intent-filter, 也可以成功(5.1系统).....

上面这种调用相机但是不保存拍照得到的图片,只是显示一下缩略图,一般比较少用吧?

下面这种,则是拍照成功,保存图片的开启方式, 应该这样的形式比较多用吧?:

01. 指定uri, 即图片存储的位置和名称

 mPath = String.valueOf(
            Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM));
        mPath = mFilePath + "/" + "storage.jpg";

这里也多说几句, 我们取得的路径最后转换为String类型了, 因此我的最终图片存储路径是mPath = mFilePath + "/" + "storage.jpg"; 记住中间的符号, 如果没加, 那么你得到的图片是这样的:mFilePathstorage.jpg, 而不是我们预想的是存储于mFilePath路径下的storage.jpg这张图片. 当然, 如果你不想加 "/" , 也很简单, 保证你获得的路径是File类型的即可


02. 开启意图:

 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            Uri uri = Uri.fromFile(new File(mPath));
            if (intent.resolveActivity(getPackageManager()) != null) {
                intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);//指定图片存储路径
                startActivityForResult(intent, STORAGE);
            }


03. 输出并保存数据,也还是在onActivityResult()中

FileInputStream fis = null;
        try {
            fis = new FileInputStream(mFilePath);
            final Bitmap bitmap = BitmapFactory.decodeStream(fis);
            mImg.setImageBitmap(bitmap);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }


拍照成功, 输出查看效果, 你可以到dcim目录下查看是否存在一个叫storage.jpg的图片, 存储位置和图片名称按照需求自定义即可


以上, 就是开启系统相机拍照的一些简单操作 , 其实博客上也有很多类似的文章了, 只是自己做一个笔记而已


猜你喜欢

转载自blog.csdn.net/yan_startwith2015/article/details/77862370
今日推荐