Android的两种拍照方法

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

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

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

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

拍照代码:

  1. package com.ziyouku.camera;  
  2.  
  3. import java.io.File;  
  4. import android.app.Activity;  
  5. import android.content.Intent;  
  6. import android.net.Uri;  
  7. import android.os.Bundle;  
  8. import android.os.Environment;  
  9. import android.provider.MediaStore;  
  10. import android.util.Log;  
  11.  
  12. import com.ziyouku.demo.R;  
  13.  
  14. public class PhotoActivity extends Activity {  
  15.     private String TAG = "PhotoActivity";  
  16.  
  17.     @Override 
  18.     public void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.          setContentView(R.layout.main);  
  21.         try {  
  22.             Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
  23.             File out = new File(Environment.getExternalStorageDirectory(),  
  24.                     "camera.jpg");  
  25.             Uri uri = Uri.fromFile(out);  
  26.             intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);  
  27.             startActivityForResult(intent, 0);  
  28.         } catch (Exception e) {  
  29.             e.printStackTrace();  
  30.         }  
  31.     }  
  32.  
  33.     @Override 
  34.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  35.         try {  
  36.             Log.v(TAG, "onActivityResult requestCode = " + requestCode + "; resultCode =  " 
  37.                     + resultCode);  
  38.             if (requestCode != 0) {  
  39.                 return;  
  40.             }  
  41.             if (resultCode == 0) {  
  42.                 finish();  
  43.                 return;  
  44.             }  
  45.             Intent intent = new Intent();  
  46.             intent.setClass(this, ViewPhotoActivity.class);  
  47.             this.startActivity(intent);  
  48.  
  49.         } catch (Exception e) {  
  50.             Log.v(TAG, e.getMessage());  
  51.         }  
  52.     }  

查看照片代码:

  1. package com.ziyouku.camera;  
  2.  
  3. import android.app.Activity;  
  4. import android.app.AlertDialog;  
  5. import android.content.DialogInterface;  
  6. import android.graphics.Bitmap;  
  7. import android.graphics.BitmapFactory;  
  8. import android.os.Bundle;  
  9. import android.os.Environment;  
  10. import android.util.Log;  
  11. import android.view.MotionEvent;  
  12. import android.widget.ImageView;  
  13.  
  14. import com.ziyouku.demo.R;  
  15.  
  16. public class ViewPhotoActivity extends Activity {  
  17.     private String TAG = "ViewPhotoActivity";  
  18.     private AlertDialog alertDialog;  
  19.     private ImageView view;  
  20.  
  21.     @Override 
  22.     protected void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         setContentView(R.layout.camera);  
  25.         try {  
  26.             view = (ImageView) findViewById(R.id.image);  
  27.             String pathString = Environment.getExternalStorageDirectory()  
  28.                     .toString() + "/camera.jpg";  
  29.             Log.v("""pathString = " + pathString);  
  30.             Bitmap b = BitmapFactory.decodeFile(pathString);  
  31.             view.setImageBitmap(b);  
  32.             alertDialog = new AlertDialog.Builder(ViewPhotoActivity.this)  
  33.                     .setMessage("ziyouku.com自由库测试demo")  
  34.                     .setPositiveButton("ok",  
  35.                             new DialogInterface.OnClickListener() {  
  36.                                 public void onClick(DialogInterface dialog,  
  37.                                         int whichButton) {  
  38.                                 }  
  39.                             })  
  40.                     .setNegativeButton("cancle",  
  41.                             new DialogInterface.OnClickListener() {  
  42.                                 public void onClick(DialogInterface dialog,  
  43.                                         int whichButton) {  
  44.                                 }  
  45.                             }).create();  
  46.             alertDialog.show();  
  47.         } catch (Exception e) {  
  48.             Log.v(TAG, e.getMessage());  
  49.             throw new RuntimeException(e);  
  50.         }  
  51.     }  
  52.  
  53.     @Override 
  54.     public boolean onTouchEvent(MotionEvent event) {  
  55.         Log.v(TAG, "onTouchEventevent = " + event.getX());  
  56.         return super.onTouchEvent(event);  
  57.     }  
3.自定义拍照的方法

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

布局文件:

  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>  

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值