Android Logcat检测到摄像头,但摄像头无法启动,应用程序崩溃

Android Logcat检测到摄像头,但摄像头无法启动,应用程序崩溃,android,android-camera,surfaceview,android-logcat,android-permissions,Android,Android Camera,Surfaceview,Android Logcat,Android Permissions,我正在制作一个简单的应用程序,它将在活动中打开后摄像头并显示实时预览。我正在Android开发者网站上编写代码。logcat检测到我的相机,但活动开始并崩溃到调试模式,我没有得到预览。在进入调试模式时,它会停在这一行mPreview=new-CameraPreview(这是mCamera) 在清单文件中,我有以下任务: 我正在索尼Xperia Tipo双机上测试这个功能,它只有一个后置摄像头。注意:我不想使用意图打开相机,我只需要在活动中进行实时预览 在发布之前我在谷歌上搜索了很多。 任何帮

我正在制作一个简单的应用程序,它将在活动中打开后摄像头并显示实时预览。我正在Android开发者网站上编写代码。logcat检测到我的相机,但活动开始并崩溃到调试模式,我没有得到预览。在进入调试模式时,它会停在这一行
mPreview=new-CameraPreview(这是mCamera)

在清单文件中,我有以下任务:


我正在索尼Xperia Tipo双机上测试这个功能,它只有一个后置摄像头。注意:我不想使用意图打开相机,我只需要在活动中进行实时预览

在发布之前我在谷歌上搜索了很多。 任何帮助都将不胜感激。。。 谢谢你

这是我的logcat在恢复debbuger中的挂起线程后显示的内容:

