Android有两种拍照方法,一种是直接调用系统的照相Intent,使用 onActivityResult获取图片资源或者指定图片路径,拍照返回成功后去指定路径读取图片;一种是用SurfaceView自定义界面,添加业务个性化功能。

1、不管哪种拍照方法,首先,确认下权限:在AndroidManifest.xml文件中添加权限允许语句:

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

2、调用系统的照相方法:

拍照代码:

  1. packagecom.ziyouku.camera;
  2. importjava.io.File;
  3. importandroid.app.Activity;
  4. importandroid.content.Intent;
  5. importandroid.net.Uri;
  6. importandroid.os.Bundle;
  7. importandroid.os.Environment;
  8. importandroid.provider.MediaStore;
  9. importandroid.util.Log;
  10. importcom.ziyouku.demo.R;
  11. publicclassPhotoActivityextendsActivity {
  12. privateString TAG ="PhotoActivity";
  13. @Override
  14. publicvoidonCreate(Bundle savedInstanceState) {
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.main);
  17. try{
  18. Intent intent =newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
  19. File out =newFile(Environment.getExternalStorageDirectory(),
  20. "camera.jpg");
  21. Uri uri = Uri.fromFile(out);
  22. intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
  23. startActivityForResult(intent,0);
  24. }catch(Exception e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. @Override
  29. protectedvoidonActivityResult(intrequestCode,intresultCode, Intent data) {
  30. try{
  31. Log.v(TAG,"onActivityResult requestCode = "+ requestCode +"; resultCode = "
  32. + resultCode);
  33. if(requestCode !=0) {
  34. return;
  35. }
  36. if(resultCode ==0) {
  37. finish();
  38. return;
  39. }
  40. Intent intent =newIntent();
  41. intent.setClass(this, ViewPhotoActivity.class);
  42. this.startActivity(intent);
  43. }catch(Exception e) {
  44. Log.v(TAG, e.getMessage());
  45. }
  46. }
  47. }

查看照片代码:

  1. packagecom.ziyouku.camera;
  2. importandroid.app.Activity;
  3. importandroid.app.AlertDialog;
  4. importandroid.content.DialogInterface;
  5. importandroid.graphics.Bitmap;
  6. importandroid.graphics.BitmapFactory;
  7. importandroid.os.Bundle;
  8. importandroid.os.Environment;
  9. importandroid.util.Log;
  10. importandroid.view.MotionEvent;
  11. importandroid.widget.ImageView;
  12. importcom.ziyouku.demo.R;
  13. publicclassViewPhotoActivityextendsActivity {
  14. privateString TAG ="ViewPhotoActivity";
  15. privateAlertDialog alertDialog;
  16. privateImageView view;
  17. @Override
  18. protectedvoidonCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.camera);
  21. try{
  22. view = (ImageView) findViewById(R.id.image);
  23. String pathString = Environment.getExternalStorageDirectory()
  24. .toString() +"/camera.jpg";
  25. Log.v("","pathString = "+ pathString);
  26. Bitmap b = BitmapFactory.decodeFile(pathString);
  27. view.setImageBitmap(b);
  28. alertDialog =newAlertDialog.Builder(ViewPhotoActivity.this)
  29. .setMessage("ziyouku.com自由库测试demo")
  30. .setPositiveButton("ok",
  31. newDialogInterface.OnClickListener() {
  32. publicvoidonClick(DialogInterface dialog,
  33. intwhichButton) {
  34. }
  35. })
  36. .setNegativeButton("cancle",
  37. newDialogInterface.OnClickListener() {
  38. publicvoidonClick(DialogInterface dialog,
  39. intwhichButton) {
  40. }
  41. }).create();
  42. alertDialog.show();
  43. }catch(Exception e) {
  44. Log.v(TAG, e.getMessage());
  45. thrownewRuntimeException(e);
  46. }
  47. }
  48. @Override
  49. publicbooleanonTouchEvent(MotionEvent event) {
  50. Log.v(TAG,"onTouchEventevent = "+ event.getX());
  51. returnsuper.onTouchEvent(event);
  52. }
  53. }
