package com.example.day202; import android.content.ContentValues; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.hardware.Camera; import android.net.Uri; import android.os.Handler; import android.provider.MediaStore; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import java.io.FileNotFoundException; import java.io.IOException; import java.io.OutputStream; /** * 构建基于定时器的camera程序 */ public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PictureCallback, View.OnClickListener { private SurfaceView surfaceView; //预览显示的surface private SurfaceHolder surfaceHolder; private TextView textView; //显示倒计时的文本区域 private Button take; //开始按钮 private Camera camera; //相机 private Handler handler; private boolean timerTRunning = false; //判断点击后是直接调用相机还是先倒计时 private int currentTime = 10; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); //设置为横屏 surfaceView = (SurfaceView) findViewById(R.id.surfaceView); surfaceHolder = surfaceView.getHolder(); textView = (TextView) findViewById(R.id.text); //显示倒计时 take = (Button) findViewById(R.id.take); //开始倒计时按钮 surfaceHolder.addCallback(this); surfaceView.setClickable(true); surfaceView.setOnClickListener(this); surfaceView.setFocusable(true); surfaceView.setFocusableInTouchMode(true); take.setOnClickListener(this); handler = new Handler(); //消息传递handler } @Override public void surfaceCreated(SurfaceHolder holder) { Log.i("MainActivity", "surface Created"); camera = Camera.open(); //连接调用相机 try { camera.setPreviewDisplay(holder); //设置预览 Camera.Parameters parameters = camera.getParameters(); //获取parameters对象 if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) { //当前的方向如果不是横屏 parameters.set("orientation", "portrait"); camera.setDisplayOrientation(90); parameters.setRotation(90); } camera.setParameters(parameters); } catch (IOException e) { camera.release(); e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Log.i("MainActivity", "surface Changed"); camera.startPreview(); //开始捕捉并绘制预览框到屏幕。预览将不会实际开始,直到提供曲面 } /** * @param holder surfaceView结束释放camera */ @Override public void surfaceDestroyed(SurfaceHolder holder) { Log.i("MainActivity", "surface Destroyed"); camera.stopPreview(); camera.release(); } /** * @param data 图像的字节数组 * @param camera 相机对象 * 发生在点击事件之后 */ @Override public void onPictureTaken(byte[] data, Camera camera) { Log.i("MainActivity", "onPictureTaken "); Toast toast; try { Uri imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, //构建存储的uri new ContentValues()); OutputStream imageOS = getContentResolver().openOutputStream(imageUri); //打开存储输出流 imageOS.write(data); //写数据 imageOS.flush(); //刷新缓冲区 imageOS.close(); //关闭输出流 toast = Toast.makeText(this, "saved succeed", Toast.LENGTH_LONG); toast.show(); } catch (FileNotFoundException e1) { toast = Toast.makeText(this, e1.getMessage(), Toast.LENGTH_LONG); toast.show(); } catch (IOException e2) { toast = Toast.makeText(this, e2.getMessage(), Toast.LENGTH_LONG); toast.show(); } camera.startPreview(); } @Override public void onClick(View v) { Log.i("MainActivity", "onClick "); if (!timerTRunning) { timerTRunning = true; handler.post(timerUpdatetask); } } private Runnable timerUpdatetask = new Runnable() { @Override public void run() { if (currentTime > 1) { //currenttime大于1,递减,并一秒钟后调用一次 currentTime--; handler.postDelayed(timerUpdatetask, 1000); //一秒调用一次刷新UI } else { //若不大于一,调用相机 camera.takePicture(null, null, MainActivity.this); //该事件触发后回调onPictureTaken(byte[],Camera) timerTRunning = false; currentTime = 10; //事件完成后跟踪数值置为初始内容 } textView.setText("" + currentTime); } }; }