android照相、相冊獲取圖片剪裁報錯的解決方法
這是調用相機
public static File getImageFromCamer(Context context, File cameraFile, int REQUE_CODE_CAMERA, Intent intent) { intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File fileDir = HelpUtil.getFile(context, "/Tour/user_photos"); cameraFile = new File(fileDir.getAbsoluteFile() + "/" + System.currentTimeMillis() + ".jpg"); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cameraFile)); ((Activity) context).startActivityForResult(intent, REQUE_CODE_CAMERA); return cameraFile; }
在這里我返回了一個file對象,這是應為項目中需要,大家可以不必真寫,直接傳一個Uri對象過來就好了
下面是調用相冊
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); }
當然接下來是調用Activity的OnActivityResult了
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { switch (requestCode) { case ConstantUtil.REQUE_CODE_CAMERA: uri = Uri.fromFile(cameraFile); PhotoUtil.startPhotoZoom(context, uri, ConstantUtil.REQUE_CODE_CROP); break; case ConstantUtil.REQUE_CODE_PHOTO: if (null != data) {//為了取消選取不報空指針用的 uri = data.getData(); PhotoUtil.startPhotoZoom(context, uri, ConstantUtil.REQUE_CODE_CROP); } break; case ConstantUtil.REQUE_CODE_CROP: if(uri==null){ break; } cropBitmap=HelpUtil.getBitmapFromUri(uri,context); if (cropBitmap != null) { iv_headphoto.setImageBitmap(cropBitmap); baos = new ByteArrayOutputStream(); cropBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); headPicString = new String(Base64.encode( baos.toByteArray(), 0)); UploadPic(headPicString); } break; default: break; } }
當然還有大家關心的剪切
public static void startPhotoZoom(Context context, Uri uri, int REQUE_CODE_CROP) { int dp = 500; Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // 下面這個crop=true是設置在開啟的Intent中設置顯示的VIEW可裁剪 intent.putExtra("crop", "true"); intent.putExtra("scale", true);// 去黑邊 intent.putExtra("scaleUpIfNeeded", true);// 去黑邊 // aspectX aspectY 是寬高的比例 intent.putExtra("aspectX", 1);//輸出是X方向的比例 intent.putExtra("aspectY", 1); // outputX outputY 是裁剪圖片寬高,切忌不要再改動下列數(shù)字,會卡死 intent.putExtra("outputX", dp);//輸出X方向的像素 intent.putExtra("outputY", dp); intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); intent.putExtra("noFaceDetection", true); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); intent.putExtra("return-data", false);//設置為不返回數(shù)據(jù) ((Activity) context).startActivityForResult(intent, REQUE_CODE_CROP); }
在很多博客中都把“return-data”設置為了true然后在onActivityResult中通過data.getParcelableExtra("data")來獲取數(shù)據(jù),不過這樣的話dp這個變量的值就不能太大了,不然你的程序就掛了。這里也就是我遇到問題的地方了,在大多數(shù)高配手機上這樣用是沒有問題的,不過很多低配手機就有點hold不住了,直接就異常了,包括我們的國產(chǎn)神機米3也沒能hold住,所以我建議大家不要通過return data 大數(shù)據(jù),小數(shù)據(jù)還是沒有問題的,說以我們在剪切圖片的時候就盡量使用Uri這個東東來幫助我們。
下面是我們進行剪裁用到的一些參數(shù)
Exta Options Table for image/* crop:
SetExtra | DataType | Description |
crop | String | Signals the crop feature |
aspectX | int | Aspect Ratio |
aspectY | int | Aspect Ratio |
outputX | int | width of output created from this Intent |
outputY | int | width of output created from this Intent |
scale | boolean | should it scale |
return-data | boolean | Return the bitmap with Action=inline-data by using the data |
data | Parcelable | Bitmap to process, you may provide it a bitmap (not tested) |
circleCrop | String | if this string is not null, it will provide some circular cr |
MediaStore.EXTRA_OUTPUT ("output") | URI | Set this URi to a File:///, see example code |
最后把通過Uri獲得bitmap的方法給大家貼上
public static Bitmap getBitmapFromUri(Uri uri,Context mContext) { try { // 讀取uri所在的圖片 Bitmap bitmap = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(), uri); return bitmap; } catch (Exception e) { e.printStackTrace(); return null; } }
相關文章
Android中判斷網(wǎng)絡連接是否可用及監(jiān)控網(wǎng)絡狀態(tài)
獲取網(wǎng)絡信息需要在AndroidManifest.xml文件中加入相應的權限,接下來詳細介紹Android中判斷網(wǎng)絡連接是否可用及監(jiān)控網(wǎng)絡狀態(tài),感興趣的朋友可以參考下2012-12-12ShareSDK造成App崩潰的一個BUG原因分析以及Fix方法
這篇文章主要介紹了ShareSDK造成App崩潰的一個BUG原因分析以及Fix方法,使用的是Cocos2d-x專用ShareSDK組件,需要的朋友可以參考下2014-04-04利用Android中的TextView實現(xiàn)逐字顯示動畫
在安卓程序啟動的時候,想逐字顯示一段話,每個字都有一個從透明到不透明的漸變動畫。那如何顯示這個效果,下面一起來看看。2016-08-08詳解Android中ListView實現(xiàn)圖文并列并且自定義分割線(完善仿微信APP)
本篇文章主要介紹了Android中ListView實現(xiàn)圖文并列并且自定義分割線(完善仿微信APP),具有一定的參考價值,有興趣的可以了解一下。2016-12-12