2013-05-09 3 views
0

Я внедрил свой собственный макет и функциональность предварительного просмотра камеры. Во всяком случае, когда я нажимаю кнопку, чтобы сделать снимок, он вызывает метод onPictureTaken, но Intent не запускается. Intent правильно объявлен в файле манифеста.Android аппаратная камера огонь намерение после onPictureTaken

Вот мой код, и я надеюсь, что кто-то знает, что делать здесь, чтобы уволить мой Intent.

public class TakePicture extends Activity { 
private Preview mPreview; 
private Camera mCamera; 
private int numberOfCameras; 
private int defaultCameraId; 
private Context context; 

AutoFocusCallback myAutoFocusCallback = new AutoFocusCallback() { 
    @Override 
    public void onAutoFocus(boolean arg0, Camera arg1) { 
     // buttonTakePicture.setEnabled(true); 
    } 
}; 

PictureCallback myPictureCallback_JPG = new PictureCallback() { 
    @Override 
    public void onPictureTaken(byte[] arg0, Camera arg1) { 
     //savePicture(arg0); 

     Intent ia = new Intent(context, PreviewPhoto.class); 
     ia.putExtra("groupId", 1); 
     ia.putExtra("image", arg0); 
     startActivity(ia); 
    } 
}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_LEFT_ICON); 
    setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, 
      R.drawable.zzz_logo); 
    context = this; 

    mPreview = new Preview(this); 
    setContentView(mPreview); 
    LayoutInflater controlInflater = LayoutInflater.from(getBaseContext()); 
    View viewControl = controlInflater.inflate(R.layout.camera_control, 
      null); 
    LayoutParams layoutParamsControl = new LayoutParams(
      LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 
    this.addContentView(viewControl, layoutParamsControl); 

    numberOfCameras = Camera.getNumberOfCameras(); 
    CameraInfo cameraInfo = new CameraInfo(); 
    for (int i = 0; i < numberOfCameras; i++) { 
     Camera.getCameraInfo(i, cameraInfo); 
     if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) { 
      defaultCameraId = i; 
     } 
    } 

    Button buttonTakePicture = (Button) findViewById(R.id.takepicture); 
    buttonTakePicture.setOnClickListener(new Button.OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      mCamera.takePicture(null, null, 
        myPictureCallback_JPG); 
     } 
    }); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 

    mCamera = Camera.open(defaultCameraId); 
    mPreview.setCamera(mCamera); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 

    if (mCamera != null) { 
     mPreview.setCamera(null); 
     mCamera.release(); 
     mCamera = null; 
    } 
} 

public void determineDisplayOrientation() { 
     CameraInfo cameraInfo = new CameraInfo(); 
     Camera.getCameraInfo(defaultCameraId, cameraInfo); 

     int rotation = this.getWindowManager().getDefaultDisplay().getRotation(); 
     int degrees = 0; 

     switch (rotation) { 
      case Surface.ROTATION_0: 
       degrees = 0; 
       break; 

      case Surface.ROTATION_90: 
       degrees = 90; 
       break; 

      case Surface.ROTATION_180: 
       degrees = 180; 
       break; 

      case Surface.ROTATION_270: 
       degrees = 270; 
       break; 
     } 

     int displayOrientation; 

     if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
      displayOrientation = (cameraInfo.orientation + degrees) % 360; 
      displayOrientation = (360 - displayOrientation) % 360; 
     } else { 
      displayOrientation = (cameraInfo.orientation - degrees + 360) % 360; 
     } 

     mCamera.setDisplayOrientation(displayOrientation); 
    } 

private void savePicture(byte[] data) { 
    File pictureFileDir = getDir(); 
    if (!pictureFileDir.exists() && !pictureFileDir.mkdirs()) { 
     Toast.makeText(context, "Can't create directory to save image.", 
      Toast.LENGTH_LONG).show(); 
     return; 
    } 

    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyymmddhhmmss"); 
    String date = dateFormat.format(new Date()); 
    String photoFile = "Picture_" + date + ".jpg"; 
    String filename = pictureFileDir.getPath() + File.separator + photoFile; 
    File pictureFile = new File(filename); 

    try { 
     FileOutputStream fos = new FileOutputStream(pictureFile); 
     fos.write(data); 
     fos.close(); 
     Toast.makeText(context, "New Image saved:" + photoFile, 
      Toast.LENGTH_LONG).show(); 
    } catch (Exception error) { 
     Toast.makeText(context, "Image could not be saved.", 
      Toast.LENGTH_LONG).show(); 
    } 
} 

private File getDir() { 
    File sdDir = Environment 
     .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
    return new File(sdDir, "Captoom"); 
    } 

class Preview extends ViewGroup implements SurfaceHolder.Callback { 
    private final String TAG = "Preview"; 

    SurfaceView mSurfaceView; 
    SurfaceHolder mHolder; 
    Size mPreviewSize; 
    List<Size> mSupportedPreviewSizes; 
    Camera mCamera; 

