7

Vì vậy, tôi đang làm việc trên một dự án có liên quan đến Máy ảnh và tôi đã thử nghiệm trên nhiều thiết bị và tất cả đều vượt qua các thử nghiệm ngoại trừ Nexus 10.Nexus 10, Máy ảnh mặt trước Xem trước màu đen (không xem trước)

Tôi thực sự không thể hiểu được điều gì đang xảy ra và không có ai nói về vấn đề trực tuyến.

Tôi đã có thể sao chép sự cố trên hai thiết bị Nexus 10 (wifi) khác nhau.

Đây là mã hoạt động của tôi:

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

     } 
    }; 

} 

bố trí của tôi:

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

và manifest:

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

Không có thông báo lỗi và màn hình chỉ là màu đen

Screenshot

Trả lời

1

Vui lòng xác minh thiết bị của bạn bằng cách sử dụng ứng dụng có tên CtsVerifier, ứng dụng này được bao gồm trong Dự án nguồn mở Android và là một phần của bộ kiểm tra khả năng tương thích cho thiết bị Android (CTS). Trình xác minh CTS có một loạt các kiểm tra kiểm tra máy ảnh. check this link

Bạn có thể chắc chắn rằng nếu camera trước không hoạt động trong ứng dụng này. Sau đó, thiết bị của bạn có thể bị hỏng hoặc một số lỗi đã xảy ra trên lớp hal. Nếu đó là trường hợp bạn có thể cố gắng hạ cấp/nâng cấp hệ điều hành Android của bạn. Nếu không, nó có thể là hư hỏng phần cứng.

6

Câu hỏi cơ bản là, "Cách gỡ lỗi này?" Câu trả lời, như mọi khi, là suy nghĩ về càng nhiều giả thuyết càng tốt có thể giải thích những kết quả này, sau đó kiểm tra những giả thuyết đó.

Dưới đây là một số giả thuyết (đừng nghĩ nhiều hơn):

  • Nó không tìm thấy bất kỳ máy ảnh.
  • Nó không tìm thấy bất kỳ máy ảnh mặt trước nào.
  • Nó giải thích sai các thông số của máy ảnh.
  • Thiết lập mCallback quá muộn, tức là sau khi cần.
  • Nó không tìm thấy một bề mặt hợp lệ.
  • Chưa đăng ký thành công khung máy ảnh.
  • Đăng ký nhưng không nhận được bất kỳ khung máy ảnh nào.
  • Máy ảnh đang nhận khung máy ảnh nhưng không hiển thị chúng, ví dụ: hình ảnh không ở định dạng mong muốn hoặc setImageBitmap(bitmap) Chạy được không chạy.
  • TESTS_COUNT không làm những gì bạn muốn.

Bạn có thể thử nghiệm giả thuyết thông qua ghi nhật ký, nhưng phần lớn điều này sẽ nhanh hơn và nhiều thông tin hơn cho từng bước thông qua trình gỡ rối và kiểm tra các giá trị dữ liệu như params.

Nếu bạn chưa quen với trình gỡ rối, giờ là lúc!

+1

Ghi nhật ký là cách tốt để kiểm tra các giả thuyết miễn là bạn có một số thử nghiệm. Tôi hy vọng bạn không tìm kiếm ai đó để mua thiết bị này và gỡ lỗi mã của bạn cho bạn. Chúng tôi ở đây để dạy và làm sáng tỏ. – Jerry101

+0

Bạn có thể đúng về điều đó. Câu hỏi không đề cập đến mối quan tâm đó cũng như việc thiếu quyền truy cập thiết bị. Bạn có biết nếu hai thiết bị này có camera trước hoạt động như được định cấu hình hiện tại không? – Jerry101

+0

Vui lòng xác minh thiết bị của bạn bằng cách sử dụng ứng dụng có tên CtsVerifier, ứng dụng này được đưa vào Dự án nguồn mở Android và là một phần của bộ thử nghiệm Khả năng tương thích dành cho thiết bị Android (CTS). Trình kiểm tra CTS có một loạt các kiểm tra kiểm tra máy ảnh. (Kiểm tra https://source.android.com/compatibility/cts/verifier.html) Bạn có thể chắc chắn rằng nếu camera phía trước không hoạt động trong ứng dụng này. Sau đó, thiết bị của bạn có thể bị hỏng, hoặc một số tham nhũng đã làm mờ trên lớp hal. Nếu đó là trường hợp bạn có thể cố gắng hạ cấp/nâng cấp hệ điều hành Android của bạn. Nếu không, nó có thể là hư hỏng phần cứng. – Jorch914

0

Tôi kiểm tra hoạt động trên Nexus 10 với Lollipop 5.1. Tôi nhận thấy đôi khi, mong đợi khi tôi xoay màn hình, ứng dụng bị treo. Tôi khắc phục vấn đề này điều chỉnh đầu của phương pháp surfaceChanged với:

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

Hơn nữa, nếu bạn muốn nghiên cứu một ví dụ làm việc về việc sử dụng phần cứng máy ảnh trên Android, bạn có thể tham khảo ý kiến ​​các dự án android_instacam và mã nguồn của nó.

+0

Mã không bị lỗi sau khi sửa chữa khi tôi xoay màn hình và khi tôi tạm dừng màn hình. Istacam hoạt động trên nexus 10, với cả hai camera. Nó chỉ có một vấn đề với tỷ lệ khung hình. – xcesco

+0

Mã của bạn với công việc sửa lỗi của tôi (xem trước máy ảnh hiển thị) trên Nexus10. – xcesco

+0

Xin lỗi tôi thử lại lần nữa. Sau một vài giây, máy ảnh sẽ ngừng hoạt động. Tôi đề nghị bạn bắt đầu với mã nguồn của istacam. – xcesco

Các vấn đề liên quan