2012-06-06 4 views
4

저는 사진을 찍어서 휴대폰에 저장하기 위해 안드로이드에있는 카메라 코드 작업 중입니다. 전화 카메라에서 사진을 찍어 메모리 카드에 저장합니다. 유일한 문제는 사진을 찍은 후에 카메라 미리보기가 다시 시작되지 않는다는 것입니다.카메라 미리보기가 다시 시작되지 않습니까?

해결 방법을 찾을 수 없습니다. 코드는 다음과 같습니다. 제안이 필요합니다. . . 내 프로젝트에는 두 개의 클래스가 있습니다. . . 이 같은 onPictureTaken에서 다시

CAMERAACTIVITY의 클래스

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 :

// 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

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

카메라가 캡처 한 이미지를 2 초 동안 표시하고 카메라를 다시 시작합니다.

관련 문제