Screenshot_2013-10-09-00-27-58
前の記事で、無線LANの設定をQRコードで表示するスクリプトについて書きましたが、
sgt7 を入れたKindle Fire HD 8.9 でWi-Fi 設定をしようとQRコードリーダーを起動すると、
QRコードリーダーアプリが異常終了してしまいます。

なんとかしないと、毎月多大な工数が生じてしまう!

Android のQRコードリーダーアプリは、ZXingライブラリを採用した物が多く、
CMベースのKindle向けカスタムROM では、このライブラリを採用したQRコードリーダーアプリが軒並み異常終了するようです。
ライブラリがカメラを開いている箇所に原因があると考え、確認しました。

adb shellでlogcatを実行すると、各種アプリが動作している様子が確認できます。
今回はカメラに注目して動作を確認してみます。
QRCode Scanner を起動してみると、camera#1を使おうとしてプレビューに失敗しているようです。

root@android:/ # logcat | grep -i camera

I/com.google.zxing.client.android.camera.open.OpenCameraInterface(12547): Opening camera #1
I/CameraClient(12582): Opening camera 1
I/CameraHal(12582): (4011f0fc)   device/amazon/omap4-common/camera/CameraHal_Module.cpp:639 camera_device_open - camera_device open
E/CameraHal(12582): (4011f0fc)   device/amazon/omap4-common/camera/CameraHal.cpp:4136 initialize - 1
E/CameraHal(12582): (4011f0fc)   device/amazon/omap4-common/camera/CameraHal.cpp:4147 initialize - 2
E/CameraHal(12582): (4011f0fc)   device/amazon/omap4-common/camera/CameraHal.cpp:4155 initialize - 3
I/CameraConfiguration(12547): Screen resolution: Point(1920, 1128)
I/CameraConfiguration(12547): Supported preview sizes: 1280x720 720x1280 960x720 768x576 576x768 720x576 576x720 800x480 480x800 720x480 480x720 640x480 480x640 352x288 288x352 320x240 240x320 240x160 160x240 176x144 144x176 160x120 120x160 128x96 96x128
I/CameraConfiguration(12547): Using largest suitable preview size: Point(1280, 720)
I/CameraConfiguration(12547): Camera resolution: Point(1280, 720)
I/CameraConfiguration(12547): Initial camera parameters: s3d-prv-frame-layout-values=none;zoom=0;max-num-detected-faces-hw=35;ti-algo-external-gamma=false;sensor-orientation=0;whitebalance=auto;ti-algo-gic=true;preview-format-values=yuv420sp,yuv420p,yuv422i-yuyv,yuv420p;auto-convergence-mode-values=;jpeg-thumbnail-quality=60;preview-format=yuv420sp;exposure-mode-values=manual,auto,night,backlighting,spotlight,sports,snow,beach,aperture,small-aperture;exif-make=Amazon;iso=auto;flash-mode-values=on,off,auto,red-eye,fill-in,torch;supported-manual-convergence-min=-100;supported-preview-sidebyside-size-values=;preview-frame-rate=30;ti-algo-nsf1=true;camera-name=IMX060;ti-algo-nsf2=true;jpeg-thumbnail-width=160;scene-mode-values=auto,closeup,landscape,aqua,sports,mood,night-portrait,night-indoor,fireworks,document,barcode,super-night,cine,old-film,action,beach,candlelight,night,party,portrait,snow,steadyphoto,sunset,theatre;exif-model=Amazon Kindle Fire HD;preview-fps-range-values=(5000,5000),(10000,10000),(15000,15000),(20000,20000),(24000,24000),(5000,30000),(30000,30000);gbce=false;preview-size-values=1280x720,960x720,800x480,720x576,720x480,768x576,640x480,320x240,352x288,240x160,176x144,160x120,128x96,720x1280,480x800,576x720,576x768,480x720,480x640,288x352,240x320,160x240,144x176,120x160,96x128;manual-exposure-right=1;vnf-supported=true;supported-picture-sidebyside-size-values=;preview-fps-range=30000,30000;auto-whitebalance-lock=false;min-exposure-compensation=-30;antibanding=auto;supported-manual-gain-iso-max=800;max-num-focus-areas=20;supported-manual-gain-iso-min=100;vertical-view-angle=42.5;video-stabilization-supported=true;iso-mode-values=auto,100,200,400,800;manual-gain-iso=100;s3d-cap-frame-layout=none;supported-manual-gain-iso-step=100;glbce=false;supported-manual-exposure-step=1;ti-algo-sharpening=true;picture-format-values=unused,yuv420sp,yuv420p,yuv422i-yuyv,rgb565,bayer-rggb,jpeg;supported-preview-topbottom-size-values=;glbce-supported=true;exposure-compensation-step=0.1;manual-convergence=0;picture-size=320x240;saturation=100;whitebalance-values=auto,daylight,cloudy-daylight,tungsten,fluorescent,incandescent,horizon,sunset,shade,twilight,warm-fluorescent;picture-format=jpeg;supported-picture-subsampled-size-values=;current-iso=100;preview-fps-range-ext-values=(5000,5000),(10000,10000),(15000,15000),(20000,20000),(24000,24000),(5000,30000),(30000,30000);ipp=off;raw-height=3024;recording-hint=;video-stabilization=false;preview-frame-rate-range=30000,30000;ipp-values=off,ldc,nsf,ldc-nsf;zoom-supported=true;sharpness=100;contrast=100;scene-mode=auto;jpeg-quality=95;supported-manual-exposure-min=1;manual-gain-iso-right=100;preview-size=640x480;focal-length=4.60;mode-values=high-quality,video-mode,high-performance,high-quality-zsl,zoom-bracketing,exposure-bracketing,temporal-bracketing;vnf=false;preview-fps-ext-values=5,10,15,20,24,30;preview-frame-rate-values=5,10,15,20,24,30;max-num-metering-areas=20;s3d-prv-frame-layout=none;manual-exposure=1;focus-mode-values=off,continuous-video,continuous-picture,auto,macro,infinity,infinity,portrait,extended,face-priority;jpeg-thumbnail-size-values=640x480,160x120,200x120,320x240,512x384,352x144,176x144,96x96,0x0;supported-manual-exposure-max=125;zoom-ratios=100,104,107,111,115,119,123,127,132,137,141,146,152,157,162,168,174,180,187,193,200,207,214,222,230,238,246,255,264,273,283,293,303,314,325,336,348,361,373,386,400,414,429,444,459,476,492,510,528,546,566,586,606,628,650,673,696,721,746,773,800;gbce-supported=true;exposure=auto;picture-size-values=1024x768,640x480,320x240;mechanical-misalignment-correction-supported=false;s3d-cap-frame-layout-values=none;auto-convergence-mode=frame;supported-manual-convergence-max=100;horizontal-view-angle=54.8;supported-manual-convergence-step=1;brightness=50;jpeg-thumbnail-height=120;smooth-zoom-supported=true;raw-width=4032;focus-mode=auto;supported-preview-subsampled-size-values=;auto-whitebalance-lock-supported=true;video-frame-format=OMX_TI_COLOR_FormatYUV420PackedSemiPlanar;max-num-detected-faces-sw=0;supported-pictu
I/CameraConfiguration(12547): Supported values: [on, off, auto, red-eye, fill-in, torch]
I/CameraConfiguration(12547): Settable value: off
I/CameraConfiguration(12547): Supported values: [off, continuous-video, continuous-picture, auto, macro, infinity, infinity, portrait, extended, face-priority]
I/CameraConfiguration(12547): Settable value: auto
E/CameraHal(12582): (4155b6f8)   device/amazon/omap4-common/camera/OMXCameraAdapter/OMXCameraAdapter.cpp:3063 OMXCameraAdapterEventHandler - ***Got Fatal Error Notification***
E/CameraHal(12582): (4155b6f8)   device/amazon/omap4-common/camera/AppCallbackNotifier.cpp:254 errorNotify - AppCallbackNotifier received error 1
E/CameraHal(12582): (40047008)   device/amazon/omap4-common/camera/OMXCameraAdapter/OMXCameraAdapter.cpp:2288 startPreview - OMX_FillThisBuffer-0x80001009
E/CameraHal(12582): (40047008)   device/amazon/omap4-common/camera/OMXCameraAdapter/OMXCameraAdapter.cpp:2342 startPreview - Exiting function startPreview because of ret 0 eError=80001009
I/DEBUG   (  134):     #02  pc 0002d395  /system/lib/hw/camera.bowser.so (Ti::Camera::AppCallbackNotifier::errorNotify(int)+92)
I/DEBUG   (  134):     #03  pc 0003e589  /system/lib/hw/camera.bowser.so (Ti::Camera::OMXCameraAdapter::OMXCameraAdapterEventHandler(void*, OMX_EVENTTYPE, unsigned long, unsigned long, void*)+276)
I/DEBUG   (  134):          41bafc30  40abb4c7  /system/lib/hw/camera.bowser.so
I/DEBUG   (  134):          41bafc50  40abb4c7  /system/lib/hw/camera.bowser.so
I/DEBUG   (  134):          41bafc54  40a8ef37  /system/lib/hw/camera.bowser.so
I/DEBUG   (  134):          41bafc6c  40a96399  /system/lib/hw/camera.bowser.so (Ti::Camera::AppCallbackNotifier::errorNotify(int)+96)
I/DEBUG   (  134):          41bafc74  40abcd2b  /system/lib/hw/camera.bowser.so
I/DEBUG   (  134):          41bafc7c  40ac4be0  /system/lib/hw/camera.bowser.so
I/DEBUG   (  134):          41bafc84  40abb4c7  /system/lib/hw/camera.bowser.so
I/DEBUG   (  134):          41bafca4  40aa758b  /system/lib/hw/camera.bowser.so (Ti::Camera::OMXCameraAdapter::OMXCameraAdapterEventHandler(void*, OMX_EVENTTYPE, unsigned long, unsigned long, void*)+278)
I/ServiceManager(  124): service 'media.camera' died
W/CameraBase(12547): Camera service died!
W/CameraBase(12547): mediaserver's remote binder Camera object died
W/CaptureActivity(12547): Unexpected error initializing camera
W/CaptureActivity(12547):       at android.hardware.Camera.native_getParameters(Native Method)
W/CaptureActivity(12547):       at android.hardware.Camera.getParameters(Camera.java:1552)
W/CaptureActivity(12547):       at com.google.zxing.client.android.camera.AutoFocusManager.(AutoFocusManager.java:51)
W/CaptureActivity(12547):       at com.google.zxing.client.android.camera.CameraManager.startPreview(CameraManager.java:146)
W/CaptureActivity(12547):       at com.google.zxing.client.android.CaptureActivity.initCamera(CaptureActivity.java:672)
D/CameraManager(12547): Calculated framing rect: Rect(360, 226 - 1560, 901)
E/Camera  (12547): Error 100
I/CameraService(12675): CameraService started (pid=12675)
I/CameraService(12675): Loaded "TI OMAP CameraHal Module" camera module
E/CameraHal(12675): (4018f0fc)   device/amazon/omap4-common/camera/CameraHalCommon.cpp:178 getPixelFormatConstant - Preview format is NULL, defaulting to NV12
I/CameraHal(12675): (4018f0fc)   device/amazon/omap4-common/camera/OMXCameraAdapter/OMXCapabilities.cpp:1045 insertFramerates - Frame rate range: MinFR (5000, 0), MaxFR (30000, 0)
E/CameraHal(12675): (4018f0fc)   device/amazon/omap4-common/camera/CameraHalCommon.cpp:178 getPixelFormatConstant - Preview format is NULL, defaulting to NV12
I/CameraHal(12675): (4018f0fc)   device/amazon/omap4-common/camera/OMXCameraAdapter/OMXCapabilities.cpp:1045 insertFramerates - Frame rate range: MinFR (5000, 0), MaxFR (30000, 0)
E/CameraHal(12675): (4018f0fc)   device/amazon/omap4-common/camera/CameraHalCommon.cpp:178 getPixelFormatConstant - Preview format is NULL, defaulting to NV12
I/CameraHal(12675): (4018f0fc)   device/amazon/omap4-common/camera/OMXCameraAdapter/OMXCapabilities.cpp:1045 insertFramerates - Frame rate range: MinFR (5000, 0), MaxFR (30000, 0)
E/CameraHal(12675): (4018f0fc)   device/amazon/omap4-common/camera/CameraHalCommon.cpp:178 getPixelFormatConstant - Preview format is NULL, defaulting to NV12
I/CameraHal(12675): (4018f0fc)   device/amazon/omap4-common/camera/OMXCameraAdapter/OMXCapabilities.cpp:1045 insertFramerates - Frame rate range: MinFR (5000, 0), MaxFR (30000, 0)
E/CameraHal(12675): (4018f0fc)   device/amazon/omap4-common/camera/OMXCameraAdapter/OMXCameraAdapter.cpp:4488 OMXCameraAdapter_Capabilities - Number of OMX Cameras detected = 1
E/CameraHal(12675): (4018f0fc)   device/amazon/omap4-common/camera/CameraHalCommon.cpp:178 getPixelFormatConstant - Preview format is NULL, defaulting to NV12
I/CameraHal(12675): (4018f0fc)   device/amazon/omap4-common/camera/OMXCameraAdapter/OMXCapabilities.cpp:1045 insertFramerates - Frame rate range: MinFR (5000, 1000), MaxFR (30000, 30000)
E/CameraHal(12675): (4018f0fc)   device/amazon/omap4-common/camera/CameraHalCommon.cpp:178 getPixelFormatConstant - Preview format is NULL, defaulting to NV12
I/CameraHal(12675): (4018f0fc)   device/amazon/omap4-common/camera/OMXCameraAdapter/OMXCapabilities.cpp:1045 insertFramerates - Frame rate range: MinFR (5000, 1000), MaxFR (30000, 30000)
E/CameraHal(12675): (4018f0fc)   device/amazon/omap4-common/camera/CameraHalCommon.cpp:178 getPixelFormatConstant - Preview format is NULL, defaulting to NV12
I/CameraHal(12675): (4018f0fc)   device/amazon/omap4-common/camera/OMXCameraAdapter/OMXCapabilities.cpp:1045 insertFramerates - Frame rate range: MinFR (5000, 1000), MaxFR (30000, 30000)
E/CameraHal(12675): (4018f0fc)   device/amazon/omap4-common/camera/CameraHalCommon.cpp:178 getPixelFormatConstant - Preview format is NULL, defaulting to NV12
I/CameraHal(12675): (4018f0fc)   device/amazon/omap4-common/camera/OMXCameraAdapter/OMXCapabilities.cpp:1045 insertFramerates - Frame rate range: MinFR (5000, 1000), MaxFR (30000, 30000)
E/CameraHal(12675): (4018f0fc)   device/amazon/omap4-common/camera/OMXCameraAdapter/OMXCameraAdapter.cpp:4488 OMXCameraAdapter_Capabilities - Number of OMX Cameras detected = 2
E/CameraHal(12675): (4018f0fc)   device/amazon/omap4-common/camera/BaseCameraAdapter.cpp:2684 CameraAdapter_Capabilities - supportedCameras= 2
I/CameraHal(12675): (4018f0fc)   device/amazon/omap4-common/camera/CameraProperties.cpp:114 loadProperties - num_cameras = 2

