橘子味的心
标题:5.4 Android调用相机进行拍照

借助于 Intent,可以方便地调用 Android 系统的照相机程序进行拍照。但是需要声明摄像头的使用权限,即在 AndroidManifest.xml 文件中添加如下代码:

<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera"/>

实例 CameraDemo 演示了通过 Intent 调用系统的拍照程序并返回照片的过程,该实例运行效果如图 1 所示。

CameraDemo实例运行效果
图 1  CameraDemo实例运行效果

当单击“启动摄像头”按钮时,启动 Android 系统自带的照相机应用程序进行拍照,并将拍摄的照片显示到 ImageView 组件中。

实例 CameraDemo 中的 main.xml 代码如下:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical">
  6.  
  7. <Button
  8. android:id="@+id/button1"
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:text="@string/camera" />
  12.  
  13. <ImageView
  14. android:id="@+id/imageview"
  15. android:layout_width="wrap_content"
  16. android:layout_height="wrap_content" />
  17. </LinearLayout>
在实例 CameraDemo 中的 AndroidManifest.xml 代码如下:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="introduction.android.receivemessagedemo"
  4. android:versionCode="1"
  5. android:versionName="1.0">
  6.  
  7. <uses-sdk android:minSdkVersion="14" />
  8.  
  9. <uses-permission android:name="android.permission.CAMERA" />
  10. <uses-feature android:name="android.hardware.camera" />
  11. <application
  12. android:allowBackup="true"
  13. android:icon="@mipmap/ic_launcher"
  14. android:label="@string/app_name"
  15. android:roundIcon="@mipmap/ic_launcher_round"
  16. android:supportsRtl="true"
  17. android:theme="@style/AppTheme">
  18. <activity android:name=".MainActivity">
  19. <intent-filter>
  20. <action android:name="android.intent.action.MAIN" />
  21. <category android:name="android.intent.category.LAUNCHER" />
  22. </intent-filter>
  23. </activity>
  24. </application>
  25.  
  26. </manifest>
在实例 CameraDemo 中的 CameraDemoActivity.java 代码如下:
  1. import android.app.Activity;
  2. import android.content.Intent;
  3. import android.graphics.Bitmap;
  4. import android.os.Bundle;
  5. import android.provider.MediaStore;
  6. import android.util.Log;
  7. import android.view.View;
  8. import android.view.View.OnClickListener;
  9. import android.widget.Button;
  10. import android.widget.ImageView;
  11.  
  12. public class MainActivity extends Activity {
  13. /**
  14. * Called when the activity is first created.
  15. */
  16. private ImageView imageview;
  17. private Button btn;
  18.  
  19. @Override
  20. public void onCreate(Bundle savedInstanceState) {
  21. super.onCreate(savedInstanceState);
  22. setContentView(R.layout.activity_main);
  23. imageview = (ImageView) findViewById(R.id.imageview);
  24. btn = (Button) findViewById(R.id.button1);
  25. btn.setOnClickListener(new OnClickListener() {
  26. public void onClick(View v) {
  27. // TODO Auto-generated method stub
  28. try {
  29. Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  30. startActivityForResult(i, 1);
  31. } catch (Exception e) {
  32. Log.d("cameraDemo", e.toString());
  33. }
  34. }
  35. });
  36. }
  37.  
  38. protected void onActivityResult(int requestcode, int resultCode, Intent data) {
  39. try {
  40. if (requestcode != 1) {
  41. return;
  42. }
  43. super.onActivityResult(requestcode, resultCode, data);
  44. Bundle extras = data.getExtras();
  45. Bitmap bitmap = (Bitmap) extras.get("data");
  46. imageview.setImageBitmap(bitmap);
  47. } catch (Exception e) {
  48. Log.d("cameraDemo", e.toString());
  49. }
  50. }
  51. }
在启动摄像头程序时,因为要传回拍摄的图像,所以调用了 Activity.startActivityForResult(Intent intent, int requestCode) 方法。

当 startActivityForResult() 方法启动的 Activity 正常结束时,会自动返回发出请求的 Activity,并且该方法会返回对应的 requestCode 值给 onActivityResult(int requestcode, int resultCode,Intent data) 方法,借此可以在请求 Activity 和发出请求的 Activity 之间进行数据传递。本实例借助于这一特点传回了 Android 系统照相机程序拍摄的照片。