雖然調用攝像頭拍照既方便又快捷,但並非每一次咱們都須要去當場拍一張照片的。 由於每一個人的手機相冊裏應該都會存有許許多多張照片,直接從相冊裏選取一張現有的照 片會比打開相機拍一張照片更加經常使用。一個優秀的應用程序應該將這兩種選擇方式都提供給 用戶,由用戶來決定使用哪種。下面咱們就來看一下,如何才能實現從相冊中選擇照片的 功能。android
仍是在 ChoosePicTest 項目的基礎上進行修改,首先編輯 activity_main.xml 文件,在佈局 中添加一個按鈕用於從相冊中選擇照片,代碼以下所示:ide
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"佈局
android:orientation="vertical" >xml
<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" />blog
<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 應用都會帶有的功能,如今你已 經將這兩種技術都學會了,未來在工做中若是須要開發相似的功能,相信你必定能輕鬆完成 吧。不過目前咱們的實現還不算完美,由於某些照片即便通過裁剪後體積仍然很大,直接加 載到內存中有可能會致使程序崩潰。更好的作法是根據項目的需求先對照片進行適當的壓縮,而後再加載到內存中。至於如何對照片進行壓縮,就要考驗你查閱資料的能力了,這裏 就再也不展開進行講解。