固然,在捕獲一張照片時,若是Camera程序沒有將圖片返回給調用活動,那麼簡單的使用內置的Camera應用程序捕獲圖像將不具備真正的做用。而爲了使用它真正有用,能夠將活動中的startActivity方法替換成startActivityForResult方法。使用該方法將容許咱們訪問從Camera應用程序中返回的數據,它剛好是用戶以位圖(Bitmap)形式捕獲的圖像。android
一下是一個基本的示例。編程
1 package com.bluemobi.nthm.showversion; 2 3 import android.app.Activity; 4 import android.content.Intent; 5 import android.graphics.Bitmap; 6 import android.os.Bundle; 7 import android.widget.ImageView; 8 9 public class CameraIntent extends Activity { 10 private final static int CAMERA_RESULT=0; 11 private ImageView imv; 12 @Override 13 protected void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.cameraintentactivity); 16 17 Intent i=new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 18 startActivityForResult(i, CAMERA_RESULT); 19 } 20 @Override 21 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 22 super.onActivityResult(requestCode, resultCode, data); 23 if(resultCode==RESULT_OK){ 24 Bundle extras=data.getExtras(); 25 Bitmap bmp=(Bitmap) extras.get("data"); 26 27 imv=(ImageView) findViewById(R.id.ReturnedImageView); 28 imv.setImageBitmap(bmp); 29 } 30 } 31 32 }
它須要在項目的layout/cameraintentactivity.xml 文件中添加以下的內容:app
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" > 6 7 <ImageView 8 android:id="@+id/ReturnedImageView" 9 android:layout_width="wrap_content" 10 android:layout_height="wrap_content" 11 android:contentDescription="@string/about_us"/> 12 13 </LinearLayout>
爲了完成上述示例,一下是AndroidManifest.xml文件的內容。ide
1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.bluemobi.nthm.showversion" 4 android:versionCode="1" 5 android:versionName="1.0" > 6 7 <uses-sdk 8 android:minSdkVersion="11" android:targetSdkVersion="20" /> 9 10 <application 11 android:icon="@drawable/ic_launcher" 12 android:label="@string/app_name"> 13 <activity 14 android:name=".CameraIntent" 15 android:label="@string/app_name" > 16 <intent-filter> 17 <action android:name="android.intent.action.MAIN" /> 18 <category android:name="android.intent.category.LAUNCHER" /> 19 </intent-filter> 20 </activity> 21 </application> 22 </manifest>
在此示例中,Camera應用程序在一個經過意圖傳遞的附加值(extra)中返回圖像,而該意圖將在onActivityResult方法中傳遞給主調活動。附加值的名稱「data」,它包含一個Bitmap對象,須要從泛型對象將它強制轉換過來。佈局
1 //從意圖中獲取附加值 2 Bundle extras=data.getExtras(); 3 //從附加值中獲取返回的對象 4 Bitmap bmp=(Bitmap) extras.get("data");
在咱們的佈局XML(layout/cameraintentactivity.xml)文件中,有一個ImageView對象。該ImageView是泛型視圖的擴展,其支持圖像的顯示。因爲咱們有一個帶有指定ReturnedImageView編號(id)的ImageView對象,所以須要在活動中得到它的引用,並經過setImageBitmap方法將它的Bitmap對象設置爲返回的圖像。這將使得應用程序用戶可以查看這幅捕獲的圖像。spa
爲了得到ImageView對象的引用,使用在Activity類中指定的標準方法findViewById。該方法使得咱們可以以編程的方式引用在佈局XML文件中指定的元素,咱們正在經過將元素id傳遞給setContentView來使用佈局XML文件。上述示例在XML中以如下方式指定ImageView對象:設計
1 <ImageView 2 android:id="@+id/ReturnedImageView" 3 android:layout_width="wrap_content" 4 android:layout_height="wrap_content" 5 android:contentDescription="@string/about_us"/>
爲了引用ImageView並通知它顯示來自Camera的Bitmap對象,使用如下代碼。code
1 imv=(ImageView) findViewById(R.id.ReturnedImageView); 2 imv.setImageBitmap(bmp);
當運行這個示例時,你可能會注意到結果圖像很小。這不是一個bug——相反這是一個通過精心設計的。當經過一個意圖觸發時,Camera應用程序不會將全尺寸的圖像返回給主調活動。一般,這樣作須要大量的內存,而移動設備通常內存方面受限。相反,Camera應用程序將在返回一幅很小的縮略圖。xml