anroid 拍照调用相册 剪切编辑图片

最近还是在做开源中国的源码阅读 。看到一个功能 感觉可以分离出来就是调用手机的拍照,和相册剪切,以前也做过一个im项目的时候,也做过类似的功能,但时候那时候赶项目没有注意用法,现在看见这个功能,就想把他留下来,用来以后直接使用。    private AlertDialog getDialog() {
        AlertDialog dialog = new AlertDialog.Builder(this)
                .setTitle(R.string.action_puthead)
                .setIcon(android.R.drawable.btn_star)
                .setItems(items, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        switch (which) {
                        case 0: // 调用系统相册
                            setCarmeListener();
                            break;

                        case 1: // 调用系统相机
                            setPaiZhaoLinterer();

                            break;

                        default:
                            break;
                        }
                    }

                }).create();
        return dialog;
    }

这一段代码基本上就是一个简单的对话框的创建。 和其中对话框中点击事件的响应方法。

    private void setCarmeListener() {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("image/*");
        startActivityForResult(intent, IMAGEURL);
    }

    private void setPaiZhaoLinterer() {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, getCameraTempFile());

        startActivityForResult(Intent.createChooser(intent, "选择图片"), PAIZHAO);
    }

这个是点击item的事件方法使用startActivityforResult回调返回图片的Uri

Intent.ACTION_GET_CONTENT

这个是通过settype()来确定调用具体的应用

 intent.addCategory(Intent.CATEGORY_OPENABLE);

是说将要打开的acitiivy会通过类似浏览器的连接 安全的打开

intent.setType("image/*");

是强制将要显示的类型

MediaStore.ACTION_IMAGE_CAPTURE

是调用系统的相机

getCameraTempFile()

    /**
     * 拍照时候的保存图片的命名
     * @return
     */

    private Uri getCameraTempFile() {
        String state = Environment.getExternalStorageState();
        // 判断是不是有sd卡
        if (state.equals(Environment.MEDIA_MOUNTED)) {
            File file = new File(PATH);
            if (!file.exists()) {
                file.mkdirs();
            }
        } else {
            Toast.makeText(MainActivity.this, "没有SD卡", Toast.LENGTH_SHORT)
                    .show();
            return null;
        }
        // 给图片的命名
        String timeStr = new SimpleDateFormat("yyyyMMddHHmmss")
                .format(new Date());
        String imageStr = "ve_cn" + timeStr + ".png";
        nameFile = new File(PATH + imageStr);
        Uri uri = Uri.fromFile(nameFile);
        return uri;

}

/**

获取外部存取设备的绝对路径加上自己指定的路径

    private static final String PATH = Environment
            .getExternalStorageDirectory().getAbsolutePath()
            + "/OSChina/Portrait/";

/**回调方法

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (null == data) {
            return;
        }


        if (requestCode == IMAGEURL || requestCode == PAIZHAO) {

// 拍照或者选择图片返回图片的Uri
            Uri uri = data.getData();

//重新剪切图片
            setPic(uri);

        } else if (requestCode == LOAD_IAMGE) {

            if (null != cropUri) {
                ivContent.setImageURI(cropUri);
            }

        }

    }

    /**
     * 剪切图片
     *
     * @param uri
     */
    private void setPic(Uri uri) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        intent.putExtra("output", getUploadTempFile(uri));
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", 1);// 裁剪框比例
        intent.putExtra("aspectY", 1);
        intent.putExtra("outputX", CROP);// 输出图片大小
        intent.putExtra("outputY", CROP);
        intent.putExtra("scale", true);// 去黑边
        intent.putExtra("scaleUpIfNeeded", true);// 去黑边
        startActivityForResult(intent, LOAD_IAMGE);
    }

    // 获取剪切之后的图片
    private Uri getUploadTempFile(Uri data) {
        String state = Environment.getExternalStorageState();
        if (state.equals(Environment.MEDIA_MOUNTED)) {
            File file = new File(PATH);
            if (!file.exists()) {
                file.mkdirs();
            }
        } else {
            Toast.makeText(MainActivity.this, "没有SD卡", Toast.LENGTH_SHORT)
                    .show();
            return null;
        }
        String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss")
                .format(new Date());
        String thePath = getAbsolutePathFromNoStandardUri(data);

        // 如果是标准Uri
        if (isEmpty(thePath)) {
            thePath = getAbsoluteImagePath(data);
        }
        String ext = getFileFormat(thePath);
        ext = isEmpty(ext) ? "jpg" : ext;
        // 照片命名
        String cropFileName = "osc_crop_" + timeStamp + "." + ext;
        // 裁剪头像的绝对路径
        protraitPath = PATH + cropFileName;
        protraitFile = new File(protraitPath);
        Log.e("info", "------>" + protraitFile.getPath());
        // if(!protraitFile.exists()){
        // protraitFile.mkdir();
        // }

        cropUri = Uri.fromFile(protraitFile);
        return cropUri;
    }

    private boolean isEmpty(String input) {
        if (input == null || "".equals(input))
            return true;

        for (int i = 0; i < input.length(); i++) {
            char c = input.charAt(i);
            if (c != ' ' && c != '\t' && c != '\r' && c != '\n') {
                return false;
            }
        }
        return true;
    }

    /**
     * 通过uri获取文件的绝对路径
     *
     * @param uri
     * @return
     */
    private String getAbsoluteImagePath(Uri uri) {
        String imagePath = "";
        String[] proj = { MediaStore.Images.Media.DATA };
        Cursor cursor = MainActivity.this.managedQuery(uri, proj, // Which
                null, // WHERE clause; which rows to return (all rows)
                null, // WHERE clause selection arguments (none)
                null); // Order-by clause (ascending by name)

        if (cursor != null) {
            int column_index = cursor
                    .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            if (cursor.getCount() > 0 && cursor.moveToFirst()) {
                imagePath = cursor.getString(column_index);
            }
        }
        return imagePath;
    }

    /**
     * 获取文件扩展名
     *
     * @param fileName
     * @return
     */
    public String getFileFormat(String fileName) {
        if (isEmpty(fileName))
            return "";
        int point = fileName.lastIndexOf('.');
        return fileName.substring(point + 1);
    }


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值