1. 程式人生 > >Android開發從相簿中選取照片

Android開發從相簿中選取照片

最近專案在做一個功能:就是需要從使用者選擇頭像跳轉到相簿選擇圖片,這應該是一個很簡單的需求,但是在網上搜了一下有好多都講的很亂,其實用幾十行程式碼就可以實現的為什麼要說的那麼複雜呢,下面就簡單說一下嘍。

下面說兩種方法分別是直接選擇相簿返回,另外一種為選擇相簿之後進行裁剪。先上效果圖這裡寫圖片描述

  • (1)直接選擇相簿後返回
  • 第一步就是主要跳轉的相簿
 //在這裡跳轉到手機系統相簿裡面
        Intent intent = new Intent(
                Intent.ACTION_PICK,
                android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(intent, IMAGE_REQUEST_CODE);
  第二步就是返回的時候獲取相簿的路徑
  @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        super.onActivityResult(requestCode, resultCode, data);
        //在相簿裡面選擇好相片之後調回到現在的這個activity中
        switch (requestCode) {
            case IMAGE_REQUEST_CODE://這裡的requestCode是我自己設定的,就是確定返回到那個Activity的標誌
                if (resultCode == RESULT_OK) {//resultcode是setResult裡面設定的code值
                    try {
                        Uri selectedImage = data.getData(); //獲取系統返回的照片的Uri
                        String[] filePathColumn = {MediaStore.Images.Media.DATA};
                        Cursor cursor = getContentResolver().query(selectedImage,
                                filePathColumn, null, null, null);//從系統表中查詢指定Uri對應的照片
                        cursor.moveToFirst();
                        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                        path = cursor.getString(columnIndex);  //獲取照片路徑
                        cursor.close();
                        Bitmap bitmap = BitmapFactory.decodeFile(path);
                        iv_photo.setImageBitmap(bitmap);
                    } catch (Exception e) {
                        // TODO Auto-generatedcatch block
                        e.printStackTrace();
                    }
                }
                break;
        }
    }
  • (2) 選擇圖片後裁剪先上圖
    這裡寫圖片描述
  • 首先也是要調起相簿
// 使用意圖直接呼叫手機相簿
        Intent intent = new Intent(
                Intent.ACTION_PICK,
                android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        // 開啟手機相簿,設定請求碼
        startActivityForResult(intent, IMAGE_REQUEST_CODE);

然後這裡增加了一步就是使用者選擇了相簿之後然後再增加裁剪功能

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != RESULT_OK) {
            return;
        } else {
            switch (requestCode) {
                case IMAGE_REQUEST_CODE:
                    resizeImage(data.getData());
                    break;

                case RESIZE_REQUEST_CODE:
                    if (data != null) {
                        showResizeImage(data);
                    }
                    break;
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }
    //這裡增加裁剪
    public void resizeImage(Uri uri) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        //裁剪的大小
        intent.putExtra("outputX", 150);
        intent.putExtra("outputY", 150);
        intent.putExtra("return-data", true);
        //設定返回碼
        startActivityForResult(intent, RESIZE_REQUEST_CODE);
    }
    private void showResizeImage(Intent data) {
        Bundle extras = data.getExtras();
        if (extras != null) {
            Bitmap photo = extras.getParcelable("data");
            //裁剪之後設定儲存圖片的路徑
            String path = getFilesDir().getPath() + File.separator + IMAGE_FILE_NAME;
            //壓縮圖片
            ImageUtils.saveImage(photo, path);
            new BitmapDrawable();
            Drawable drawable = new BitmapDrawable(photo);
            iv_photo.setImageDrawable(drawable);
        }
    }

ok,原始碼下載