android系統自帶的有裁剪圖片功能,在應用過程中,碰到了諸多問題,在些做個記錄:
代碼如下,註釋很詳細,記得加寫入sd卡數據的權限
public class MainActivity extends Activity {
private static final int TAKE_BIG_PICTURE = 100;
private static final int TAKE_SMALL_PICTURE = 101;
private static final int CROP_BIG_PICTURE = 102;
private static final int CROP_SMALL_PICTURE = 103;
private Button pick_photo, take_photo;
private static final String IMAGE_FILE_LOCATION = "file:///sdcard/temp.jpg";
Uri imageUri = Uri.parse(IMAGE_FILE_LOCATION);
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pick_photo = (Button) findViewById(R.id.bt_gallery);
take_photo = (Button) findViewById(R.id.bt_camera);
imageView = (ImageView) findViewById(R.id.iv_photo);
pick_photo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//啓動圖片庫
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, TAKE_SMALL_PICTURE);
}
});
take_photo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//啓動相機去拍照,直接傳入了uri,照完以後,會把照片直接存儲到這個uri
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//action is capture
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, TAKE_BIG_PICTURE);//or TAKE_SMALL_PICTURE
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case TAKE_BIG_PICTURE:
//照相機照完以後返回結果,因爲在啓動相機的時候,已經指定了uri,所以可以直接從這個uri取
//調用裁剪方法(注意,這裏沒有判斷是否爲空,應用中應該判斷)
cropImageUri(imageUri, 800, 400, CROP_BIG_PICTURE);
break;
case TAKE_SMALL_PICTURE:
//調用圖片庫在這裏返回結果
//調用裁剪方法(注意,這裏沒有判斷是否爲空,應用中應該判斷)
cropImageUri(data.getData(), 300, 150, CROP_SMALL_PICTURE);
break;
case CROP_BIG_PICTURE:
//這裏是相機裁剪後的返回
//可以參照裁剪方法,裏面已經指定了uri,所以在這裏,直接可以從裏面取uri,然後獲取bitmap,並且設置到imageview
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
imageView.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
break;
case CROP_SMALL_PICTURE:
//這裏是調用圖片庫裁剪後的返回
//可以參照裁剪方法,裏面已經指定了uri,所以在這裏,直接可以從裏面取uri,然後獲取bitmap,並且設置到imageview
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
imageView.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
private void cropImageUri(Uri uri, int outputX, int outputY, int requestCode) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
//是否裁剪
intent.putExtra("crop", "true");
//設置xy的裁剪比例
intent.putExtra("aspectX", 2);
intent.putExtra("aspectY", 1);
//設置輸出的寬高
intent.putExtra("outputX", outputX);
intent.putExtra("outputY", outputY);
//是否縮放
intent.putExtra("scale", false);
//輸入圖片的Uri,指定以後,可以在這個uri獲得圖片
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
//是否返回圖片數據,可以不用,直接用uri就可以了
intent.putExtra("return-data", false);
//設置輸入圖片格式
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
//是否關閉面部識別
intent.putExtra("noFaceDetection", true); // no face detection
//啓動
startActivityForResult(intent, requestCode);
}
}
開發過程中遇到的問題:
1、我還看到網上有一些其它寫法,選擇圖片庫,直接返回圖片數據。那樣太佔內存,不如直接返回uri,用的時候,再去取圖片。
2、Android java.io.FileNotFoundException: open failed: EACCES (Permission denie
華爲手機,老是取不到圖片,讀log,是因爲權限問題,我們浪費了很長時間,最後查明,是手機連在電腦上處於調用狀態的原因,
有些手機,連上電腦以後,sd卡是不可讀取的,所以纔會出現權限問題,這個大家可以注意一下