ここで、なぜcamera#1が使われるのか疑問でした。camera#1があるなら、camera#0もあるはず。
とりあえず公開されているソースを見てみました。
CaptureActivity.javaがカメラを開いているようです。
さらに追ってみると、Opening camera # を出力しているのは、OpenCameraInterface.javaでした。

このコードを見ると、カメラフレームワークが教えてくれたカメラの中から背面カメラを選ぶ作りになっています。


while (index < numCameras) {
  Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
  Camera.getCameraInfo(index, cameraInfo);
  if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
    break;
  }
  index++;
}

Camera.getCameraInfo() の後で、facing を取得すると、カメラがフロントか背面かわかります。

Kindle Fire HD 8.9(jem) 用カメラドライバは、実在するフロントカメラ camera#0の他に、
実装されていない背面カメラ camera#1 が存在するかのように応答してしまいます。
いざ背面カメラの映像を表示しようとしても、撮像モジュールが無いためプレビューに失敗しているようです。

Camera.getCameraInfo() が取得する情報は、以下のようになっています。

  • camera#0 (実在するフロントカメラ)
    
    I/com.google.zxing.client.android.camera.open.OpenCameraInterface( 4328): Camera Params
     s3d-prv-frame-layout-values=none;
     zoom=0;
     max-num-detected-faces-hw=35;
     ti-algo-external-gamma=false;
     sensor-orientation=0;
     whitebalance=auto;
     ti-algo-gic=true;
     preview-format-values=yuv420sp,yuv420p,yuv422i-yuyv,yuv420p;
     auto-convergence-mode-values=;
     jpeg-thumbnail-quality=60;
     preview-format=yuv420sp;
     exposure-mode-values=manual,auto,night,backlighting,spotlight,sports,snow,beach,aperture,small-aperture;
     exif-make=Amazon;
     iso=auto;
     flash-mode-values=off;
     supported-manual-convergence-min=-100;
     supported-preview-sidebyside-size-values=;
     preview-frame-rate=30;
     ti-algo-nsf1=true;
     camera-name=UNKNOWN_SENSOR;
     ti-algo-nsf2=true;
     jpeg-thumbnail-width=160;
     scene-mode-values=auto,closeup,landscape,aqua,sports,mood,night-portrait,night-indoor,fireworks,document,barcode,super-night,cine,old-film,action,beach,candlelight,night,party,portrait,snow,steadyphoto,sunset,theatre;
     exif-model=Amazon Kindle Fire HD;
     preview-fps-range-values=(5000,5000),(10000,10000),(15000,15000),(20000,20000),(24000,24000),(5000,30000),(30000,30000);
     gbce=false;
     preview-size-values=1280x720,960x720,800x480,720x576,720x480,768x576,640x480,320x240,352x288,240x160,176x144,160x120,128x96,720x1280,480x800,576x720,576x768,480x720,480x640,288x352,240x320,160x240,144x176,120x160,96x128;
     manual-exposure-right=1;
     vnf-supported=true;
     supported-picture-sidebyside-size-values=;
     preview-fps-range=30000,30000;
     auto-whitebalance-lock=false;
     min-exposure-compensation=-30;
     antibanding=auto;
     supported-manual-gain-iso-max=800;
     max-num-focus-areas=0;
     supported-manual-gain-iso-min=100;
     vertical-view-angle=42.5;
     video-stabilization-supported=true;
     iso-mode-values=auto,100,200,400,800;
     manual-gain-iso=100;
     s3d-cap-frame-layout=none;
     supported-manual-gain-iso-step=100;
     glbce=false;
     supported-manual-exposure-step=1;
     ti-algo-sharpening=true;
     picture-format-values=unused,yuv420sp,yuv420p,yuv422i-yuyv,rgb565,bayer-rggb,jpeg;
     supported-preview-topbottom-size-values=;
     glbce-supported=true;
     exposure-compensation-step=0.1;
     manual-convergence=0;
     picture-size=320x240;
     saturation=100;
     whitebalance-values=auto,daylight,cloudy-daylight,tungsten,fluorescent,incandescent,horizon,sunset,shade,twilight,warm-fluorescent;
     picture-format=jpeg;
     supported-picture-subsampled-size-values=;
     current-iso=100;
     preview-fps-range-ext-values=(0,0),(5000,0),(5000,5000);
     ipp=off;
     raw-height=808;
     recording-hint=;
     video-stabilization=false;
     preview-frame-rate-range=30000,30000;
     ipp-values=off,ldc,nsf,ldc-nsf;
     zoom-supported=true;
     sharpness=100;
     contrast=100;
     scene-mode=auto;
     jpeg-quality=95;
     supported-manual-exposure-min=1;
     manual-gain-iso-right=100;
     preview-size=640x480;
     focal-length=4.76;
     mode-values=high-quality,video-mode,high-performance,high-quality-zsl,zoom-bracketing,exposure-bracketing,temporal-bracketing;
     vnf=false;
     preview-fps-ext-values=0,5;
     preview-frame-rate-values=5,10,15,20,24,30;
     max-num-metering-areas=0;
     s3d-prv-frame-layout=none;
     manual-exposure=1;
     focus-mode-values=off,infinity;
     jpeg-thumbnail-size-values=640x480,160x120,200x120,320x240,512x384,352x144,176x144,96x96,0x0;
     supported-manual-exposure-max=125;
     zoom-ratios=100,104,107,111,115,119,123,127,132,137,141,146,152,157,162,168,174,180,187,193,200,207,214,222,230,238,246,255,264,273,283,293,303,314,325,336,348,361,373,386,400,414,429,444,459,476,492,510,528,546,566,586,606,628,650,673,696,721,746,773,800;
     gbce-supported=true;
     exposure=auto;
     picture-size-values=1024x768,640x480,320x240;
     mechanical-misalignment-correction-supported=false;
     s3d-cap-frame-layout-values=none;
     auto-convergence-mode=frame;
     supported-manual-convergence-max=100;
     horizontal-view-angle=54.8;
     supported-manual-convergence-step=1;
     brightness=50;
     jpeg-thumbnail-height=120;
     smooth-zoom-supported=true;
     raw-width=1296;
     focus-mode=infinity;
     supported-preview-subsampled-size-values=;
     auto-whitebalance-lock-supported=true;
     video-frame-format=OMX_TI_COLOR_FormatYUV420PackedSemiPlanar;
     max-num-detected-faces-sw=0;
     supported-picture-topbottom-size-values=;
     max-exposure-compensation=30;
     video-snapshot-supported=true;
     exposure-compensation=0;
     flash-mode=off;
     auto-exposure-lock=false;
     effect-val
    
  • camera#1 (ドライバが返す非実在背面カメラ)
    
    I/com.google.zxing.client.android.camera.open.OpenCameraInterface( 3980): Camera Params
     s3d-prv-frame-layout-values=none;
     zoom=0;
     max-num-detected-faces-hw=35;
     ti-algo-external-gamma=false;
     sensor-orientation=0;
     whitebalance=auto;
     ti-algo-gic=true;
     preview-format-values=yuv420sp,yuv420p,yuv422i-yuyv,yuv420p;
     auto-convergence-mode-values=;
     jpeg-thumbnail-quality=60;
     preview-format=yuv420sp;
     exposure-mode-values=manual,auto,night,backlighting,spotlight,sports,snow,beach,aperture,small-aperture;
     exif-make=Amazon;
     iso=auto;
     flash-mode-values=on,off,auto,red-eye,fill-in,torch;
     supported-manual-convergence-min=-100;
     supported-preview-sidebyside-size-values=;
     preview-frame-rate=30;
     ti-algo-nsf1=true;
     camera-name=IMX060;
     ti-algo-nsf2=true;
     jpeg-thumbnail-width=160;
     scene-mode-values=auto,closeup,landscape,aqua,sports,mood,night-portrait,night-indoor,fireworks,document,barcode,super-night,cine,old-film,action,beach,candlelight,night,party,portrait,snow,steadyphoto,sunset,theatre;
     exif-model=Amazon Kindle Fire HD;
     preview-fps-range-values=(5000,5000),(10000,10000),(15000,15000),(20000,20000),(24000,24000),(5000,30000),(30000,30000);
     gbce=false;
     preview-size-values=1280x720,960x720,800x480,720x576,720x480,768x576,640x480,320x240,352x288,240x160,176x144,160x120,128x96,720x1280,480x800,576x720,576x768,480x720,480x640,288x352,240x320,160x240,144x176,120x160,96x128;
     manual-exposure-right=1;
     vnf-supported=true;
     supported-picture-sidebyside-size-values=;
     preview-fps-range=30000,30000;
     auto-whitebalance-lock=false;
     min-exposure-compensation=-30;
     antibanding=auto;
     supported-manual-gain-iso-max=800;
     max-num-focus-areas=20;
     supported-manual-gain-iso-min=100;
     vertical-view-angle=42.5;
     video-stabilization-supported=true;
     iso-mode-values=auto,100,200,400,800;
     manual-gain-iso=100;
     s3d-cap-frame-layout=none;
     supported-manual-gain-iso-step=100;
     glbce=false;
     supported-manual-exposure-step=1;
     ti-algo-sharpening=true;
     picture-format-values=unused,yuv420sp,yuv420p,yuv422i-yuyv,rgb565,bayer-rggb,jpeg;
     supported-preview-topbottom-size-values=;
     glbce-supported=true;
     exposure-compensation-step=0.1;
     manual-convergence=0;
     picture-size=320x240;
     saturation=100;
     whitebalance-values=auto,daylight,cloudy-daylight,tungsten,fluorescent,incandescent,horizon,sunset,shade,twilight,warm-fluorescent;
     picture-format=jpeg;
     supported-picture-subsampled-size-values=;
     current-iso=100;
     preview-fps-range-ext-values=(5000,5000),(10000,10000),(15000,15000),(20000,20000),(24000,24000),(5000,30000),(30000,30000);
     ipp=off;
     raw-height=3024;
     recording-hint=;
     video-stabilization=false;
     preview-frame-rate-range=30000,30000;
     ipp-values=off,ldc,nsf,ldc-nsf;
     zoom-supported=true;
     sharpness=100;
     contrast=100;
     scene-mode=auto;
     jpeg-quality=95;
     supported-manual-exposure-min=1;
     manual-gain-iso-right=100;
     preview-size=640x480;
     focal-length=4.60;
     mode-values=high-quality,video-mode,high-performance,high-quality-zsl,zoom-bracketing,exposure-bracketing,temporal-bracketing;
     vnf=false;
     preview-fps-ext-values=5,10,15,20,24,30;
     preview-frame-rate-values=5,10,15,20,24,30;
     max-num-metering-areas=20;
     s3d-prv-frame-layout=none;
     manual-exposure=1;
     focus-mode-values=off,continuous-video,continuous-picture,auto,macro,infinity,infinity,portrait,extended,face-priority;
     jpeg-thumbnail-size-values=640x480,160x120,200x120,320x240,512x384,352x144,176x144,96x96,0x0;
     supported-manual-exposure-max=125;
     zoom-ratios=100,104,107,111,115,119,123,127,132,137,141,146,152,157,162,168,174,180,187,193,200,207,214,222,230,238,246,255,264,273,283,293,303,314,325,336,348,361,373,386,400,414,429,444,459,476,492,510,528,546,566,586,606,628,650,673,696,721,746,773,800;
     gbce-supported=true;
     exposure=auto;
     picture-size-values=1024x768,640x480,320x240;
     mechanical-misalignment-correction-supported=false;
     s3d-cap-frame-layout-values=none;
     auto-convergence-mode=frame;
     supported-manual-convergence-max=100;
     horizontal-view-angle=54.8;
     supported-manual-convergence-step=1;
     brightness=50;
     jpeg-thumbnail-height=120;
     smooth-zoom-supported=true;
     raw-width=4032;
     focus-mode=auto;
     supported-preview-subsampled-size-values=;
     auto-whitebalance-lock-supported=true;
     video-frame-format=OMX_TI_COLOR_FormatYUV420PackedSemiPlanar;
     max-num-dete
    

