退出onPreviewFrame并通知用户

时间:2013-02-13 15:30:21

标签: android

我在Android上使用onPreviewFrame(byte[] data, Camera camera)。在onPreviewFrame中我做了一些图像处理。在onPreviewFrame中的某个点我想停止预览(我通过if语句知道点)并播放声音 - 也许是电话铃声。我想你无法在预览中播放声音。

如何退出onPreviewFrame以及在哪里添加播放声音的代码?

它是否在Surface Destroyed上?

这是我的代码:

public class MyCameraPreview extends Activity {    
private Preview mPreview;
     public TextView results;



    @Override
            protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Hide the window title.
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        // Create our Preview view and set it as the content of our activity.
        mPreview = new Preview(this);
        setContentView(mPreview);

   }
}


class Preview extends SurfaceView implements SurfaceHolder.Callback, PreviewCallback {   

    SurfaceHolder mHolder;   
    Camera mCamera;   
    public TextView results;
    public TextView txt;
    private Parameters parameters;   
    //this variable stores the camera preview size    
    private Size previewSize;   
    //this array stores the pixels as hexadecimal pairs    
    private int[] pixels;   
    public int[] argb8888;

    Preview(Context context) {   
        super(context);   
        // Install a SurfaceHolder.Callback so we get notified when the   
        // underlying surface is created and destroyed.   
        mHolder = getHolder();   
        mHolder.addCallback(this);   
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);   
   }   

    public void surfaceCreated(SurfaceHolder holder) {   
        // The Surface has been created, acquire the camera and tell it where   
        // to draw.   
        mCamera = Camera.open();   
        try {   
           mCamera.setPreviewDisplay(holder);   

           //sets the camera callback to be the one defined in this class   
           mCamera.setPreviewCallback(this);

           parameters = mCamera.getParameters();   
           parameters.setZoom(parameters.getMaxZoom());
           mCamera.setParameters(parameters);
           parameters = mCamera.getParameters();
           previewSize = parameters.getPreviewSize();   
           pixels = new int[previewSize.width * previewSize.height]; 


        } catch (IOException exception) {   
            mCamera.release();   
            mCamera = null;   
            // TODO: add more exception handling logic here   
        }   
    }   

    public void surfaceDestroyed(SurfaceHolder holder) {   
        // Surface will be destroyed when we return, so stop the preview.   
        // Because the CameraDevice object is not a shared resource, it's very   
        // important to release it when the activity is paused.   

        mCamera.stopPreview();   
        mCamera.release();   
        mCamera = null;



    }   

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {   
        // Now that the size is known, set up the camera parameters and begin   
        // the preview.   
        parameters.setPreviewSize(w, h);   
        //set the camera's settings   
        mCamera.setParameters(parameters);   
        mCamera.startPreview();


    }   

    @Override  
    public void onPreviewFrame(byte[] data, Camera camera) {   


Do some image processing.


If condition == true {

Exit the preview and then play the ringtone and exit the application.

}   

    }

1 个答案:

答案 0 :(得分:1)

在“预览”中,您可以添加侦听器的定义,并将其用于不在预览中执行声音。

这样的事情:

public static interface OnPreviewListener {
    void onImageMakeSound();
}

public void setListener(OnPreviewListener listener) {
        this.listener = listener;
}

然后在你的onPreviewFrame方法中:

@Override
public void onPreviewFrame(byte[] data, Camera camera) {
    if (countFrame  > 5) { 
        imageBytes = data;
        countFrame = 0;
        if (listener != null)
            listener.onImageMakeSound();
    }
    countFrame++;
    camera.addCallbackBuffer(data);
    return;
}

在您的活动中,必须实施 OnPreviewListener

 @Override
    public void onImageMakeSound() {
        alarmSoundOn();

    }