1 //摄像头拍照 2 public static File getImageFromCamer(Context context, File cameraFile,String imgname, 3 int REQUE_CODE_CAMERA, Intent intent) { 4 intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 5 cameraFile = new File(Environment.getExternalStorageDirectory().getPath()+ "/"+ imgname); 6 7 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cameraFile)); 8 ((Activity) context).startActivityForResult(intent, REQUE_CODE_CAMERA); 9 return cameraFile; 10 }
//相册选取 public static void getImageFromPhoto(Context context, int REQUE_CODE_PHOTO) { Intent intent = new Intent(Intent.ACTION_PICK, null); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); ((Activity) context).startActivityForResult(intent, REQUE_CODE_PHOTO); }
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != RESULT_CANCELED) {
switch (requestCode) {
case IMAGE_REQUEST_CODE:
if (null != data) {// 为了取消选取不报空指针用的
uri = data.getData();
BitmapUtils.startPhotoZoom(
activity_group_topic_publish.this, uri,
CROP_REQUEST_CODE);
}
break;
case CAMERA_REQUEST_CODE:
uri = Uri.fromFile(cameFile);
BitmapUtils.startPhotoZoom(activity_group_topic_publish.this,
uri, CROP_REQUEST_CODE);
break;
case CROP_REQUEST_CODE:
if (uri == null) {
break;
}
cropBitmap = BitmapUtils.getBitmapFromUri(uri,
activity_group_topic_publish.this);
if (cropBitmap != null) {
imgphotoview.setImageBitmap(cropBitmap);
imgphotoview.setVisibility(View.VISIBLE);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
cropBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
mContent = baos.toByteArray();
}
break;
}
}
super.onActivityResult(requestCode, resultCode, data);
}
1 public static void startPhotoZoom(Context context, Uri uri, 2 int REQUE_CODE_CROP) { 3 int dp = 500; 4 5 Intent intent = new Intent("com.android.camera.action.CROP");
//android4.0的兼容 6 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { 7 String url = BitmapUtils.getPath(context, 8 uri); 9 File file = new File(url); 10 Uri mUri = Uri.fromFile(file); 11 intent.setDataAndType(mUri, "image/*"); 12 } else { 13 intent.setDataAndType(uri, "image/*"); 14 } 15 // 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪 16 intent.putExtra("crop", "true"); 17 intent.putExtra("scale", true);// 去黑边 18 intent.putExtra("scaleUpIfNeeded", true);// 去黑边 19 // aspectX aspectY 是宽高的比例 20 intent.putExtra("aspectX", 1);//输出是X方向的比例 21 intent.putExtra("aspectY", 1); 22 // outputX outputY 是裁剪图片宽高,切忌不要再改动下列数字,会卡死 23 intent.putExtra("outputX", dp);//输出X方向的像素 24 intent.putExtra("outputY", dp); 25 intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); 26 intent.putExtra("noFaceDetection", true); 27 intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); 28 intent.putExtra("return-data", false);//设置为不返回数据 29 30 ((Activity) context).startActivityForResult(intent, REQUE_CODE_CROP); 31 }
1 //从uri中获取照片 2 public static Bitmap getBitmapFromUri(Uri uri, Context mContext) { 3 try { 4 // 读取uri所在的图片 5 Bitmap bitmap = MediaStore.Images.Media.getBitmap( 6 mContext.getContentResolver(), uri); 7 return bitmap; 8 } catch (Exception e) { 9 e.printStackTrace(); 10 return null; 11 } 12 }
1 @SuppressLint("NewApi") 2 public static String getPath(final Context context, final Uri uri) { 3 4 final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; 5 6 // DocumentProvider 7 if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { 8 // ExternalStorageProvider 9 if (isExternalStorageDocument(uri)) { 10 final String docId = DocumentsContract.getDocumentId(uri); 11 final String[] split = docId.split(":"); 12 final String type = split[0]; 13 14 if ("primary".equalsIgnoreCase(type)) { 15 return Environment.getExternalStorageDirectory() + "/" 16 + split[1]; 17 } 18 19 } 20 // DownloadsProvider 21 else if (isDownloadsDocument(uri)) { 22 final String id = DocumentsContract.getDocumentId(uri); 23 final Uri contentUri = ContentUris.withAppendedId( 24 Uri.parse("content://downloads/public_downloads"), 25 Long.valueOf(id)); 26 27 return getDataColumn(context, contentUri, null, null); 28 } 29 // MediaProvider 30 else if (isMediaDocument(uri)) { 31 final String docId = DocumentsContract.getDocumentId(uri); 32 final String[] split = docId.split(":"); 33 final String type = split[0]; 34 35 Uri contentUri = null; 36 if ("image".equals(type)) { 37 contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 38 } else if ("video".equals(type)) { 39 contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; 40 } else if ("audio".equals(type)) { 41 contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 42 } 43 44 final String selection = "_id=?"; 45 final String[] selectionArgs = new String[] { split[1] }; 46 47 return getDataColumn(context, contentUri, selection, 48 selectionArgs); 49 } 50 } 51 // MediaStore (and general) 52 else if ("content".equalsIgnoreCase(uri.getScheme())) { 53 // Return the remote address 54 if (isGooglePhotosUri(uri)) 55 return uri.getLastPathSegment(); 56 57 return getDataColumn(context, uri, null, null); 58 } 59 // File 60 else if ("file".equalsIgnoreCase(uri.getScheme())) { 61 return uri.getPath(); 62 } 63 64 return null; 65 }
以上代码,在小米手机上会出现重大bug,拍照时会
github上有一个开源的图片选取项目, 地址是:https://github.com/ryanhoo/PhotoCropper