调用相机获取图片(可裁剪)避免重复造轮子

调用相机获取图片在app中使用频率还是蛮高的,避免重复造轮子,我就整理成了一个工具类,下次再想实现这个功能只需把此类复制过去即可。

请注意看使用说明。

package com.sinogeo.util;

import java.io.File;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;

/**
 * @author 作者 :WY
 * @version 创建时间:2017年8月21日 上午11:03:38 类说明:头像工具类,提供接口返回创建完成的图片的路径
 * 
 *          注意: 加权限: <uses-permission
 *          android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 *          <uses-permission android:name="android.permission.CAMERA"/>
 * 
 *          须在调用的activity内的onActivityResult下调用HeadIconUtils.onActivityResult(int
 *          requestCode, int resultCode, Intent data)方法
 *          
 *          在fragment内调用构造类时请填入myfragment.this,而不是getactivity();
 * 
 *          此工具类允许用户传入图片保存的路径,未传入则在手机根目录创建一个以软件包名为名称的文件夹,文件夹内再创建一个temp文件夹,
 *          图片都会保存在里面
 */
public class HeadIconUtils {
    /** 拍照 */
    public final static int camera = 777;
    /** 相册 */
    public final static int picture = 888;
    /** 裁剪 */
    private final static int tailor = 999;

    private Toast mToast;
    private Context mContext;
    private String imagePath;
    private HeadIconFace backFace;
    private String imageName;
    /** 当前功能类型 */
    private int type;
    private Fragment fragment;

    /** 返回创建完成的图片的路径的回调接口 */
    public interface HeadIconFace {
        void succ(Intent intent);
    }

    /**
     * 
     * @param context
     * @param backFace
     *            回调接口,完成时返回图片完整路径
     * @param type
     *            意图,拍照camera,相册picture
     */
    public HeadIconUtils(Context context, HeadIconFace backFace, int type) {
        mContext = context;
        this.backFace = backFace;
        this.type = type;
        initData(type);
    }

    /** 如果是在fragment内调用请使用此构造器 */
    public HeadIconUtils(Fragment fragment, HeadIconFace backFace, int type) {
        mContext = fragment.getActivity();
        this.fragment = fragment;
        this.backFace = backFace;
        this.type = type;
        initData(type);
    }

    /** 此构造器允许传入图片路径 */
    public HeadIconUtils(Context context, HeadIconFace backFace, String path, int type) {
        mContext = context;
        imagePath = path;
        this.backFace = backFace;
        this.type = type;
        initData(type);
    }

    private void initData(int type) {
        if (type == camera) {// 拍照
            try {
                String state = Environment.getExternalStorageState();
                if (state.equals(Environment.MEDIA_MOUNTED)) {// 判断是否有储存卡
                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    imageName = headIconName();
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(getTempPath() + imageName)));
                    if (fragment == null) {
                        ((Activity) mContext).startActivityForResult(intent, camera);
                    } else {
                        this.fragment.startActivityForResult(intent, camera);
                    }
                } else {
                    showMessage("请确认已经插入SD卡");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else if (type == picture) {// 相册
            try {
                Intent intent = new Intent(Intent.ACTION_PICK);
                intent.setType("image/*");
                if (fragment == null) {
                    ((Activity) mContext).startActivityForResult(intent, picture);
                } else {
                    this.fragment.startActivityForResult(intent, picture);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != Activity.RESULT_OK) {
            return;
        }
        switch (requestCode) {
        case camera:
            Intent intent = new Intent("com.android.camera.action.CROP");
            intent.setDataAndType(Uri.fromFile(new File(getTempPath() + imageName)), "image/*");
            intent.putExtra("crop", "true");
            intent.putExtra("outputX", 300);
            intent.putExtra("outputY", 300);
            intent.putExtra("scale", true);
            imageName = headIconName();
            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(getTempPath() + imageName)));
            intent.putExtra("return-data", false);
            intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());
            intent.putExtra("noFaceDetection", true);
            if (fragment == null) {
                ((Activity) mContext).startActivityForResult(intent, tailor);
            } else {
                this.fragment.startActivityForResult(intent, tailor);
            }
            break;
        case picture:
            Uri uri = data.getData();
            if (uri != null) {
                Intent i = new Intent("com.android.camera.action.CROP");
                i.setDataAndType(uri, "image/*");
                i.putExtra("crop", "true");
                i.putExtra("outputX", 300);
                i.putExtra("outputY", 300);
                i.putExtra("scale", true);
                imageName = headIconName();
                i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(getTempPath() + imageName)));
                i.putExtra("return-data", false);
                i.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());
                i.putExtra("noFaceDetection", true);
                if (fragment == null) {
                    ((Activity) mContext).startActivityForResult(i, tailor);
                } else {
                    this.fragment.startActivityForResult(i, tailor);
                }
            }
            break;
        case tailor:
            Intent intent2 = new Intent();
            intent2.setAction(type + "");
            backFace.succ(intent2.putExtra("path", getTempPath() + imageName));
            break;
        }
    }

    private String headIconName() {
        return System.currentTimeMillis() + ".png";

    }

    private String getTempPath() {
        if (!TextUtils.isEmpty(imagePath)) {
            return imagePath;
        }
        String projectPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + getAppPackageName(mContext)
                + File.separator;
        File f = new File(projectPath);
        if (!f.exists()) {
            f.mkdir();
        }
        String tempPath = projectPath + "temp" + File.separator;
        f = new File(tempPath);
        if (!f.exists()) {
            f.mkdir();
        }
        return tempPath;
    }

    /**
     * 返回当前程序包名
     */
    private String getAppPackageName(Context context) {
        String packageName = "";
        try {
            PackageManager pm = context.getPackageManager();
            PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0);
            packageName = pi.packageName;
        } catch (Exception e) {
            Log.e("CheckUpdateSyncTask", "Exception", e);
        }
        return packageName;
    }

    private void showMessage(String msg) {
        if (mToast == null) {
            mToast = Toast.makeText(mContext, msg, Toast.LENGTH_SHORT);
        } else {
            mToast.setText(msg);
            mToast.setDuration(Toast.LENGTH_SHORT);
        }
        mToast.show();
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值