您的位置:首页 > 移动开发 > Android开发

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

2017-09-06 10:15 716 查看
有时候我们需要调用系统的相机务, 并且处理拍照成功之后的一些业务

开启相机 是这样的: 

 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的图片, 存储位置和图片名称按照需求自定义即可

以上, 就是开启系统相机拍照的一些简单操作 , 其实博客上也有很多类似的文章了, 只是自己做一个笔记而已
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息