3.自定义拍照的方法

  1. packagecom.ziyouku.camera;
  2. importjava.io.IOException;
  3. importcom.ziyouku.demo.R;
  4. importandroid.app.Activity;
  5. importandroid.content.pm.ActivityInfo;
  6. importandroid.graphics.Bitmap;
  7. importandroid.graphics.BitmapFactory;
  8. importandroid.graphics.PixelFormat;
  9. importandroid.hardware.Camera;
  10. importandroid.hardware.Camera.AutoFocusCallback;
  11. importandroid.hardware.Camera.Parameters;
  12. importandroid.hardware.Camera.PictureCallback;
  13. importandroid.hardware.Camera.ShutterCallback;
  14. importandroid.os.Bundle;
  15. importandroid.util.Log;
  16. importandroid.view.KeyEvent;
  17. importandroid.view.SurfaceHolder;
  18. importandroid.view.SurfaceView;
  19. importandroid.view.View;
  20. importandroid.view.Window;
  21. importandroid.view.WindowManager;
  22. importandroid.view.SurfaceHolder.Callback;
  23. importandroid.view.View.OnClickListener;
  24. importandroid.widget.ImageView;
  25. publicclassCameraCustomextendsActivityimplementsCallback, OnClickListener {
  26. privateSurfaceView mSurfaceView;
  27. privateSurfaceHolder mSurfaceHolder;
  28. privateCamera mCamera;
  29. privatebooleanmPreviewRunning;
  30. privateImageView mImageView;
  31. @Override
  32. publicvoidonCreate(Bundle savedInstanceState) {
  33. super.onCreate(savedInstanceState);
  34. this.requestWindowFeature(Window.FEATURE_NO_TITLE);
  35. getWindow().setFormat(PixelFormat.TRANSLUCENT);
  36. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  37. WindowManager.LayoutParams.FLAG_FULLSCREEN);
  38. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  39. setContentView(R.layout.main);
  40. mSurfaceView = (SurfaceView) findViewById(R.id.camera);
  41. mImageView = (ImageView) findViewById(R.id.image);
  42. mImageView.setVisibility(View.GONE);
  43. mSurfaceView.setOnClickListener(this);
  44. mSurfaceHolder = mSurfaceView.getHolder();
  45. mSurfaceHolder.addCallback(this);
  46. mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  47. }
  48. @Override
  49. publicvoidsurfaceChanged(SurfaceHolder holder,intformat,intwidth,
  50. intheight) {
  51. if(mPreviewRunning) {
  52. mCamera.stopPreview();
  53. }
  54. Parameters params = mCamera.getParameters();
  55. params.setPictureFormat(PixelFormat.JPEG);// 设置图片格式
  56. // params.setPreviewSize(width, height);
  57. params.set("rotation",90);
  58. mCamera.setParameters(params);
  59. try{
  60. mCamera.setPreviewDisplay(holder);
  61. }catch(IOException e) {
  62. e.printStackTrace();
  63. }
  64. mCamera.startPreview();
  65. mPreviewRunning =true;
  66. }
  67. privateAutoFocusCallback mAutoFocusCallBack =newAutoFocusCallback() {
  68. @Override
  69. publicvoidonAutoFocus(booleansuccess, Camera camera) {
  70. Log.v("AutoFocusCallback","AutoFocusCallback , boolean success:"+ success);
  71. Camera.Parameters Parameters = mCamera.getParameters();
  72. Parameters.setPictureFormat(PixelFormat.JPEG);// 设置图片格式
  73. mCamera.setParameters(Parameters);
  74. mCamera.takePicture(mShutterCallback,null, mPictureCallback);
  75. }
  76. };
  77. @Override
  78. publicvoidsurfaceCreated(SurfaceHolder holder) {
  79. mCamera = Camera.open();
  80. }
  81. @Override
  82. publicvoidsurfaceDestroyed(SurfaceHolder holder) {
  83. mCamera.stopPreview();
  84. mPreviewRunning =false;
  85. mCamera.release();
  86. mCamera =null;
  87. }
  88. /**
  89. * 拍照的回调接口
  90. */
  91. PictureCallback mPictureCallback =newPictureCallback() {
  92. @Override
  93. publicvoidonPictureTaken(byte[] data, Camera camera) {
  94. Log.v("PictureCallback","…onPictureTaken…");
  95. if(data !=null) {
  96. Bitmap bitmap = BitmapFactory.decodeByteArray(data,0,
  97. data.length);
  98. mImageView.setImageBitmap(bitmap);
  99. mImageView.setVisibility(View.VISIBLE);
  100. mSurfaceView.setVisibility(View.GONE);
  101. if(mPreviewRunning) {
  102. mCamera.stopPreview();
  103. mPreviewRunning =false;
  104. }
  105. }
  106. }
  107. };
  108. /**
  109. * 在相机快门关闭时候的回调接口,通过这个接口来通知用户快门关闭的事件,
  110. * 普通相机在快门关闭的时候都会发出响声.
  111. * 根据需要可以在该回调接口中定义各种动作, 例如:使设备震动
  112. */
  113. ShutterCallback mShutterCallback =newShutterCallback() {
  114. publicvoidonShutter() {
  115. // just log ,do nothing
  116. Log.v("ShutterCallback","…onShutter…");
  117. }
  118. };
  119. publicbooleanonKeyDown(intkeyCode, KeyEvent event) {
  120. if(keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
  121. if(mCamera !=null) {
  122. // mCamera.takePicture(null, null,mPictureCallback);
  123. mCamera.autoFocus(mAutoFocusCallBack);
  124. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
  125. }
  126. }
  127. returnsuper.onKeyDown(keyCode, event);
  128. }
  129. @Override
  130. publicvoidonClick(View arg0) {
  131. Log.v("onClick","…onClick…");
  132. mCamera.autoFocus(mAutoFocusCallBack);
  133. }
  134. }

布局文件:

  1. <?xml version="1.0"encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <SurfaceView android:id="@+id/camera"
  8. android:layout_width="fill_parent"
  9. android:layout_height="fill_parent"/>
  10. <ImageView android:id="@+id/image"
  11. android:contentDescription="@string/app_name"
  12. android:layout_width="fill_parent"
  13. android:layout_height="fill_parent"/>
  14. </LinearLayout>

更多相关文章

  1. Qt for Android 调用android原生接口分享图片或文字
  2. Android中的数据传递之Parcelable接口
  3. AIDL (Android Interface Definition Language) Android 接口定
  4. Parcalable接口使用(android传递结构体数据的方法)
  5. android从网站获取json接口数据并放置到spinner
  6. ISurfaceComposer接口有13个成员函数

随机推荐

  1. android 8.1.0 添加系统service
  2. android 使用xml selector设置按钮点击效
  3. android framework增加新的系统服务
  4. Android帮助文档.exe(第1,2,3部分)提供下载
  5. Unbuntu下Android studio报Unable to rec
  6. Activity四种启动模式:standard、singleTo
  7. Android Camera源码函数结构
  8. java引入Android NinePatch技术的意义
  9. Android(安卓)DynamicLoadApk 开源插件开
  10. 关于Android不能启动的问题