10-31 04:47:06.262: I/QualcommCamera(6916): Qint android::get_camera_info(int, camera_info*): E
10-31 04:47:06.262: W/CameraService(6916): CameraService::connect: (pid 18358) pre-create object.
10-31 04:47:06.262: I/QualcommCamera(6916): Qint android::camera_device_open(const hw_module_t*, const char*, hw_device_t**): E
10-31 04:47:06.262: E/QualcommCameraHardware(6916): HAL_openCameraHardware: camera_count = 1
10-31 04:47:06.262: I/QualcommCameraHardware(6916): openCameraHardware: call createInstance
10-31 04:47:06.262: I/QualcommCameraHardware(6916): openCameraHardware:Valid camera ID 0
10-31 04:47:06.262: I/QualcommCameraHardware(6916): HAL_openCameraHardware: HAL_currentSnapshotMode = 4 HAL_currentCameraMode = 1
10-31 04:47:06.262: I/QualcommCameraHardware(6916): createInstance: E
10-31 04:47:06.262: I/QualcommCameraHardware(6916): QualcommCameraHardware constructor E
10-31 04:47:06.272: I/QualcommCameraHardware(6916): QualcommCameraHardware: recordframes = 7e40b0
10-31 04:47:06.272: I/QualcommCameraHardware(6916): constructor EX
10-31 04:47:06.272: I/QualcommCameraHardware(6916): startCamera E
10-31 04:47:06.272: I/QualcommCameraHardware(6916):  openCamera : E
10-31 04:47:06.362: I/QualcommCameraHardware(6916): openCamera : X
10-31 04:47:06.362: I/QualcommCameraHardware(6916): startCamera X
10-31 04:47:06.362: I/QualcommCameraHardware(6916): initDefaultParameters E
10-31 04:47:06.582: I/QualcommCameraHardware(6916): Maximum zoom value is 61
10-31 04:47:06.592: I/QualcommCameraHardware(6916): initDefaultParameters X
10-31 04:47:06.592: I/QualcommCameraHardware(6916): createInstance: X
10-31 04:47:06.592: W/CameraService(6916): CameraService::connect: (pid 18358) new hardware.
10-31 04:47:06.592: I/QualcommCamera(6916): Qvoid android::set_callbacks(camera_device*, void (*)(int32_t, int32_t, int32_t, void*), void (*)(int32_t, const camera_memory_t*, unsigned int, camera_frame_metadata_t*, void*), void (*)(int64_t, int32_t, const camera_memory_t*, unsigned int, void*), camera_memory_t* (*)(int, size_t, unsigned int, void*), void*): E
10-31 04:47:06.592: I/QualcommCamera(6916): cam_nt_cb =0x0,cam_dt_cb=0x0,cam_dt_timestamp_cb=0x0
10-31 04:47:06.602: W/CameraService(6916): Client::Client: (pid 18358) setCallbacks() done.
10-31 04:47:06.602: W/CameraService(6916): Client::Client: (pid 18358) enableMsgType() done.
10-31 04:47:06.602: W/CameraService(6916): Client::Client: (pid 18358) setCameraBusy() done.
10-31 04:47:06.602: W/CameraService(6916): Loading CameraService sounds: /system/media/audio/ui/camera_click.ogg
10-31 04:47:06.702: W/CameraService(6916): Loading CameraService sounds: /system/media/audio/ui/VideoRecord.ogg
10-31 04:47:06.802: W/CameraService(6916): Client::Client: (pid 18358) loadSound() done.
10-31 04:47:06.802: W/CameraService(6916): CameraService::connect: (pid 18358) new client .
10-31 04:47:12.592: E/CAM_FD(6916): ...config thread select timeout...
10-31 04:47:18.602: E/CAM_FD(6916): ...config thread select timeout...
10-31 04:47:24.612: E/CAM_FD(6916): ...config thread select timeout...
10-31 04:47:30.612: E/CAM_FD(6916): ...config thread select timeout...
10-31 04:47:36.622: E/CAM_FD(6916): ...config thread select timeout...
10-31 04:47:38.322: I/QualcommCamera(6916): Qint android::preview_enabled(camera_device*): E
10-31 04:47:38.322: I/QualcommCameraHardware(6916):  : mCameraRunning : 0 mPreviewWindow = 0
10-31 04:47:38.322: I/QualcommCamera(6916): Qint android::preview_enabled(camera_device*): E
10-31 04:47:38.322: I/QualcommCameraHardware(6916):  : mCameraRunning : 0 mPreviewWindow = 0
10-31 04:47:38.322: I/QualcommCamera(6916): Qint android::set_preview_window(camera_device*, preview_stream_ops*): E window = 0x7fa688
10-31 04:47:38.322: I/QualcommCameraHardware(6916):  setPreviewWindow: E 
10-31 04:47:38.322: I/QualcommCameraHardware(6916):  setPreviewWindow : X 
10-31 04:47:38.322: I/QualcommCamera(6916): Qint android::start_preview(camera_device*): E
10-31 04:47:38.322: I/QualcommCameraHardware(6916): startPreview E
10-31 04:47:38.322: I/QualcommCameraHardware(6916): g_InitDefaultParam = 0.
10-31 04:47:38.342: I/QualcommCameraHardware(6916): setParameters: X
10-31 04:47:38.342: I/QualcommCameraHardware(6916):  getBuffersAndStartPreview : E 
10-31 04:47:38.372: I/QualcommCameraHardware(6916): in startPreviewInternal : E
10-31 04:47:38.372: I/QualcommCameraHardware(6916): bool android::QualcommCameraHardware::initPreview() Got preview dimension as 640 x 480 
10-31 04:47:38.372: I/mm-camera(6916): __func__ Setting camfram_exit to 0
10-31 04:47:38.372: I/mm-camera(6916): Waiting for frame thread to start ! 
10-31 04:47:38.372: I/QualcommCameraHardware(6916): frame_thread E
10-31 04:47:38.372: I/mm-camera(6916): cam_frame() is ready, call pthread_cond_signal
10-31 04:47:38.382: I/mm-camera(6916): Wait over, frame thread ready !!!! 
10-31 04:47:38.382: I/QualcommCameraHardware(6916): initPreview X: 1
10-31 04:47:38.382: I/mm-camera(6916): cam_frame() is ready, call pthread_cond_signal done
10-31 04:47:38.382: I/QualcommCameraHardware(6916): preview_thread E
10-31 04:47:38.462: I/QualcommCameraHardware(6916): startPreviewInternal: mVfeEnabled = 1 
10-31 04:47:38.462: I/QualcommCameraHardware(6916): startPreviewInternal X
10-31 04:47:38.462: I/QualcommCameraHardware(6916):  getBuffersAndStartPreview : X 
10-31 04:47:38.462: I/QualcommCameraHardware(6916): startPreview X
10-31 04:47:38.462: I/QualcommCamera(6916): Qint android::start_preview(camera_device*): X
10-31 04:47:38.462: I/QualcommCamera(6916): Qvoid android::disable_msg_type(camera_device*, int32_t): E
10-31 04:47:38.462: I/QualcommCamera(6916): Qvoid android::disable_msg_type(camera_device*, int32_t): E
10-31 04:47:38.462: I/QualcommCamera(6916): Qvoid android::stop_preview(camera_device*): E
10-31 04:47:38.462: I/QualcommCameraHardware(6916): stopPreview: E
10-31 04:47:38.462: I/QualcommCameraHardware(6916): stopPreviewInternal E: 1
10-31 04:47:38.462: I/QualcommCameraHardware(6916): cancelAutoFocusInternal E
10-31 04:47:38.462: I/QualcommCameraHardware(6916): cancelAutoFocusInternal X: 0
10-31 04:47:38.552: I/QualcommCameraHardware(6916): stopPreviewInternal: mVfeEnabled = 0 
10-31 04:47:38.552: I/QualcommCameraHardware(6916): stopPreviewInternal: J_mCameraRunning = 0
10-31 04:47:38.552: I/QualcommCameraHardware(6916): stopPreviewInternal: before calling deinitpre mPreviewInitialized = 1
10-31 04:47:38.552: I/QualcommCameraHardware(6916): deinitPreview E
10-31 04:47:38.552: I/QualcommCameraHardware(6916): deinitPreview X
10-31 04:47:38.552: I/QualcommCameraHardware(6916): stopPreviewInternal: waiting for old frame thread to complete.
10-31 04:47:38.552: I/QualcommCameraHardware(6916): runframethread: waiting for preview  thread to complete.
10-31 04:47:38.552: I/QualcommCameraHardware(6916): preview_thread X
10-31 04:47:38.552: I/QualcommCameraHardware(6916): initPreview: old preview thread completed.
10-31 04:47:38.572: I/QualcommCameraHardware(6916): stopPreviewInternal: old frame thread completed.
10-31 04:47:38.572: I/QualcommCameraHardware(6916): stopPreviewInternal X: 0
10-31 04:47:38.572: I/QualcommCameraHardware(6916): stopPreview: X
10-31 04:47:38.572: I/QualcommCamera(6916): Qint android::preview_enabled(camera_device*): E
10-31 04:47:38.572: I/QualcommCameraHardware(6916):  : mCameraRunning : 0 mPreviewWindow = 7fa688
10-31 04:47:38.572: I/QualcommCamera(6916): Qint android::set_preview_window(camera_device*, preview_stream_ops*): E window = 0x7fa688
10-31 04:47:38.572: I/QualcommCameraHardware(6916):  setPreviewWindow: E 
10-31 04:47:38.572: I/QualcommCameraHardware(6916):  setPreviewWindow : X 
10-31 04:47:38.572: I/QualcommCamera(6916): Qint android::start_preview(camera_device*): E
10-31 04:47:38.572: I/QualcommCameraHardware(6916): startPreview E
10-31 04:47:38.572: I/QualcommCameraHardware(6916): g_InitDefaultParam = 1.
10-31 04:47:38.572: I/QualcommCameraHardware(6916):  getBuffersAndStartPreview : E 
10-31 04:47:38.582: I/QualcommCameraHardware(6916): frame_thread X
10-31 04:47:38.622: I/QualcommCameraHardware(6916): in startPreviewInternal : E
10-31 04:47:38.622: I/QualcommCameraHardware(6916): bool android::QualcommCameraHardware::initPreview() Got preview dimension as 640 x 480 
10-31 04:47:38.622: I/mm-camera(6916): __func__ Setting camfram_exit to 0
10-31 04:47:38.622: I/mm-camera(6916): Waiting for frame thread to start ! 
10-31 04:47:38.632: I/QualcommCameraHardware(6916): frame_thread E
10-31 04:47:38.632: I/mm-camera(6916): cam_frame() is ready, call pthread_cond_signal
10-31 04:47:38.632: I/mm-camera(6916): Wait over, frame thread ready !!!! 
10-31 04:47:38.632: I/QualcommCameraHardware(6916): initPreview X: 1
10-31 04:47:38.632: I/mm-camera(6916): cam_frame() is ready, call pthread_cond_signal done
10-31 04:47:38.632: I/QualcommCameraHardware(6916): preview_thread E
10-31 04:47:38.712: I/QualcommCameraHardware(6916): startPreviewInternal: mVfeEnabled = 1 
10-31 04:47:38.712: I/QualcommCameraHardware(6916): startPreviewInternal X
10-31 04:47:38.712: I/QualcommCameraHardware(6916):  getBuffersAndStartPreview : X 
10-31 04:47:38.712: I/QualcommCameraHardware(6916): startPreview X
10-31 04:47:38.712: I/QualcommCamera(6916): Qint android::start_preview(camera_device*): X
主要活动:

package com.example.cameraappdemo;

import android.hardware.Camera; 
import android.os.Bundle;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.util.Log;
import android.widget.FrameLayout;
import android.widget.Toast;


public class MainActivity extends Activity {

private Camera mCamera;
private CameraPreview mPreview;

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

    //checks for back Camera
    if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {

        Toast.makeText(this, "back Camera Found", Toast.LENGTH_LONG).show();
        // Create an instance of Camera
        mCamera = getCameraInstance();

    }    

    // Create our Preview view and set it as the content of our activity.
    mPreview = new CameraPreview(this, mCamera);
    FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
    preview.addView(mPreview);      

}

public static Camera getCameraInstance(){
    Camera c = null;

    try {
        c = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK); // attempt to get a Camera instance
    }
    catch (Exception e){
        // Camera is not available (in use or does not exist)
        Log.d("cam", "Camera is not available - in use or does not exist");
    }
    return c; // returns null if camera is unavailable
}

@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();

    if (mCamera != null) {
        mCamera.release();
        mCamera = null;
    }

};

}
使用SurfaceView的CameraPreview类:

package com.example.cameraappdemo;

import java.io.IOException;

import android.annotation.SuppressLint;
import android.content.Context;
import android.hardware.Camera;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

/** A basic Camera preview class */
@SuppressLint("ViewConstructor")
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Camera mCamera;

