close

今天宅宅要來教大家寫程式啦!

最近剛好學會開啟手機的相機或圖片庫存取照片,

所以來跟大家分享一下~

 

一、開相機存取照片

    Intent intent = new Intent(
        android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    File tmpFile = new File(
        Environment.getExternalStorageDirectory(), "image.jpg");
    outputFileUri = Uri.fromFile(tmpFile);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
    startActivityForResult(intent, PICK_FROM_CAMERA);

 

開啟相機的部分直接使用Intent的方式呼叫相機打開,

tmpFile是給我們拍的照片命名,再它轉成Uri (Uri這部分將會在後面使用到),

開啟Activity的部分不是平常直接用staetActivty,而是使用startActivityForResult,

因為要在拍完照回傳那張照片的資訊,所以需要他return result。

 

二、開相簿存去圖片

    Intent i = new Intent(Intent.ACTION_PICK, null);
    i.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
    startActivityForResult(i, PICK_FROM_GALLERY);
 
開啟相簿的部分就更簡單啦,

我們要去設定我們要開啟的是哪個東西,

在setDataAndType給不同的值就可以拿取不同的資料,

這次我們是要開啟相簿,因此要去的位置就是image啦~

 

 

那要拿取回傳值則需要呼叫onActivityResult這個function,

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == PICK_FROM_CAMERA || requestCode == PICK_FROM_GALLERY) {
            if (resultCode == RESULT_OK) {

                Intent intent = new Intent("com.android.camera.action.CROP");
                intent.setDataAndType(outputFileUri, "image/*");
                intent.putExtra("crop", "true");  //crop = true時就打開裁切畫面
                intent.putExtra("aspectX", 1);    //aspectX與aspectY是設定裁切框的比例
                intent.putExtra("aspectY", 1);
                intent.putExtra("outputX", 150);  //這則是裁切的照片大小
                intent.putExtra("outputY", 150);
                intent.putExtra("return-data", true);
                startActivityForResult(intent, PICK_FROM_GET);

            }
        }  else if (requestCode == PICK_FROM_GET) {
            Bundle extras = data.getExtras();
                if (extras != null) {
                    Bitmap photo = extras.getParcelable("data");

                    int oldwidth = photo.getWidth();
                    int oldheight = photo.getHeight();
                    float scaleWidth = 100 / (float) oldwidth;
                    float scaleHeight = 100 / (float) oldheight;
                    Matrix matrix = new Matrix();
                    matrix.postScale(scaleWidth, scaleHeight);
                    // create the new Bitmap object
                    Bitmap resizedBitmap = Bitmap.createBitmap(photo, 0, 0, oldwidth,
                            oldheight, matrix, true);

                    mAvaterEdit.setImageBitmap(resizedBitmap);
            }
        }
    }

 

這段有點長,讓我來大致說明一下,

第一個if是從相機或相簿回來時做的事,

拿到照片後,我去開啟裁切相片的畫面,

第二個if是裁切畫面回來時做的,

當拿到裁切後的資料後,

我再去將我拿到得照片去做縮小,

縮放的大小是可以自己訂的,

當然不做縮放是也可以的,

只是如果有做縮放比較不會遇到out of memory的問題。

 

這次的教學就到此結束啦~

如果有問題歡迎發問,

或者我有說錯的地方也歡迎糾正。

arrow
arrow

    獅子毛容容 發表在 痞客邦 留言(0) 人氣()