7

カメラ関連のプロジェクトで作業しています。多くの端末でテストしており、Nexus 10以外のすべてのテストに合格しています。Nexus 10、正面カメラプレビューは黒(プレビューなし)

私は実際に何が起こっているのか把握することはできません。その問題についてオンラインで話す人はいません。

2つの異なるNexus 10(Wi-Fi)デバイスで問題を再現できました。ここで

は私の活動のコードです:

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) { 

     } 
    }; 

} 

マイレイアウト:

<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> 

とマニフェスト:

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

エラーメッセージと画面はありません

ちょうど黒です

Screenshot

答えて

1

CtsVerifierというアプリを使用してデバイスを確認してください。このアプリはAndroidオープンソースプロジェクトに含まれており、アンドロイドデバイス(CTS)の互換性テストスイートの一部です。 CTSベリファイアには、カメラをチェックする一連のテストがあります。 check this link

このアプリでフロントカメラが動作しない場合は、必ず確認してください。その後、デバイスが破損しているか、またはレイヤーに何らかの破損が発生している可能性があります。その場合は、あなたのアンドロイドOSをダウングレード/アップグレードすることができます。そうでなければ、おそらくハードウェアの損傷です。

6

根本的な質問は、「これをデバッグする方法」です。答えは、いつものように、これらの結果を説明できるようにできるだけ多くの仮説を考え、その仮説をテストすることです。これは、任意のカメラを見つけていない

  • は、ここで(複数からだと思います)いくつかの仮説です。

  • 正面カメラは見つかりません。
  • カメラのパラメータを誤解しています。
  • 設定が遅すぎる、つまり必要な後にmCallbackです。
  • 有効なサーフェスが見つかりません。
  • カメラフレームの登録に成功していません。
  • 登録中ですが、カメラフレームを受信して​​いません。
  • カメラのフレームを受信して​​いますが、表示に失敗しています。画像が予期した形式でないか、またはsetImageBitmap(bitmap) Runnableが実行されていません。
  • TESTS_COUNTは、あなたがしたいことをしていません。

あなたはログを経由しての仮説をテストすることができますが、これの多くにとっては、デバッガでそれを介してシングルステップへより迅速かつ有益で、そのようなparamsなどのデータ値を調べると思います。

デバッガに慣れていない場合は、今すぐにしてください!

+1

ロギングは、いくつかのテストをしている限り、仮説をテストするうまい方法です。このデバイスを購入してコードをデバッグするユーザーを探していないことを願っています。私たちはここで教え、光を放つために来ました。 – Jerry101

+0

あなたはそれについて正しいかもしれません。この質問には、デバイスのアクセスに関する懸念や不足については言及されていませんでした。これらの2つのデバイスが現在構成されているフロントカメラを動作させているかどうか知っていますか? – Jerry101

+0

CtsVerifierというアプリを使ってデバイスを確認してください。このアプリはAndroidオープンソースプロジェクトに含まれており、アンドロイドデバイス(CTS)の互換性テストスイートの一部です。 CTSベリファイアには、カメラをチェックする一連のテストがあります(https://source.android.com/compatibility/cts/verifier.htmlを参照)。 このアプリでフロントカメラが動作しない場合は、確実に確認できます。その後、デバイスが破損しているか、Halレイヤーに何らかの破損が発生している可能性があります。その場合は、あなたのアンドロイドOSをダウングレード/アップグレードすることができます。そうでなければ、おそらくハードウェアの損傷です。 – Jorch914

0

私はLollipop 5.1でNexus 10でこの活性を試験します。私はときどき気付いて、私が画面を回転させるとアプリケーションがクラッシュすることが予想されます。私はこの方法surfaceChangedの始まりを変更するこの問題解決:あなたがAndroid上でカメラのハードウェアの使用に関する実施例を勉強したい場合は、さらに

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

を、プロジェクトandroid_instacamとそのソースコードを参照してくださいすることができます。

+0

画面を回転させたときや画面を一時停止するときに、コードが修正後にクラッシュすることはありません。 Istacamは、両方のカメラでnexus 10で動作します。アスペクト比にのみ問題があります。 – xcesco

+0

Nexus10で自分のコードが修正されたコードが表示されます(カメラのプレビューを表示)。 – xcesco

+0

申し訳ありませんもう一度試します。数秒後に、カメラが停止していることを確認します。 istacamのソースコードから始めることをお勧めします。 – xcesco

関連する問題