Android 无预览拍照

最近得到了一个需求,在后台拍照并保存

public void onTakePhotoClicked() {
      final SurfaceView preview = new SurfaceView(this);
      SurfaceHolder holder = preview.getHolder();
      // deprecated setting, but required on Android versions prior to 3.0
  
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 holder.addCallback(new SurfaceHolder.Callback() {
          @Override
          //The preview must happen at or after this point or takePicture fails
          public void surfaceCreated(SurfaceHolder holder) {
              Log.d(TAG, "Surface created");
               camera = null;
              try {
                  camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
                  Log.d(TAG, "Opened camera");

                  try {
                      camera.setPreviewDisplay(holder);
                  } catch (IOException e) {
                      throw new RuntimeException(e);
                  }

                  camera.startPreview();
                  Log.d(TAG, "Started preview");
            //延时拍照
                  ThreadUtils.postOnUiThreadDelayed(new Runnable() {
                      @Override
                      public void run() {
                          Log.e("zgj","开始拍照");
                          camera.takePicture(null, null, CameraService.this);
                      }
                  },5000);

              } catch (Exception e) {
                  if (camera != null)
                      camera.release();
                  throw new RuntimeException(e);
              }
          }

          @Override
          public void surfaceDestroyed(SurfaceHolder holder) {}
          @Override
          public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
      });

      WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
      WindowManager.LayoutParams params = new WindowManager.LayoutParams(
              1, 1, //Must be at least 1x1
              WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
              0,
              //Don't know if this is a safe default
              PixelFormat.UNKNOWN);

      //Don't set the preview visibility to GONE or INVISIBLE
      wm.addView(preview, params);
  }

  @Override
  public void onPictureTaken(byte[] bytes, Camera camera) {
      Log.e("zgj", "拍照结束");
      File pictureDir = Environment.getExternalStorageDirectory();
      if (pictureDir == null) {
          Log.d("zgj",
                  "Error creating media file, check storage permissions!");
          return;
      }

      try {
          String pictureName = "ssss.png";
          File file = new File(pictureDir + "/pic/");
          if (!file.exists()) {
              file.mkdir();
          }
          file = new File(pictureDir + "/pic/" + pictureName);
          FileOutputStream fos = new FileOutputStream(file);
          fos.write(bytes);
          fos.close();
      } catch (FileNotFoundException e) {
          Log.d("zgj", "File not found: " + e.getMessage());
      } catch (IOException e) {
          Log.d("zgj", "Error accessing file: " + e.getMessage());
      }
  }

你可能感兴趣的:(Android 无预览拍照)