从手机相册,相机选取照片

启动android手机相机,相册,就是两个Intent。

protected void photoGraph() {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        fileName = System.currentTimeMillis() + "";
        //输出数据,必须要有,不然不能带回数据
        intent.putExtra(MediaStore.EXTRA_OUTPUT,    
                Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "/" + fileName + ".jpg")));
        startActivityForResult(intent, Config.RequestCode.PHOTOHRAPH);
    }

这是获取手机相机的intent。必须要有那个putExtra。不然拍完照没有数据返回,就等于什么都没有。白做了这个操作。后面的文件存储路径、文件的名字,都是自己命名,想存在哪里就存在哪里。我记得我前面好像有一篇里面有文件存储位置的代码,给出来过。可以去看一下,选择自己想存哪里。

    protected void photoAlbum() {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType(Config.ImageType.IMAGE_UNSPECIFIED);
        startActivityForResult(intent, Config.RequestCode.PHOTOZOOM);
    }

这个是获取手机相册的代码,那个setType是设置照片的类型。我这里表示所有类型的照片都可以。

/**
     * 裁剪照片
     * @param uri   照片的本地路劲
     */
    private void zoomPic(Uri uri) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, Config.ImageType.IMAGE_UNSPECIFIED);
        intent.putExtra("crop", true); // 有这句才能裁剪图片
        intent.putExtra("scale", true); // 允许缩放
        intent.putExtra("scaleUpIfNeeded", true);// 如果小于要求输出大小,就放大
        intent.putExtra("return-data", true);// 不返回缩略图
        // 设置宽高比例
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        // 剪裁后的图片大小
        intent.putExtra("outputX", 300);
        intent.putExtra("outputY", 300);
        startActivityForResult(intent, Config.RequestCode.ALBUMRESOULT);
    }

    private void saveMyBitmap(String bitName, Bitmap mBitmap) {
        File f = new File(bitName);
        try {
            FileOutputStream fOut = null;
            f.createNewFile();
            fOut = new FileOutputStream(f);
            mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
            fOut.flush();
            fOut.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

这个就不多说了,注释写的很清楚每句代码是什么意思。

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (Config.RequestCode.PHOTOHRAPH == requestCode) { // 手机相机的请求结果
            File picture = new File(Environment.getExternalStorageDirectory() + "/" + fileName + ".jpg");
            zoomPic(Uri.fromFile(picture)); // 通过拍照保存的照片来找uri,进行缩放图片
        } else if (Config.RequestCode.PHOTOZOOM == requestCode) {// 相册,缩放图片
            if (data != null) {
                zoomPic(data.getData()); // 通过intent带的数据找uri
            } else {
                return;
            }
        } else if (Config.RequestCode.ALBUMRESOULT == requestCode) {
            if (data != null) {
                Bundle extras = data.getExtras();
                if (null != extras) {
                    Bitmap photo = extras.getParcelable("data");
                    Drawable drawable = new BitmapDrawable(photo);
                    //裁剪之后照片的本地路径,之后的操作都通过这个路径,项目里面上传服务器之类的
                    bitName = Environment.getExternalStorageDirectory() + "/" + System.currentTimeMillis() + ".jpg";
                    saveMyBitmap(bitName, photo);
                    iv.setVisibility(View.VISIBLE);
                    iv.setBackgroundDrawable(drawable); //显示到ImageView
                }
            } else {
                return;
            }
        }
    }

真的没有啥好讲的,我的注释里面写的很清楚。

从手机相册、相机选取照片.rar

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海晨忆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值