2012-05-07 19 views
10

Sto provando a creare una vista di superficie per una fotocamera in modo da renderla sulla superficie ogni volta che si trova nella vista della fotocamera. Al momento tutto quello che posso vedere sulla mia vista della fotocamera è una schermata nera. Ho provato a cercare su Google e qui ma finora non ho trovato quello che sto cercando. Chiunque può suggerirmi qualche idea.Vista superficie fotocamera Android

risposta

18

Ho scritto una lezione questo può aiutarti

public class Preview_can_work extends Activity { 
     private SurfaceView surface_view; 
     private Camera mCamera; 
     SurfaceHolder.Callback sh_ob = null; 
     SurfaceHolder surface_holder  = null; 
     SurfaceHolder.Callback sh_callback = null; 

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

      getWindow().setFormat(PixelFormat.TRANSLUCENT); 

      surface_view = new SurfaceView(getApplicationContext()); 
      addContentView(surface_view, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 

      if (surface_holder == null) { 
       surface_holder = surface_view.getHolder(); 
      } 

      sh_callback = my_callback(); 
      surface_holder.addCallback(sh_callback); 
     } 

      SurfaceHolder.Callback my_callback() {  
       SurfaceHolder.Callback ob1 = new SurfaceHolder.Callback() { 

        @Override 
        public void surfaceDestroyed(SurfaceHolder holder) { 
          mCamera.stopPreview(); 
          mCamera.release(); 
          mCamera = null; 
        } 

        @Override 
        public void surfaceCreated(SurfaceHolder holder) { 
         mCamera = Camera.open(); 

          try { 
           mCamera.setPreviewDisplay(holder); 
          } catch (IOException exception) { 
           mCamera.release(); 
           mCamera = null; 
          } 
        } 

        @Override 
        public void surfaceChanged(SurfaceHolder holder, int format, int width, 
          int height) { 
         mCamera.startPreview(); 
        } 
       }; 
       return ob1; 
     } 
    } 

nella vostra copia file manifesto di questo codice per il permesso fotocamera

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

Spiegazione:

SurfaceView è un tipo di vista che contiene un SurfaceHolder. SurfaceHolder contiene la superficie su cui possiamo visualizzare i nostri media (in genere frame).

m La telecamera è un oggetto Camera che contiene l'istanza della telecamera.

Quando si desidera mantenere l'istanza Camera predefinita, è sufficiente chiamare Camera.open();

Camera mCamera = Camera.open();

Ora è stata aperta la telecamera o si dispone di un'istanza della telecamera predefinita. Ora è necessario acquisire i fotogrammi dalla fotocamera e visualizzarli su una superficie. Ma non è possibile visualizzarlo senza alcun

superficie. Qui surfaceView fornisce surfaceHolder e surfaceHolder fornisce una superficie per visualizzare i fotogrammi delle telecamere. Ora, quando verranno create le superfici, saranno richiamate tre funzioni di callback

chiamato.

1. public void surfaceCreated(SurfaceHolder holder) 
2. public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
3. public void surfaceDestroyed(SurfaceHolder holder) 

Nota: - Surface sarà distrutto quando l'applicazione andrà in pausa.

surfaceCreated: surfaceCreated è una funzione di callback che verrà chiamata quando verrà creata la superficie. In questo, puoi aprire la tua fotocamera e impostare altri attributi.

surfaceChanged: Questo sarà chiamato atleast una volta quando verrà creata la superficie. Dopodiché verrà chiamato ogni volta che la superficie cambierà (nella rotazione del dispositivo). Qui è possibile

avviare l'anteprima perché la superficie è già stata creata.

surfaceDestroyed: Questo sarà chiamato ogni volta che la superficie distruggerà.Ora, se non si dispone di una superficie, è possibile visualizzare i fotogrammi della telecamera, quindi ho rilasciato la fotocamera utilizzando

mCamera.release(). Questo è molto importante perché se la tua attività sarà in pausa e qualsiasi altra attività tenta di aprire la fotocamera, non sarà in grado di aprirla dato che hai già aperto la fotocamera

. La fotocamera è una risorsa condivisa quindi è possibile utilizzarla solo una volta. Quindi ricorda una cosa ogni volta che apri una videocamera e poi la rilasci sempre.

stopPreview: Quando si avvia l'anteprima, la fotocamera inizia a catturare i fotogrammi e visualizzarli su una superficie. Ora se la superficie è stata distrutta, è necessario interrompere l'acquisizione dei fotogrammi

dalla fotocamera, quindi è necessario chiamare mCamera.stopPreview.

+0

Grazie Bharat, mi proverò a fare un tentativo! grazie ancora. Qualcuno conosce un buon articolo in cui posso leggere "La videocamera non funziona quando si esegue l'emulatore"? È vero ancora? – Kitaro

+0

ya effettivamente durante la creazione di emulatore è necessario aggiungere la fotocamera in esso quindi penso che funzionerà. cercherò di farti sapere .. –

+0

Ok, quindi non abbiamo bisogno di un dispositivo per utilizzare la fotocamera per vedere dal vivo? Per alcuni dell'articolo che ho letto diciamo che non è possibile eseguire la fotocamera in emulatore, ma non sono sicuro che sia stato risolto. Per favore mi faccia sapere. Grazie. – Kitaro

0

Fai shure si è aggiunto il permesso:

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

anche queste proprietà della finestra:

getWindow().setFormat(PixelFormat.TRANSLUCENT); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

postale del codice, se questo non funziona, al fine di aiutare a

+0

Grazie, ho già aggiunto il permesso come suggerito; e stavo pensando di usare 'surfaceChanged'? Al momento tutto quello che posso vedere sulla mia superficie perview è nero ..... non capisco perché. – Kitaro

Problemi correlati