【问题标题】:LED flashlight on Galaxy Nexus controllable by what API?Galaxy Nexus 上的 LED 手电筒可由什么 API 控制?
【发布时间】:2012-02-11 04:58:27
【问题描述】:

Android 的 LED 手电筒 API 问题太多了。我不敢再问一个,但这里是..

使用久经考验的真正 FLASH_MODE_TORCH,我能够对我的三星 Galaxy SII 感到满意并打开 LED 闪光灯。在我朋友的 Galaxy Nexus 上,没有这样的运气。在我其他朋友的 Droid X 上也没有。

我注意到似乎需要大量设备特定的本地 IOCTL 调用。 Galaxy Nexus 是这种情况吗?如何找到编程参考?

我正在做标准的 FLASH_MODE_TORCH/"flash-mode"="torch", startPreview() 链。

有点令人失望的是,这个看似标准的 API 似乎并没有那么普遍。

【问题讨论】:

    标签: android led flashlight


    【解决方案1】:

    我发现有些设备需要 SurfaceView 才能打开 LED。

    SurfaceView preview = (SurfaceView) findViewById(R.id.PREVIEW);
    SurfaceHolder mHolder = preview.getHolder();
    mHolder.addCallback(this);
    Camera mCamera = Camera.open();
    mCamera.setPreviewDisplay(mHolder);
    
    // Turn on LED  
    Parameters params = mCamera.getParameters();
    params.setFlashMode(Parameters.FLASH_MODE_TORCH);
    mCamera.setParameters(params);      
    mCamera.startPreview();
    
    ...
    
    // Turn off LED
    Parameters params = mCamera.getParameters();
    params.setFlashMode(Parameters.FLASH_MODE_OFF);
    mCamera.setParameters(params);
    mCamera.stopPreview();
    mCamera.release();
    

    您的活动需要实现 SurfaceHolder.Callback:

    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {}
    
    public void surfaceCreated(SurfaceHolder holder) {
        mHolder = holder;
        mCamera.setPreviewDisplay(mHolder);
    }
    
    public void surfaceDestroyed(SurfaceHolder holder) {
        mCamera.stopPreview();
        mHolder = null;
    }
    

    surfaceview 必须可见,android:visibility="invisible" 否则高度和宽度为 0 将不起作用。不幸的是,我没有找到隐藏它的好方法,所以我 只是给它一个 1x1dip 的大小并将它放在一个按钮下面..

    **(扩展上述段落[没有足够的代表来回复,但觉得它很有用])您当前内容视图的 XML 中的某个位置,您想要:

    <SurfaceView
        android:id="@+id/PREVIEW"
        android:layout_width="1dip"
        android:layout_height="1dip"/>
    

    如果您将它放在 RelativeLayout(首选)中,您还可以执行 alignParentLeft/Bottom 将其塞入角落。这种方法适用于我的 Galaxy Nexus,但它是 Droid X 的一个已知问题(手机端)(无论如何都是 .621 更新),并且不适用于我的。很好的答案,timosch!

    【讨论】:

    • 我要试一试。谢谢--
    • 是的,但是我必须在 SurfaceHolder mHolder = preview.getHolder(); 之后添加 mHolder.addCallback(this);这可能也有帮助stackoverflow.com/questions/10734858/…
    • 如果我想从小部件打开手电筒,我必须怎么做?
    • 您可以将Activity主题设置为@android:style/Theme.Translucent.NoTitleBar,这样SurfaceView就不会显示了
    • 一个小通知。 Camera.open 后不需要 setPreviewDisplay。在文档中说 - Important: Pass a fully initialized SurfaceHolder to setPreviewDisplay(SurfaceHolder). Without a surface, the camera will be unable to start the preview.
    猜你喜欢
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多