雖然調用攝像頭拍照既方便又快捷,但並不是每一次我們都需要去當場拍一張照片的。 因為每個人的手機相冊里應該都會存有許許多多張照片,直接從相冊里選取一張現有的照 片會比打開相機拍一張照片更加常用。一個優秀的應用程序應該將這兩種選擇方式都提供給 用戶,由用戶來決定使用哪一種。下面我們就來看一下,如何才能實現從相冊中選擇照片的 功能。
還是在 ChoosePicTest 項目的基礎上進行修改,首先編輯 activity_main.xml 文件,在布局 中添加一個按鈕用於從相冊中選擇照片,代碼如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"
android:orientation="vertical" >
<Button android:id="@+id/take_photo" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Take Photo" />
<Button android:id="@+id/choose_from_album" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Choose From Album" />
<ImageView android:id="@+id/picture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" />
</LinearLayout>
然后修改 MainActivity 中的代碼,加入從相冊選擇照片的邏輯,代碼如下所示:
public class MainActivity extends Activity {
……
private Button chooseFromAlbum;
@Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
……
chooseFromAlbum = (Button) findViewById(R.id.choose_from_album);
chooseFromAlbum.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 創建File對象,用於存儲選擇的照片
File outputImage = new File(Environment. getExternalStorageDirectory(), "output_image.jpg");
try {
if (outputImage.exists()) {
outputImage.delete();
}
outputImage.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
imageUri = Uri.fromFile(outputImage);
Intent intent = new Intent("android.intent.action.
intent.setType("image/*"); intent.putExtra("crop", true);
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, CROP_PHOTO);
});
}
……
}
可以看到,在 Choose From Album 按鈕的點擊事件里我們同樣創建了一個 File 對象,用 於 存 儲 從相 冊 中 選 擇 的 圖 片。 然 后 構 建 出 一 個 Intent 對 象 , 並將 它 的 action 指 定 為 android.intent.action.GET_CONTENT。接着給這個 Intent 對象設置一些必要的參數,包括是 否允許縮放和裁剪、圖片的輸出位置等。最后調用 startActivityForResult()方法,就可以打開 相冊程序選擇照片了。
注意在調用 startActivityForResult() 方法的時候,我們給第二個參數傳入的值仍然是CROP_PHOTO 常量,這樣的好處就是從相冊選擇好照片之后,會直接進入到 CROP_PHOTO
的 case 下將圖片顯示出來,這樣就可以復用之前寫好的顯示圖片的邏輯,不用再編寫一遍了。 現在將程序重新運行到手機上,然后點擊一下 Choose From Album 按鈕,就會打開相冊
程序,如圖 8.16 所示。

圖 8.16
然后隨意選擇一張照片就可以對它進行裁剪,如圖 8.17 所示。

圖 8.17
最后點擊完成,回到我們程序的界面,就會看到裁剪后的圖片已經顯示出來了,如圖8.18 所示。

圖 8.18
調用攝像頭拍照以及從相冊中選擇照片是很多 Android 應用都會帶有的功能,現在你已 經將這兩種技術都學會了,將來在工作中如果需要開發類似的功能,相信你一定能輕松完成 吧。不過目前我們的實現還不算完美,因為某些照片即使經過裁剪后體積仍然很大,直接加 載到內存中有可能會導致程序崩潰。更好的做法是根據項目的需求先對照片進行適當的壓縮,然后再加載到內存中。至於如何對照片進行壓縮,就要考驗你查閱資料的能力了,這里 就不再展開進行講解。
