SurfaceView 拍照功能

//代码部分

1
public class CameraActivity extends Activity 2 implements Callback, OnClickListener { 3 4 private static final int MENU_START = 1; 5 private static final int MENU_UP=2; 6 private static final int MENU_CANCEL=2; 7 private SurfaceView mSurfaceView; 8 private SurfaceHolder mSurfaceHolder; 9 private Camera mCamera; 10 private boolean mPreviewRunning; 11 private ImageView mImageView; 12 13 /** 14 * 拍照的回调接口 15 */ 16 PictureCallback mPictureCallback = new PictureCallback() { 17 18 public void onPictureTaken(byte[] data, Camera camera) { 19 Log.d("PictureCallback", "...onPictureTaken..."); 20 if (data != null) { 21 try { 22 DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("/sdcard/camera.jpg")); 23 dataOutputStream.write(data); 24 dataOutputStream.flush(); 25 } catch (Exception e) { 26 Log.e("PictureCallback", e.toString()); 27 } 28 Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, 29 data.length); 30 mImageView.setImageBitmap(bitmap); 31 mImageView.setVisibility(View.VISIBLE); 32 mSurfaceView.setVisibility(View.GONE); 33 if (mPreviewRunning) { 34 mCamera.stopPreview(); 35 mPreviewRunning = false; 36 } 37 38 } 39 } 40 41 }; 42 /** 43 * 在相机快门关闭时候的回调接口,通过这个接口来通知用户快门关闭的事件, 44 * 普通相机在快门关闭的时候都会发出响声,根据需要可以在该回调接口中定义各种动作, 45 * 例如:使设备震动 46 */ 47 ShutterCallback mShutterCallback = new ShutterCallback() { 48 49 public void onShutter() { 50 //just log ,do nothing 51 Log.d("ShutterCallback", "...onShutter..."); 52 } 53 54 }; 55 56 /** Called when the activity is first created. */ 57 @Override 58 public void onCreate(Bundle savedInstanceState) { 59 super.onCreate(savedInstanceState); 60 61 requestWindowFeature(Window.FEATURE_NO_TITLE); 62 getWindow().setFormat(PixelFormat.TRANSLUCENT); 63 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 64 WindowManager.LayoutParams.FLAG_FULLSCREEN); 65 setContentView(R.layout.camera); 66 mSurfaceView = (SurfaceView) findViewById(R.id.camera); 67 mImageView = (ImageView) findViewById(R.id.image); 68 mImageView.setVisibility(View.GONE); 69 70 mSurfaceView.setOnClickListener(this); 71 mSurfaceHolder = mSurfaceView.getHolder(); 72 mSurfaceHolder.addCallback(this); 73 mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 74 75 } 76 77 @Override 78 public boolean onCreateOptionsMenu(Menu menu) { 79 super.onCreateOptionsMenu(menu); 80 menu.add(0, MENU_START, 0, R.string.camera_start); 81 menu.add(1, MENU_UP, 0, R.string.camera_UP); 82 menu.add(2, MENU_CANCEL, 0, R.string.camera_cancel); 83 return true; 84 } 85 86 @Override 87 public boolean onOptionsItemSelected(MenuItem item) { 88 if (item.getItemId() == MENU_START) { //拍照 89 mImageView.setVisibility(View.GONE); 90 mSurfaceView.setVisibility(View.VISIBLE); 91 if (mPreviewRunning) { 92 mCamera.stopPreview(); 93 } 94 mCamera.startPreview(); 95 96 mPreviewRunning = true; 97 return true; 98 } 99 if(item.getItemId() ==MENU_UP){ //上传照片 100 101 102 } 103 if(item.getItemId() ==MENU_CANCEL){ //取消操作 104 105 CameraActivity.this.finish(); 106 } 107 return super.onOptionsItemSelected(item); 108 } 109 110 public void surfaceChanged(SurfaceHolder holder, int format, int width, 111 int height) { 112 if (mPreviewRunning) { 113 mCamera.stopPreview(); 114 } 115 Parameters params = mCamera.getParameters(); 116 params.setPreviewSize(120, 120); //直接规定照片大小 117 mCamera.setParameters(params); 118 119 try { 120 mCamera.setPreviewDisplay(holder); 121 } catch (IOException e) { 122 e.printStackTrace(); 123 } 124 mCamera.startPreview(); 125 mPreviewRunning = true; 126 } 127 128 public void surfaceCreated(SurfaceHolder holder) { 129 mCamera = Camera.open(); 130 } 131 132 public void surfaceDestroyed(SurfaceHolder holder) { 133 mCamera.stopPreview(); 134 mPreviewRunning = false; 135 mCamera.release(); 136 mCamera = null; 137 } 138 139 public void onClick(View v) { 140 mCamera.takePicture(mShutterCallback, null, mPictureCallback); 141 } 142 }


XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <SurfaceView
        android:id="@+id/surface_camera"
        android:layout_width="fill_parent"
        android:layout_height="300dp" >

    </SurfaceView>

    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>


<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<!-- 调用摄像头权限 --> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- sd卡读写权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 挂载sd卡 -->

 

 

 

转载于:https://www.cnblogs.com/xxiloveyou/p/3370373.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值