7

Also arbeite ich an einem Kamera-Projekt, und ich habe es auf vielen Geräten getestet und alle von ihnen bestanden die Tests mit Ausnahme des Nexus 10.Nexus 10, Front-Kamera Vorschau ist schwarz (keine Vorschau)

Ich kann nicht wirklich herausfinden, was vor sich geht, und niemand spricht über das Problem online.

Ich konnte das Problem auf zwei verschiedenen Nexus 10 (Wifi) Geräten replizieren.

Hier ist der Code meiner Aktivität:

public class MainActivity extends Activity { 
    private static Camera mCamera; 
    private static boolean mCameraOpen; 
    private static ImageView mPreviewImageView; 
    private SurfaceView mPreviewSurfaceView; 
    private static boolean mPreviewRunning; 
    private static Handler mHandler; 
    private static int TESTS_COUNT = 0; 
    private Camera.Parameters mCameraParameters; 

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

     mHandler = new Handler(); 
     mPreviewSurfaceView = (SurfaceView) findViewById(R.id.surfaceview); 
     mPreviewImageView = (ImageView) findViewById(R.id.imageview); 
     mPreviewSurfaceView.getHolder().addCallback(mCallback); 

     TextView view = (TextView) findViewById(R.id.textview); 
     view.setText("Format: " + String.valueOf(TESTS_COUNT)); 

    } 

    @Override 
    public void onResume(){ 
     super.onResume(); 
     if (mCamera == null){ 
      for (int i = 0; i < Camera.getNumberOfCameras(); i++){ 
       Camera.CameraInfo info = new Camera.CameraInfo(); 
       Camera.getCameraInfo(i, info); 

       if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT){ 
        mCamera = Camera.open(i); 
        Camera.Parameters params = mCamera.getParameters(); 
        params.set("camera-id", 2); 
        List<Integer> formats = params.getSupportedPreviewFormats(); 
        if (formats.size() > TESTS_COUNT) { 
         Log.e("Camera", "testing preview format at index: " + TESTS_COUNT); 
         params.setPreviewFormat(formats.get(TESTS_COUNT)); 
         mCamera.setParameters(params); 
         mCameraOpen = true; 
         SurfaceHolder holder = mPreviewSurfaceView.getHolder(); 
         if (holder != null && holder.getSurface() != null && holder.getSurface().isValid()) { 
          mCallback.surfaceCreated(holder); 
         } 
         mCameraParameters = params; 
         break; 
        } else { 
         finish(); 
        } 
       } 

      } 
     } 
    } 

    @Override 
    public void onPause(){ 
     super.onPause(); 
     if (mPreviewRunning){ 
      mCamera.stopPreview(); 
      mCamera.setPreviewCallback(null); 
      mPreviewRunning = false; 
     } 

     if (mCameraOpen){ 
      mCamera.release(); 
      mCamera = null; 
      mCameraOpen = false; 
     } 
    } 

    @Override 
    public void onDestroy(){ 
     super.onDestroy(); 

    } 

    private final SurfaceHolder.Callback mCallback = new SurfaceHolder.Callback() { 
     @Override 
     public void surfaceCreated(SurfaceHolder surfaceHolder) { 
       if (mCameraOpen && mCamera != null){ 
        try { 
         mCamera.setPreviewDisplay(surfaceHolder); 
         mCamera.setPreviewCallback(new Camera.PreviewCallback() { 
          private int count; 
          private int total; 
          @Override 
          public void onPreviewFrame(byte[] bytes, Camera camera) { 
           if (count == 15){ 
            Camera.Size previewSize = mCamera.getParameters().getPreviewSize(); 
            // pWidth and pHeight define the size of the preview Frame 
            ByteArrayOutputStream out = new ByteArrayOutputStream(); 

            // Alter the second parameter of this to the actual format you are receiving 
            YuvImage yuv = new YuvImage(bytes, ImageFormat.NV21, previewSize.width, previewSize.height, null); 

            // bWidth and bHeight define the size of the bitmap you wish the fill with the preview image 
            yuv.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height), 50, out); 
            byte[] bitmapBytes = out.toByteArray(); 
            final Bitmap bitmap= BitmapFactory.decodeByteArray(bitmapBytes, 0, bitmapBytes.length); 
            mHandler.post(new Runnable() { 
             @Override 
             public void run() { 
              mPreviewImageView.setImageBitmap(bitmap); 
             } 
            }); 
            count = 0; 
            total++; 
            if (total > 5){ 
             TESTS_COUNT++; 
             if (TESTS_COUNT == mCameraParameters.getSupportedPreviewSizes().size()) { 
              finish(); 
              return; 
             } 
             Intent intent = new Intent(MainActivity.this, MainActivity.class); 
             startActivity(intent); 

            } 

           } else { 
            count++; 
           } 

          } 
         }); 

        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
     } 

     @Override 
     public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) { 
      for (Camera.Size size : mCameraParameters.getSupportedPreviewSizes()){ 
       if (size.width == width && size.height == height){ 
        if (mCameraOpen && mCamera != null && mPreviewRunning == false) { 
         mCameraParameters.setPreviewSize(width, height); 
         mCamera.setParameters(mCameraParameters); 

         mCamera.startPreview(); 

         mPreviewRunning = true; 
         break; 
        } 
       } 
      } 
      if (mPreviewRunning == false){ 
       Log.e("CameraPreview", "size not supported"); 
      } 

     } 

     @Override 
     public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 

     } 
    }; 

} 

Mein Layout:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
    android:layout_height="match_parent" tools:context=".MainActivity" 
    android:orientation="vertical" 
    android:weightSum="2"> 
    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Hello"/> 
