android: 從相冊中選擇照片


雖然調用攝像頭拍照既方便又快捷,但並不是每一次我們都需要去當場拍一張照片的。 因為每個人的手機相冊里應該都會存有許許多多張照片,直接從相冊里選取一張現有的照 片會比打開相機拍一張照片更加常用。一個優秀的應用程序應該將這兩種選擇方式都提供給 用戶,由用戶來決定使用哪一種。下面我們就來看一下,如何才能實現從相冊中選擇照片的 功能。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM