2012-06-06 2 views
4

Я работаю над кодом камеры в android, чтобы сделать снимок и сохранить его на телефоне. Он снимает изображение с камеры телефона и сохраняет его на карте памяти. Единственная проблема заключается в том, что предварительный просмотр камеры не возобновляется после съемки.Предварительный просмотр камеры не перезапускается?

Я не могу найти решение. Код выглядит следующим образом. Предложения необходимы. , , В моем проекте есть два класса. , ,

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 снова в 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

добавить Thread.Sleep (2000); camera.startPreview();

, чтобы камера показывала захваченное изображение в течение 2 секунд и перезапускала камеру.

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