2017-02-13 5 views
0

Ich entwickelte eine Aktivität auf Android-System und ich habe ein Problem zur Laufzeit: Wenn die Aktivität starten, erhalte ich auf Protokoll "D/Kamera: App übergeben NULL Oberfläche" und auf der Oberfläche nicht angezeigt wird Bilder der Kamera. Ich habe in den Code eine Überprüfung der 'isValid'-Funktion des SurfaceHolder-Objekts eingefügt und die Funktion gibt false zurück.Android Oberfläche ist nicht gültig

Dies ist der Code der Aktivität.

package marl.com.mbpspay; 

import android.hardware.Camera; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class CameraActivity extends AppCompatActivity implements SurfaceHolder.Callback { 

    Camera camera; 
    SurfaceView surfaceView; 
    SurfaceHolder surfaceHolder; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_camera); 

     surfaceView = (SurfaceView)findViewById(R.id.surfaceView); 
     surfaceHolder = surfaceView.getHolder(); 
     surfaceHolder.addCallback(this); 
     surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     try{ 
      camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK); 
     }catch(RuntimeException e){ 
      Log.e("CameraActivity", "init_camera: " + e); 
      return; 
     } 

     if(surfaceHolder.getSurface().isValid()) { 
      Log.i("PreviewCallback", "Camera open [" + surfaceHolder + "]"); 
     } 
     Camera.Parameters param; 
     param = camera.getParameters(); 
     //modify parameter 
     param.setPreviewFrameRate(20); 
     param.setPreviewSize(176, 144); 
     camera.setParameters(param); 

     Camera.PreviewCallback previewCallback = new Camera.PreviewCallback() { 
      @Override 
      public void onPreviewFrame(byte[] data, Camera camera) { 
       Log.i("PreviewCallback","image get"); 
      } 
     }; 

     try { 
      Log.i("PreviewCallback","STEP 0 ["+surfaceHolder.getSurface()+"]"); 
      camera.setPreviewDisplay(surfaceHolder); 
      Log.i("PreviewCallback","STEP 1 ["+surfaceHolder+"]"); 
      camera.setPreviewCallback(previewCallback); 
      Log.i("PreviewCallback","STEP 2 ["+surfaceHolder+"]"); 
      camera.startPreview(); 
      //camera.takePicture(shutter, raw, jpeg) 
     } catch (Exception e) { 
      Log.e("CameraActivity", "init_camera: " + e); 
      return; 
     } 
    } 

    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { 
     // TODO Auto-generated method stub 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
    } 

} 

Hier das XML des Layouts.

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_camera" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="marl.com.mbpspay.CameraActivity"> 

    <SurfaceView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_centerVertical="true" 
     android:layout_centerHorizontal="true" 
     android:id="@+id/surfaceView" /> 
</RelativeLayout> 

Kann jemand eine Lösung für dieses Problem finden?

Antwort

0

Sieht so aus, als ob Sie die Surface verwenden, egal ob "isValid" oder nicht, indem Sie startPreview() vorsorglich aufrufen. Da Sie in Ihrer onCreate() Methode sind, wurde die Oberfläche wahrscheinlich noch nicht erstellt. Sie sollten auf surfaceCreated() Rückruf der warten, bevor Sie versuchen, Ihre Camera Vorschau zu starten.

Verwandte Themen