背景:在上個星期,我想要做一個頭像上傳功能,然而我用的是華爲手機,聽說華爲和小米的適配特別難做,果不其然,也有人建議我去自定義一個圖片剪裁工具,當然有開源的我就直接用了。 也好使,但是我就是想要在原始的代碼上去解決這個問題。結果也是解決了問題。
一般情況中的問題:
1.oom
2.圖片方向不對
3.activity result 的時候data == null
4.調用圖庫的時候沒找到軟件
以上的問題基本都解決了,但是我今天遇到的問題是第三個,data == null。這個的現象就是,照了相之後跳到圖片剪裁,但是在剪裁哪兒剪裁之後就沒有反應了,對,沒有反應或者就是報錯,報的是空指針。
先把做好的給你看看,我的是華爲手機,嘿嘿,然後也有源碼供你們下載。
直接說怎麼解決:
1,在截圖這兒的代碼,中
intent.putExtra("return-data", false);//設置爲不返回數據
在我看的很多博客中都把“return-data”設置爲了true然後在onActivityResult中通過data.getParcelableExtra("data")來獲取數據,不過這樣的話dp這個變量的值就不能太大了,不然你的程序就掛了。這裏也就是我遇到問題的地方了,在大多數高配手機上這樣用是沒有問題的,不過很多低配手機就有點hold不住了,直接就異常了,包括我們的國產神機小米也沒能hold住,所以我建議大家不要通過return
data 大數據,小數據還是沒有問題的,說以我們在剪切圖片的時候就儘量使用Uri這個東東來幫助我們。
* 進行截圖
* @param context Activity上下文對象
* @param uri Uri
* @param size 大小
*/
public static void startPhotoZoom(Activity context,Uri uri, int size) {
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);
intent.putExtra("aspectY", 1);
// outputX,outputY 是剪裁圖片的寬高
intent.putExtra("outputX", size);
intent.putExtra("outputY", size);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
</span><span style="color:#ff6666;">intent.putExtra("return-data", false);//設置爲不返回數據
context.startActivityForResult(intent, Configs.SystemPicture.PHOTO_REQUEST_CUT);
}
2,就是在剪裁圖片之後將圖片result返回,<span style="color:#373737;">@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case Configs.SystemPicture.PHOTO_REQUEST_TAKEPHOTO: // 拍照
Log.i("iiiiiii","1232343");
SelectHeadTools.startPhotoZoom(this,photoUri, 600);
break;
case Configs.SystemPicture.PHOTO_REQUEST_GALLERY://相冊獲取
if (data !=null)
photoUri = data.getData();
SelectHeadTools.startPhotoZoom(this, data.getData(), 600);
break;
case Configs.SystemPicture.PHOTO_REQUEST_CUT: //接收處理返回的圖片結果,這個過程比較重要
Log.i("iiiiiii_cut","1232343");
if (photoUri==null)
break;
/*Bitmap bit = data.getExtras().getParcelable("data"); </span><span style="color:#ff6666;"> //不要再用data的方式了,會出現activity result 的時候data == null的空的情況
try
{
cropBitmap = getBitmapFromUri(photoUri, this); /</span><span style="color:#ff6666;">//通過獲取uri的方式,直接解決了報空和圖片像素高的oom問題
if (cropBitmap != null) {
iv_show.setImageBitmap(cropBitmap);
}
}
catch (Exception e)
{
e.printStackTrace();
}
//下面可以用來上傳pc服務端
File file = FileTools.getFileByUri(this,photoUri);
Log.d("File",file.toString());
break;
}
}
public Bitmap getBitmapFromUri(Uri uri,Context mContext)
{
try
{
</span><span style="color:#ff6666;">// 讀取uri所在的圖片</span><span style="color:#373737;">
Bitmap bitmap = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(), uri);
return bitmap;
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
對,通過這樣的方式就能解決該問題。
紀實:2016.2.22
源碼地址:http://download.csdn.net/detail/syif88/9439230
以及自定義相片剪裁工具源碼地址:http://download.csdn.net/detail/syif88/9439235