package com.yuyh.library.utils.io;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.v4.app.Fragment;
import android.widget.Toast;
import com.yuyh.library.utils.PackageUtils;
import java.io.File;
/**
* 拍照工具类
* (1) 使用{@link #setOnPhotoResultListener}等回调方法
* (2) 在调用者所在的Activity或者Fragment的onActivityResult方法中获取操作结果。
*
* @author yuyh.
* @date 16/4/9.
*/
public class PhotoUtils {
public static class RequestCode {
public static final int TAKE_PHOTO_BY_SYSTEM = 0;
public static final int PICK_PHOTO_FROM_GALLERY = 1;
public static final int CROP_PHOTO_BY_SYSTEM = 2;
}
private static Uri tempPhotoUri = null;
private static Uri tempPhotoCropUri = null;
private static void startActivityForResult(Context context, Intent intent, int requestCode, Fragment fragment) {
if (intent.resolveActivity(context.getPackageManager()) != null) {
if (fragment != null) {
fragment.startActivityForResult(intent, requestCode);
} else if (context instanceof Activity) {
Activity activity = (Activity) context;
activity.startActivityForResult(intent, requestCode);
}
} else {
Toast.makeText(context, "本手机没有安装对应的应用程序", Toast.LENGTH_LONG).show();
}
}
/**
* 照片返回监听接口
*
* @author king
*/
public interface OnPhotoResultListener {
/**
* @param photoPath 照片的路径
* @param photo 照片原文件
*/
void onPhotoResult(String photoPath, Bitmap photo);
}
/**
* 设置照片回调接口,一般用于只在Activity或Fragment使用了本类中的一种照片操作方法的结果回调
* 在OnActivityResult里面调用
*
* @param context
* @param requestCode 请求码
* @param resultCode 结果码
* @param data onActivityResult返回的意图
* @param l
*/
public static void setOnPhotoResultListener(Context context, int requestCode, int resultCode, Intent data, OnPhotoResultListener l) {
switch (requestCode) {
case RequestCode.TAKE_PHOTO_BY_SYSTEM:
setOnTakePhotoResultListener(resultCode, data, l);
break;
case RequestCode.PICK_PHOTO_FROM_GALLERY:
setOnPickPhotoResultListener(context, resultCode, data, l);
break;
case RequestCode.CROP_PHOTO_BY_SYSTEM:
setOnCropPhotoResultListener(resultCode, data, l);
break;
}
}
/**
* 使用系统相机进行拍照
*
* @param context
* @param fragment 若为null则表示在Activity中启动,否则在Fragment中启动F
*/
public static void takePhotoBySystem(Context context, Fragment fragment) {
checkPermission();
try {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File photoFile = new File(FileUtils.getImageCachePath(), "imgTemp");
tempPhotoUri = Uri.fromFile(photoFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
startActivityForResult(context, intent, RequestCode.TAKE_PHOTO_BY_SYSTEM, fragment);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 系统相机拍照回调
*
* @param resultCode
* @param data
* @param l
*/
public static void setOnTakePhotoResultListener(int resultCode, Intent data, OnPhotoResultListener l) {
if (l == null || resultCode != Activity.RESULT_OK || tempPhotoUri == null)
return;
l.onPhotoResult(tempPhotoUri.getPath(), BitmapFactory.decodeFile(tempPhotoUri.getPath()));
}
/**
* 从图库中选择照片
*
* @param context
* @param fragment
*/
public static void pickPhotoFormGallery(Context context, Fragment fragment) {
checkPermission();
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(context, intent, RequestCode.PICK_PHOTO_FROM_GALLERY, fragment);
}
/**
* 系统图库照片选择回调
*
* @param context
* @param resultCode
* @param data
* @param l
*/
public static void setOnPickPhotoResultListener(Context context,
int resultCode, Intent data, OnPhotoResultListener l) {
if (context == null || l == null || resultCode != Activity.RESULT_OK)
return;
try {
ContentResolver mContentResolver = context.getContentResolver();
Bitmap photo = MediaStore.Images.Media.getBitmap(mContentResolver,
data.getData());
// 获取图片路径
String[] proj = {MediaStore.Images.Media.DATA};
Cursor cursor = mContentResolver.query(data.getData(), proj, null,
null, null);
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String path = cursor.getString(column_index);
l.onPhotoResult(path, photo);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 系统裁剪图片
*
* @param context
* @param fragment
* @param photoPath 照片的路径
* @param width 裁剪宽度
* @param height 裁剪高度
*/
public static void cropPhotoBySystem(Context context, Fragment fragment, String photoPath, int width, int height) {
checkPermission();
try {
File cropFile = new File(FileUtils.getImageCropCachePath(), "imgCropTemp");
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(Uri.fromFile(new File(photoPath)), "image/*");
tempPhotoCropUri = Uri.fromFile(cropFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, tempPhotoCropUri);
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX", width);
intent.putExtra("outputY", height);
intent.putExtra("return-data", false);
intent.putExtra("circleCrop", true);
startActivityForResult(context, intent, RequestCode.CROP_PHOTO_BY_SYSTEM, fragment);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 系统照片裁剪回调
*
* @param resultCode
* @param data
* @param l
*/
public static void setOnCropPhotoResultListener(int resultCode, Intent data, OnPhotoResultListener l) {
if (data == null || l == null || resultCode != Activity.RESULT_OK)
return;
Bitmap photo = data.getParcelableExtra("data");
l.onPhotoResult(tempPhotoCropUri.getPath(), photo);
}
/**
* 检查所需权限
*/
private static void checkPermission() {
if (!PackageUtils.checkPermission("android.permission.CAMERA")) {
throw new RuntimeException("请在Manifest里面添加android.permission.CAMERA权限");
}
if (!PackageUtils.checkPermission("android.permission.WRITE_EXTERNAL_STORAGE")) {
throw new RuntimeException("请在Manifest里面添加android.permission.WRITE_EXTERNAL_STORAGE权限");
}
}
}