各位大侠,小弟最近尝试在 android2.2上实现支持双camera,因为实在是太菜了,于是乎在网上搜索一番,找到了Wangxiaozhe的一篇《Android2.2平台上支持多camera》,这篇文章对我帮助很大,但是我的情况还不太一样,先说下我现在的思路:
1:在Settings.apk中添加一个选项,选择是前置还是后置camera, 将这个index保存在java/android/provider/Settings.java中。
2:修改camera.apk,在camera.apk初始化的时候获取java/android/provider/Settings.java中的index值,通过frramework层,一路下去告知camera hal层选择了哪个camera.
这种情况,我已经可以实现了,但是这样做有个问题,其余类似camera的apk就没法去打开正确的camera。也就是说,如果在Settings中选择了另外一个camera,在打开别的camera apk时,是不会有效果的。所以我在想,应该把通知camera hal层是哪个camera 被选中的代码加在framework层,即Framework/base/core/java/android/hardware/camera.java中,因为所有的camera apk都会调用到这个文件,但是问题来了,在这里面怎么去获得java/android/provider/Settings.java中的值呢?用
ContentResolver resolver = getContentResolver();
mCameraId = Integer.parseInt(String.valueOf(Settings.System.getInt(resolver, CAMERA_INDEX, DEFAULT_CAMERA_INDEX)));;
会报错,但这两行代码在camera.apk中是可以用的。各位大侠有什么建议意见,或者更好的解决办法吗,在此谢过了!!

解决方案 »

  1.   

    2.2是支持的,我现在定制的2.2系统就可以,不过camera不是我负责的那块,这二天组长叫我改下camera的声音,camera真够复杂的
      

  2.   

    等android2.3吧,否则得用c++修改底层camera实现代码
      

  3.   

    你的程序会报什么错误?我之前做过多摄像头,也是在camera.java的api中做了改动,没有使用provider,使用的是prop来保存camera的index,这个prop是很独立的一个结构,使用也比较方便。
      

  4.   

    你是说,你现在可以实现的是,camera1 或者camera2 ,无论先选择index几 ,另一个都无法再被选择。什么叫

    ContentResolver resolver = getContentResolver();
    mCameraId = Integer.parseInt(String.valueOf(Settings.System.getInt(resolver, CAMERA_INDEX, DEFAULT_CAMERA_INDEX)));;
    会报错,但这两行代码在camera.apk中是可以用的。什么意思?你难道不重新另外定义一个变量来标识吗
      

  5.   

    可能你的CAMERA  HAL层不完整吧。因为只要上层确定是前还是后摄像头,CAMERA HAL层会根据不同ID 分别从/dev/video 0或者/dev/video 2类似的通道来利用标准的V4L2控制具体某个摄像头。从你的情况看很可能hal层不完整了哦。可以利用完整的那个摄像头,重新添加另外一个。同时保证底层CAMERA两路OK
      

  6.   

    我修改了android自带的camera.apk,启动的时候会从Settings中拿到index然后通知到HAL,但是如果我自己下载的一个apk就可以了,因为我不可能动他的代码,他只是去到被动的去hal层拉数据,在Setting菜单中选择哪个camera中是没用。其实我想问的是如何在Framework/base/core/java/android/hardware/camera.java中拿到java/android/provider/Settings.java中的我新加的CAMERA_INDEX?
      

  7.   

    我最想知道的是如何在Framework/base/core/java/android/hardware/camera.java中拿到java/android/provider/Settings.java中的我新加的CAMERA_INDEX,这个值是我在Setting菜单中添加的,是可以设置的
      

  8.   

    我的错误是在Framework/base/core/java/android/hardware/camera.java中用如下的代码会报错:ContentResolver resolver = getContentResolver();
    mCameraId = Integer.parseInt(String.valueOf(Settings.System.getInt(resolver, CAMERA_INDEX, DEFAULT_CAMERA_INDEX)));;
    因为在这个camera.java中不可能调用到getContentResolver函数,这是在activity中才可以调用的吧
      

  9.   


    嗯,懂你的意思了。想要在framework层和app层增加一个camera选项,工作量很大。
    需要修改:
    frameworks/base/Android.mk 把你的camera 加进去
    frameworks/base/core/java/android/provider/Settings.java 
    frameworks/base/core/jni/Android.mk 
    frameworks/base/core/jni/AndroidRuntime.cpp 
    frameworks/base/core/res/res/values/arrays.xml 
    frameworks/base/core/res/res/values/config.xml 
    packages/apps/Settings/AndroidManifest.xml 
    build/core/pathmap.mk
    等等
    还有你的camera 文件还需要根据你的情况 修改init.rc 创建相关目录 或者启动相关service ==真不是件容易的事
      

  10.   


    恩,所以用prop去试验一下,persist.prop是可以保存的prop,在setting中保存的是把数据写入到prop里面而不写到数据库里面。
    这样,在camera.java中去读取这个prop的值,prop的操作可以直接使用的。
      

  11.   

    Prop的介绍参考下http://my.unix-center.net/~Simon_fu/?p=957
    在java中使用android.os.SystemProperties来操作prop(参考的文章中说的是错误的)
      

  12.   

    谢谢YKDSea,我试了一下,成功了!在Settings.apk中将cameraIndex通过android.os.SystemProperties的get和set方法存储到文件系统里面:
    SystemProperties sp = new SystemProperties();
    String s = sp.get("persist.sys.cameraIndex");

    sp.set("persist.sys.cameraIndex", "0");
    之后会在/data/property/中生成persist.sys.cameraIndex,这个文件里面就是保存的值。
    在camera hal层里面#include <cutils/properties.h>, 调用property_get("persist.sys.cameraIndex", &cameraId, "0"),就可以拿到在apk里设置的值了,这样的话就绕过了framework,service等,还挺方便的!问题解决了开心啊,之后就要开始调试camera driver了,不知到会有什么问题等着我呢总之谢谢大家了~
      

  13.   

    还好吧,差不多弄好了,framework层现在没动,就动了Settings.apk和camera Hal,谢谢啊
      

  14.   

    w问一下,在android中如何给相机设置焦距,我调用setzoom不起作用,Camera.getParameters().isZoomSupported() -->true
    Camera.getParameters().isSmoothZoomSupported() -->false这种情况下,我怎么才能实现变焦呢??
      

  15.   

    你好,请问下android4.0的双摄像头的怎么调啊。?这个摄像头只有一个接口,两个摄像头用同一个接口