package com.jarrah.photo; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.net.Uri; import android.provider.MediaStore; import android.widget.Toast; import java.io.File; //在onActivityResult方法中根据requestCode和resultCode来获取当前拍照的图片地址。 //注意:这里有个问题,在有些机型当中(如SamsungI939、note2等)遇见了当拍照并存储之后,intent当中得到的data为空: /** * data = null 的情况主要是由于拍照的时候横屏了,导致重新create, * 普通的解决方法可以在sharedpreference里面保存拍照文件的路径(onSaveInstance保存), * 在onRestoreSaveInstance里面在获取出来. 最简单的可以用fileUtil 里面的一个静态变量保存起来.. * */ public class PhotoPicker { private static final String IMAGE_TYPE = "image/*"; /** * 打开照相机 * * @param activity * 当前的activity * @param requestCode * 拍照成功时activity forResult 的时候的requestCode * @param photoFile * 拍照完毕时,图片保存的位置 */ public static void launchCamera(Activity activity, int requestCode, File photoFile) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); activity.startActivityForResult(intent, requestCode); } /** * 本地照片调用 * * @param activity * @param requestCode */ public static void launchGallery(Activity activity, int requestCode) { if (launchSys(activity, requestCode) && launch3partyBroswer(activity, requestCode) && launchFinally(activity)); } /** * PopupMenu打开本地相册. */ private static boolean launchSys(Activity activity, int actResultCode) { Intent intent = new Intent(Intent.ACTION_PICK, null); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_TYPE); try { activity.startActivityForResult(intent, actResultCode); } catch (android.content.ActivityNotFoundException e) { return true; } return false; } /** * 打开其他的一文件浏览器,如果没有本地相册的话 */ private static boolean launch3partyBroswer(Activity activity, int requestCode) { Toast.makeText(activity, "没有相册软件,运行文件浏览器", Toast.LENGTH_LONG).show(); Intent intent = new Intent(Intent.ACTION_GET_CONTENT); // "android.intent.action.GET_CONTENT" intent.setType(IMAGE_TYPE); // 查看类型 String IMAGE_UNSPECIFIED = // "image/*"; Intent wrapperIntent = Intent.createChooser(intent, null); try { activity.startActivityForResult(wrapperIntent, requestCode); } catch (android.content.ActivityNotFoundException e1) { return true; } return false; } /** * 这个是找不到相关的图片浏览器,或者相册 */ private static boolean launchFinally(Activity activity) { Toast.makeText(activity, "您的系统没有文件浏览器或则相册支持,请安装!", Toast.LENGTH_LONG) .show(); return false; } /** * 获取从本地图库返回来的时候的URI解析出来的文件路径 * * @return */ public static String getPhotoPathByLocalUri(Context context, Intent data) { Uri selectedImage = data.getData(); String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = context.getContentResolver().query(selectedImage, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String picturePath = cursor.getString(columnIndex); cursor.close(); return picturePath; } /** * 剪切图片 在 onActivityResult的时候 从 返回的 Intent 里面获取 data 就是bitmap >>>> Bitmap * bitmap = data.getParcelableExtra("data"); * * @param activity * @param imagePath * 文件路径 * @param requestCode * 返回码 */ public static void startCrop(Activity activity, String imagePath, int requestCode, boolean isLarge) { File f = new File(imagePath); Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(Uri.fromFile(f), "image/*"); intent.putExtra("crop", "true"); intent.putExtra("aspectX", 4); // 裁剪框比例 4 : 3 intent.putExtra("aspectY", 3); intent.putExtra("outputX", isLarge ? 400 : 200); intent.putExtra("outputY", isLarge ? 400 : 200); intent.putExtra("scale", true); intent.putExtra("return-data", true); // 设置为true 的时候才能有返回 // intent.putExtra(MediaStore.EXTRA_OUTPUT, imagePath); intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); intent.putExtra("noFaceDetection", true); // no face detection activity.startActivityForResult(intent, requestCode); } }