public CameraPreview(Context context, Camera camera) {
    super(context);
    mCamera = camera;

    // Install a SurfaceHolder.Callback so we get notified when the
    // underlying surface is created and destroyed.
    mHolder = getHolder();
    mHolder.addCallback(this);
    // deprecated setting, but required on Android versions prior to 3.0
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);      
}

public void surfaceCreated(SurfaceHolder holder) {
    // The Surface has been created, now tell the camera where to draw the preview.

    try {

       mCamera.setPreviewDisplay(holder);

       mCamera.startPreview();

    } catch (IOException e) {
        Log.d("TAG", "Error setting camera preview: ");
    }
}

public void surfaceDestroyed(SurfaceHolder holder) {
    // empty. Take care of releasing the Camera preview in your activity.
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    // If your preview can change or rotate, take care of those events here.
    // Make sure to stop the preview before resizing or reformatting it.

    if (mHolder.getSurface() == null){
      // preview surface does not exist
      return;
    }

    // stop preview before making changes
    try {
        mCamera.stopPreview();

    } catch (Exception e){
      // ignore: tried to stop a non-existent preview
    }

    // set preview size and make any resize, rotate or
    // reformatting changes here

    // start preview with new settings
    try {
        mCamera.setPreviewDisplay(mHolder);
        mCamera.startPreview();

    } catch (Exception e){
        Log.d("TAG", "Error starting camera preview: " + e.getMessage());
    }
}
}

我知道问题出在哪里了。我不得不从on Resume()调用CameraPreview类的引用,因为加载UI需要一些时间,所以最好在另一个线程中调用该对象

以下是我所做的:

package com.example.cameraappdemo;

import android.hardware.Camera; 
import android.os.Bundle;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.util.Log;
import android.widget.FrameLayout;
import android.widget.Toast;


public class MainActivity extends Activity {

private Camera mCamera;
private CameraPreview mPreview;

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


    //checks for back Camera
    if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {

        Toast.makeText(this, "back Camera Found", Toast.LENGTH_LONG).show();
                        // Create an instance of Camera
        mCamera = getCameraInstance();

    }                                           

}

public static Camera getCameraInstance(){
    Camera c = null;

    try {
        c = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK); // attempt to get a Camera instance
    }
    catch (Exception e){
        // Camera is not available (in use or does not exist)
        Log.d("cam", "Camera is not available - in use or does not exist");
    }
    return c; // returns null if camera is unavailable
}

@Override
protected void onStart() {
    // TODO Auto-generated method stub
    super.onStart();

}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();

// Create our Preview view and set it as the content of our activity.   
    mPreview = new CameraPreview(this, mCamera);
    FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
    preview.addView(mPreview);

}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();

    if (mCamera != null) {
        mCamera.release();
        mCamera = null;
    }       

}

@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();

    if (mCamera != null) {
        mCamera.release();
        mCamera = null;
    }

};

}

在转储到调试模式后,请尝试单击“继续”按钮,以便将实际错误输出到LogCat。您确定有2个摄像头吗?第一个错误似乎是说你不。。。(E/QualcommCameraHardware(6916):HAL_openCameraHardware:camera_count=1)@blahdiblah你的意思是说右键单击调试器中的挂起线程,然后单击“恢复”?@DigCamara就像我说的那样,设备只有一个摄像头,那就是后摄像头。@Anafam是的,当然。我不知道按钮是否被调用,但听起来不错。@blahdiblah嘿,非常感谢……在调试模式下恢复挂起的线程帮助我找出了问题所在:)