    Preview(Context context) { 
     super(context); 
     mSurfaceView = new SurfaceView(context); 
     addView(mSurfaceView); 

     mHolder = mSurfaceView.getHolder(); 
     mHolder.addCallback(this); 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     mSurfaceView.setOnClickListener(new LinearLayout.OnClickListener() { 
      @Override 
      public void onClick(View arg0) { 
       //buttonTakePicture.setEnabled(false); 
       mCamera.autoFocus(myAutoFocusCallback); 
      } 
     }); 
    } 

    public void setCamera(Camera camera) { 
     mCamera = camera; 
     if (mCamera != null) { 
      mSupportedPreviewSizes = mCamera.getParameters() 
        .getSupportedPreviewSizes(); 
      requestLayout(); 
     } 
    } 

    public void switchCamera(Camera camera) { 
     setCamera(camera); 
     //determineDisplayOrientation(); 

     try { 
      camera.setPreviewDisplay(mHolder); 
     } catch (IOException exception) { 
      Log.e(TAG, "IOException caused by setPreviewDisplay()", exception); 
     } 

     Camera.Parameters parameters = camera.getParameters(); 
     parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 
     requestLayout(); 
     camera.setParameters(parameters); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     final int width = resolveSize(getSuggestedMinimumWidth(), 
       widthMeasureSpec); 
     final int height = resolveSize(getSuggestedMinimumHeight(), 
       heightMeasureSpec); 
     setMeasuredDimension(width, height); 

     if (mSupportedPreviewSizes != null) { 
      mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, 
        height); 
     } 
    } 

    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     if (changed && getChildCount() > 0) { 
      final View child = getChildAt(0); 

      final int width = r - l; 
      final int height = b - t; 

      int previewWidth = width; 
      int previewHeight = height; 
      if (mPreviewSize != null) { 
       previewWidth = mPreviewSize.width; 
       previewHeight = mPreviewSize.height; 
      } 

      if (width * previewHeight > height * previewWidth) { 
       final int scaledChildWidth = previewWidth * height 
         /previewHeight; 
       child.layout((width - scaledChildWidth)/2, 0, 
         (width + scaledChildWidth)/2, height); 
      } else { 
       final int scaledChildHeight = previewHeight * width 
         /previewWidth; 
       child.layout(0, (height - scaledChildHeight)/2, width, 
         (height + scaledChildHeight)/2); 
      } 
     } 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     try { 
      if (mCamera != null) { 
       mCamera.setPreviewDisplay(holder); 
      } 
     } catch (IOException exception) { 
      Log.e(TAG, "IOException caused by setPreviewDisplay()", exception); 
     } 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     if (mCamera != null) { 
      mCamera.stopPreview(); 
     } 
    } 

    private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) { 
     final double ASPECT_TOLERANCE = 0.1; 
     double targetRatio = (double) w/h; 
     if (sizes == null) 
      return null; 

     Size optimalSize = null; 
     double minDiff = Double.MAX_VALUE; 

     int targetHeight = h; 

     for (Size size : sizes) { 
      double ratio = (double) size.width/size.height; 
      if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) 
       continue; 
      if (Math.abs(size.height - targetHeight) < minDiff) { 
       optimalSize = size; 
       minDiff = Math.abs(size.height - targetHeight); 
      } 
     } 

     if (optimalSize == null) { 
      minDiff = Double.MAX_VALUE; 
      for (Size size : sizes) { 
       if (Math.abs(size.height - targetHeight) < minDiff) { 
        optimalSize = size; 
        minDiff = Math.abs(size.height - targetHeight); 
       } 
      } 
     } 
     return optimalSize; 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     Camera.Parameters parameters = mCamera.getParameters(); 
     parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 
     requestLayout(); 

     mCamera.setParameters(parameters); 
     mCamera.startPreview(); 
    } 
} 
} 
+0

1. Положите несколько операторов журнала на 100% уверен, что вызывается 'onPictureTaken'. 2. Попробуйте «Intent ia = new Intent (TakePicture.this, PreviewPhoto.class),' –

+0

onPictureTaken называется причиной, я проверил это. Новый режим создания Intent ничего не решает. – dorin

+0

Если вызывается 'onPictureTaken', вы увидите либо' onCreate' 'PreviewPhoto', либо' Exception'. Добавьте оператор журнала в 'onCreate' и проверьте журналы и сообщите нам, что вы видите. –

ответ

2

Линия ia.putExtra ("image", arg0) вызывает потерю связи с ошибкой. Я должен передать путь изображения, а не байт [] данных к новому намерению :)

+0

Вы можете сохранить данные в глобальные, если вы хотите избежать дополнительной записи на диск. Как я сделал здесь: http://stackoverflow.com/a/43459956/649379 – SoftDesigner

Смежные вопросы