2012-06-06 56 views
4

我正在使用android中的相机代码拍照并将其保存在手机中。它从手机相机拍摄照片并将其保存在存储卡上。唯一的问题是照相机预览在拍摄照片后不重新启动。相机预览不重新启动?

我找不出解决方案。代码如下。建议是必要的。 。 。 我的项目中有两个类。 。 。

CAMERAACTIVITY CLASS

public class CameraActivity extends Activity 
{ 

    private static final String TAG = "CameraDemo"; 
    Preview preview; 
    Button buttonClick; 

    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    preview = new Preview(this); 
    ((FrameLayout) findViewById(R.id.preview)).addView(preview); 

    buttonClick = (Button) findViewById(R.id.buttonClick); 
    buttonClick.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
     preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback);  
     } 
    }); 

    Log.d(TAG, "onCreate'd"); 
    } 

    // Called when shutter is opened 
    ShutterCallback shutterCallback = new ShutterCallback() { 
    public void onShutter() { 
     Log.d(TAG, "onShutter'd"); 
    } 
    }; 

    // Handles data for raw picture 
    PictureCallback rawCallback = new PictureCallback() { 
    public void onPictureTaken(byte[] data, Camera camera) { 
     Log.d(TAG, "onPictureTaken - raw"); 
    } 
    }; 

    // Handles data for jpeg picture 
    PictureCallback jpegCallback = new PictureCallback() { 
    public void onPictureTaken(byte[] data, Camera camera) { 
     FileOutputStream outStream = null; 
     try { 
     // Write to SD Card 
     outStream = new FileOutputStream(String.format("/sdcard/DCIM/queries.jpg", 
      System.currentTimeMillis())); 
     outStream.write(data); 
     outStream.close(); 
     Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length); 
     } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } finally { 
     } 
     Log.d(TAG, "onPictureTaken - jpeg"); 

    } 
    }; 

} 

预览类

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

    SurfaceHolder mHolder; // <2> 
    public Camera camera; // <3> 

    Preview(Context context) { 
    super(context); 

    // Install a SurfaceHolder.Callback so we get notified when the 
    // underlying surface is created and destroyed. 
    mHolder = getHolder(); // <4> 
    mHolder.addCallback(this); // <5> 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // <6> 

    } 

    // Called once the holder is ready 
    public void surfaceCreated(SurfaceHolder holder) { // <7> 
    // The Surface has been created, acquire the camera and tell it where 
    // to draw. 
    camera = Camera.open(); // <8> 
    try { 


     Camera.Parameters parameters = camera.getParameters(); 
     parameters.set("orientation", "landscape"); 
     camera.setParameters(parameters); 
     camera.setPreviewDisplay(holder); 

     camera.setPreviewCallback(new PreviewCallback() { 
     // Called for each frame previewed 
     public void onPreviewFrame(byte[] data, Camera camera) { 
      Log.d(TAG, "onPreviewFrame called at: " + System.currentTimeMillis()); 
      Preview.this.invalidate(); 
     } 
     }); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    } 

    // Called when the holder is destroyed 
    public void surfaceDestroyed(SurfaceHolder holder) { 
    //Log.d(TAG,"Stopping preview in SurfaceDestroyed()."); 
    camera.setPreviewCallback(null); 
    camera.stopPreview(); 
    camera.release(); 
    camera = null;   
    } 

    // Called when holder has changed 
    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    camera.startPreview(); 
    } 

} 

回答

12

The article about Camera from Android API Guide也遭受同样的问题。通过增加两个更多的东西像下面的拍照回来后,我能得到预览:

1)添加外部存储权限在AndroidManifest.xml文件:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

2)通过调用camera.startPreview()再次启动预览。在您的代码中:

... 
Log.d(TAG, "onPictureTaken - jpeg"); 
camera.startPreview(); 
.... 

我相信你能够让你的工作方式相同。

+3

camera.startPreview(); //这一行解决了我的问题 – ax003d

2

启动CAMERAACTIVITY再次onPictureTaken这样的:

// Handles data for jpeg picture 
    PictureCallback jpegCallback = new PictureCallback() { 
    public void onPictureTaken(byte[] data, Camera camera) { 
     FileOutputStream outStream = null; 
     try { 
     // Write to SD Card 
     outStream = new FileOutputStream(String.format("/sdcard/DCIM/queries.jpg", 
      System.currentTimeMillis())); 
     outStream.write(data); 
     outStream.close(); 
     Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length); 
     } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } finally { 
     camera.release(); 
     camera = null; 
     startActivity(new Intent(CAMERAACTIVITY.this, CAMERAACTIVITY.class)); 
     finish(); 
     } 
     Log.d(TAG, "onPictureTaken - jpeg"); 

    } 
    }; 

如果你愿意,你也可以ü se Thread.sleep(2000);这样拍摄的图像将显示2秒钟,然后再次开始相机活动。

0

add Thread.Sleep(2000); camera.startPreview();

以便相机将显示拍摄的图像2秒钟并重新启动相机。