Galaxy Nexus上的LED手电筒可通过什么API控制?

时间:2012-01-16 07:22:46

标签: android led flashlight

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

使用久经考验的FLASH_MODE_TORCH,我可以满足我的三星Galaxy SII并开启LED闪光灯。在我朋友的Galaxy Nexus上,没有这样的运气。我的另一个朋友的Droid X也没有。

我注意到似乎需要特定的本机IOCTL调用的设备数量并不是很少。这是Galaxy Nexus的情况吗?如何找到编程的参考?

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

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

1 个答案:

答案 0 :(得分:48)

我发现有些设备需要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更新),并且不适用于我的。很棒的回答,蒂莫什!