なんと、非実在背面カメラ camera#1はcamera-name=IMX060と一見正しい製番を返しているのに対して、
実在するフロントカメラ camera#0はcamera-name=UNKNOWN_SENSORと、知らないセンサーらしいです。
UNKNOWN_SENSORだったらスキップするコードに出来ると目論んでいましたが残念。

ドライバを追ってみると、こんな流れ。

  • OpenCameraInterface.java が、Camera.getNumberOfCameras() でカメラの数を尋ねる
  • CameraHal_Module.cpp:camera_get_number_of_cameras() が、CameraProperties.h:MAX_CAMERAS_SUPPORTED を返す
  • #define MAX_CAMERAS_SUPPORTED 2;のため、カメラが2つあると誤解
  • OpenCameraInterface.java がCameraHal_Module.cpp:camera_get_camera_info() を使いカメラの情報を順次取得
  • ここでもエラーにならず、非実在背面カメラがopenされて CaptureActivity.java に伝わる
  • 非実在背面カメラの映像をプレビューしようとして失敗

というのが顛末のようです。

もしドライバに手を入れるのであれば、CameraProperties.h にコンフィグパラメータを使う感じでしょうか。


#if defined (CONFIG_MACH_OMAP4_BOWSER_SUBTYPE_JEM)
#define MAX_CAMERAS_SUPPORTED 1;
#else
#define MAX_CAMERAS_SUPPORTED 2;
#endif

ドライバ側を直すのが正攻法ぽいけど、手元にCyanogenModのビルド環境を作るのも大変なので、
ひとまず、camera#0を無理やり使う変更を施してビルドしたapkを突っ込みました。

なんとなく動いてそうでよかった。
おわり。

Kindle Fire HDX 8.9 64GB タブレットKindle Fire HDX 8.9 64GB タブレット

Amazon 2013-11-28
売り上げランキング : 1905

Amazonで詳しく見る
by G-Tools