2016-04-21 5 views
0

Entschuldigung für mein Englisch. Ich habe activity1 und activity2. In activity1 Ich habe Knopf, wenn ich diesen Knopf annehme, friert dieser Knopf für einige Sekunden ein und nach diesem öffnen activity2. Um ein Einfrieren zu entfernen, wenn Sie auf die Schaltfläche klicken in activity1 Ich habe Code hinzugefügt, der die Kamera in neuen runOnUiThread startet, aber jetzt nicht surfaceCreated genannt.Nicht aufgerufen SurfaceCreated, wenn Kameraobjekt in Oberfläche in neuen runOnUiThread

mPreview - meine Gewohnheit Surface

mCamera - Objekt Kamera

Mein Code:

new Thread(new Runnable() { 
    @Override 
    public void run() { 
     CameraActivity.this.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       mPreview.addCamera(mCamera); 
       mPreview.addParent(CameraActivity.this); 
       mCamera.getParameters().setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); 
       mPreview.refreshDrawableState(); 
       mCamera.startPreview(); 
      } 
     }); 
    } 
}).start(); 

Mein costom SurfaceView (i hinzufügen nur wichtig Code)

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 
    public CameraPreview (Context context){ 
     super(context); 
    } 
    public CameraPreview(Context context, AttributeSet attrs){ 
     super(context, attrs); 
    } 
    public CameraPreview(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public void addCamera(Camera camera){ 
      mCamera = camera; 
      mHolder = getHolder(); 
      mHolder.addCallback(this); 
      mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     try { 

      mCamera.setPreviewDisplay(holder); 
      mCamera.startPreview(); 

     } catch (IOException e) { 
     } 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     try { 
      if(mCamera!=null){ 
       mCamera.stopPreview(); 
       mCamera.setPreviewCallback(null); 

       mCamera.release(); 
       mCamera = null; 
      } 
     } catch (Exception e){ 
       Toast.makeText(this.getContext(), e.getMessage(), Toast.LENGTH_LONG).show(); 
     } 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    //code 
    mCamera.startPreview(); 
    } 
} 

Antwort

0

Das ist das erwartete Verhalten ist, wird die Surface vom SurfaceView gehalten, wie dieses Problem zu umgehen Sie, wenn die Oberfläche gültig ist und nicht-0 dimentions überprüfen könnten, und rufen Sie Ihre surfaceCreated/surfaceChanged Funktionen manuell

der Code, den Sie benötigen:

Surface surface = mHolder.getSurface(); 
if(surface != null && surface.isValid()){ 
    Rect frame = mHolder.getSurfaceFrame(); 
    if(frame.width() > 0 && frame.height() > 0){ 
     surfaceCreated(mHolder); 
     surfaceChaged(mHolder, PixelFormat.OPAQUE, frame.width(), frame.height()); //pixel format OPAQUE is the default one 
    } 
}