android使用系統裁剪圖片

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卡是不可讀取的,所以纔會出現權限問題,這個大家可以注意一下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章