<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" tools:context=".MainActivity" 
    android:orientation="horizontal" 
    android:layout_weight="1" 
    android:weightSum="2"> 
     <SurfaceView 
      android:layout_width="640px" 
      android:layout_height="480px" 
      android:id="@+id/surfaceview"/> 
     <ImageView 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:id="@+id/imageview"/> 
     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/textview" 
      android:textSize="40sp"/> 
</LinearLayout> 
</LinearLayout> 

und manifestieren:

<uses-permission android:name="android.permission.CAMERA" /> 
<uses-feature android:name="android.hardware.camera" /> 
<uses-feature android:name="android.hardware.camera.autofocus" /> 

Es gibt keine Fehlermeldungen und der Bildschirm ist nur schwarz

Screenshot

Antwort

1

Überprüfen Sie Ihr Gerät mit einer App namens CtsVerifier. Diese App ist im Android Open Source-Projekt enthalten und Teil der Kompatibilitätstest-Suite für Android-Geräte (CTS). CTS Verifier hat eine Reihe von Tests, die die Kamera überprüfen. check this link

Sie können sicher sein, dass wenn die Frontkamera in dieser App nicht funktioniert. Dann ist Ihr Gerät wahrscheinlich beschädigt oder auf der Hal-Ebene ist etwas beschädigt. Wenn dies der Fall ist, können Sie versuchen, Ihr Android-Betriebssystem downgrade/upgraden. Wenn nicht, ist es wahrscheinlich Hardware-Schaden.

6

Die zugrunde liegende Frage ist, "Wie Debuggen dies?" Die Antwort ist, wie immer, so viele Hypothesen wie möglich zu finden, die diese Ergebnisse erklären könnten, und dann diese Hypothesen zu testen.

Hier sind einige Hypothesen (noch mehr denken):

  • Es ist keine Kameras zu finden.
  • Es findet keine Frontkamera.
  • Es ist falsch die Kameraparameter zu interpretieren.
  • Es ist mCallback zu spät eingerichtet, das heißt, nach Bedarf.
  • Es wird keine gültige Oberfläche gefunden.
  • Die Registrierung für Kamerabilder ist nicht erfolgreich.
  • Es registriert, empfängt aber keine Kamerabilder.
  • Es empfängt Kamera-Frames, zeigt sie jedoch nicht an, z. die Bilder sind nicht im erwarteten Format oder die setImageBitmap(bitmap) Runnable wird nicht ausgeführt.
  • TESTS_COUNT macht nicht das, was Sie tun wollen.

Sie können Hypothesen über die Protokollierung testen, aber für viel davon würde es schneller und informativer zu Einzelschritt es im Debugger und Datenwerte wie params untersuchen.

Wenn Sie nicht mit dem Debugger vertraut sind, ist jetzt die Zeit!

+1

Protokollierung ist eine gute Möglichkeit, Hypothesen zu testen, solange Sie einige zu testen haben. Ich hoffe, dass Sie nicht nach jemandem suchen, um dieses Gerät zu kaufen und Ihren Code für Sie zu debuggen. Wir sind hier, um zu unterrichten und Licht zu geben. – Jerry101

+0

Sie könnten damit recht haben. Die Frage erwähnt weder diese Bedenken noch den fehlenden Zugang zu den Geräten. Weißt du, ob diese beiden Geräte über funktionierende Frontkameras verfügen, wie sie aktuell konfiguriert sind? – Jerry101

+0

Bitte überprüfen Sie Ihr Gerät mit einer App namens CtsVerifier, diese App ist im Android Open Source-Projekt enthalten und ist Teil der Kompatibilitätstest-Suite für Android-Geräte (CTS). CTS Verifier haben eine Reihe von Tests, die die Kamera überprüfen. (Überprüfen Sie https://source.android.com/compatibility/cts/verifier.html) Sie können sicher sein, dass, wenn die Frontkamera nicht in dieser App funktioniert. Dann ist Ihr Gerät wahrscheinlich beschädigt, oder auf der Hal-Schicht sind einige Beschädigungen aufgetreten. Wenn dies der Fall ist, können Sie versuchen, Ihr Android-Betriebssystem downgrade/upgraden. Wenn nicht, ist es wahrscheinlich Hardware-Schaden. – Jorch914

0

Ich teste die Aktivität auf einem Nexus 10 mit Lollipop 5.1. Ich merke manchmal, wenn ich den Bildschirm rotiere, stürzt die Anwendung ab. Ich dieses Problem beheben, den Anfang des Verfahrens zu modifizieren surfaceChanged mit:

@Override 
public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) 
{ 
    if (mCameraParameters==null) return; 
    ... 
} 

Außerdem, wenn Sie über die Verwendung von Kamera-Hardware auf Android ein funktionierendes Beispiel studieren wollen, können Sie das Projekt android_instacam und seinen Quellcode konsultieren.

+0

Der Code stürzt nicht nach dem Fix, wenn ich den Bildschirm rotiere und wenn ich den Bildschirm pausiere. Istacam arbeitet an Nexus 10, mit beiden Kameras. Es hat nur ein Problem mit dem Seitenverhältnis. – xcesco

+0

Ihr Code mit meiner Korrektur funktioniert (Anzeige der Kameravorschau) auf Nexus10. – xcesco

+0

Sorry ich teste es nochmal. Nach einigen Sekunden hört die Vorbetrachtungskamera auf zu arbeiten. Ich schlage vor, dass Sie mit dem Quellcode von istacam beginnen. – xcesco