ps:https://android.googlesource.com是google的git repositories on android可以下载需要的源码,需要翻墙进。
本文是对android摄像头进行一些分析。在编译的时候发现了错误,报出了w/CameraBase:An error occurred while connecting to camera:0 以及 W/System.error:java.lang.RuntimeException:Fail to connect to camera service;
(1)在java端掉用的代码如下:
private boolean safeCameraOpen(int id)
{
try{
ReleaseCamera();
mCamera = Camera.open(id);
}catch(Exception e){
log.e("failed to open Camera"+e);
}
}
private void ReleaseCamera()
{
if(mCamera != null)
{
mCamera.release();
mCamera = null;
}
}
解决方案:
(1)第一种可能是,因为在camera.open()之前没有release调camera。(
(2) 第二种可能是,摄像头权限的问题没有加<uses-permission android:name="android.permission.CAMERA">
<uses-permission android:name="android.hardware.camera">
以上两种方法基本就可以解决掉在android原生开发下的报错问题。但是如果是在跨平台端来调用camera出错就很难找到。
看下android下的camera.java源码,如下:
public static Camera open(int cameraId){
return new Camera(cameraId);
}
//这里的参数cameraId,是和初始化前置以及后置摄像头有关的。0是前置摄像头,1是后置摄像头。还有另一个打开摄像头的接口,并不带有参数,是默认打开后置摄像头的。如下所示。
public static Camera open()
{
int numberofCameras = getNumberOfCameras();//判断摄像头个数的,一般为2;
CameraInfo cameraInfo = new CamearaInfo(); //一个摄像头信息的类
for(int i = 0;i<numberofCameras;i++)
{
getCameraInfo(i,cameraInfo);
//默认开启后置摄像头
if(cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK)
return new Camera(i);
}
return null;
}
//这样android的java层提供了两种openCamera的方式。接下来是Camera的构造函数,如下:
Camera(int cameraId)
{
int err = cameraInitNormal(cameraId);//这句是重点
if(checkInitErrors(err)){
//java.lang.RuntimeException: Fail to connect to camera service 就是这句报错的地方
if(err == -EACCES){
throw new RuntimeException("Fail to connect to camera service");
}else if(err = -ENODEV)
throw new RuntimeException("Camera Initialization failed");
}
}
//接着往下跟到cameraInitNormal(cameraId)这个接口里面;
private int cameraInitNormal(cameraId)
{
//cameraId就是当前的前置或后置摄像头;CAMERA_HAL_API_VERSION_NORMAL_CONNECT这个应该当前版本camera的api。当跨平台调用.jar包的时候,因为sdk版本的不同可能这里会出现问题。
return cameraInitVersion(cameraId,CAMERA_HAL_API_VERSION_NORMAL_CONNECT);
}
private int cameraInitVersion(int cameraId,int halVersion)
{
mShutterCallback = null;
mRawImageCallback = null;
mJpegCallback = null;
mPreviewCallback = null;
mPostviewCallback = null;
mUsingPreviewAllocation = false;
mZoomListener = null;
Looper looper;
if((looper = Looper.myLooper()) != null)
{
mEventHandler = new EventHandler(this,looper);
}else if((looper = Looper.getMainLooper()) != null)
{
mEventHandler = new EvenHandler(this,looper);
}else{
mEventHandler =null;
}
//这里将要调用到jni层的接口,它在camera.java中有声明该native函数。
return native_setup(new WealReference<Camera>(this),cameraId,halVersion,ActivityThread.currentOpPackageName);
}
//声明如下:private native final int native_setup(Object camera_this,int cameraIdmint halVersion,String packageName);在/framework/base/core/jni/android_hardware_Camera.cpp下可以找到对应接口:
static jint android_hardware_Camera_native_setup(JNIEnv *env,jobject this,jobject weak_this,jint cameraId,jint halVersion,jstring clientPackageName)
{
//进行类型转化;JNIEnv提供了大部分JNI功能。你定义的所有本地函数都会接收JNIEnv作为第一个参数。
const char16_t *rawClientName = reinterpret_cast<const char16_t*>(env->GetStringChars(clientPackageName,NULL));
size rawClientNameLen = env->GetStringLength(clientPackageName);
String16 clientName(rawClientName,rawClientNameLen);
env->ReleaseStringChars(clientPackageName,reinterpret_cast<const jchar*>(rawClientName));
sp<Camera> camera;
if(halVersion = CAMERA_HAL_API_VERSION_NORMAL_CONNECT)
{
camera = Camera::connect(cameraIdm,clientName,Ca,era::USE_CALLING_UID,Camera::USE_CALLING_PID);
}
}
本文探讨了Android中与Camera相关的崩溃问题,具体表现为尝试连接到camera:0时出现错误,日志显示'W/CameraBase: An error occurred while connecting to camera:0'和'W/System.err: java.lang.RuntimeException: Fail to connect to camera service;'.分析了调用Camera.open(id)时可能遇到的异常情况,并提及了解决方法。

173

被折叠的 条评论
为什么被折叠?



