Android中可以簡單直接地使用intent來獲取已安裝應用軟件提供的功能,它是Android的關鍵組件之一,主要作用有兩個:一是觸發其他應用程序提供的功能;二是在單個應用程序中實現Activity之間的切換。
軟件開發人員使用intent filter來聲明應用程序提供某種特定功能,這個聲明是在AndroidManifest.xml中進行的,例如,內置的Camera應用在它的manifest文件中的"Camera"標簽下進行了如下聲明:
[html]
- <intent-filter>
-
- <action android:name="android.media.action.IMAGE_CAPTURE" />
-
- <action android:name="android.intent.category.DEFAULT"/>
-
- </intent-filter>
要通過intent來使用Camera應用,我們只需創建一個Intent來捕獲上面聲明的filter就行,代碼如下:
[java]
- Intent it = new Intent("android.media.action.IMAGE_CAPTURE");
但上面代碼顯然屬於硬編碼,字符串"android.media.action.IMAGE_CAPTURE"將來如果改變了,我們的代碼也得跟著修改,不利於維護,好在MediaStore類提供常量ACTION_IMAGE_CAPTURE供開發人員使用,這樣字符串名稱變動就在Android內部自己解決,對外的接口ACTION_IMAGE_CAPTURE不變,改進後的代碼如下:
[java]
- Intent it = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
-
- startActivity(it);
1)從Camera應用返回數據
只捕獲圖像而不進行存儲或其他處理是沒有任何意義的,為了獲得Camera應用捕獲到的圖像,我們只需使用startActivityForResult函數代替startActivity,同時重載Activity的函數onActivityResult即可,從Camera返回的數據我們當作Bitmap來處理,代碼如下:
[java]
- package hust.iprai.asce1885.promedia;
-
- import android.app.Activity;
- import android.content.Intent;
- import android.graphics.Bitmap;
- import android.os.Bundle;
- import android.widget.ImageView;
-
- public class ImageCaptureActivity extends Activity {
-
- final static int CAMERA_RESULT = 0;
- ImageView iv = null;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
- Intent it = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
- startActivityForResult(it, CAMERA_RESULT);
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
-
- if (RESULT_OK == resultCode) {
- // Get Extra from the intent
- Bundle extras = data.getExtras();
- // Get the returned image from extra
- Bitmap bmp = (Bitmap) extras.get("data");
-
- iv = (ImageView) findViewById(R.id.ReturnedImageView);
- iv.setImageBitmap(bmp);
- }
- }
- }