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