Galaxy Nexus上可通过哪个API控制LED手电筒?

24

有很多与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个回答

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更新中是如此)是已知的问题(在手机端),并且在我的设备上不起作用。非常好的答案,timosch!


我要试一试。谢谢-- - Malachi
1
是的,它确实做到了,但是我不得不在SurfaceHolder mHolder = preview.getHolder()之后添加mHolder.addCallback(this)。这也可能有所帮助https://dev59.com/J2TWa4cB1Zd3GeqPAzOD - shiraz
如果我想从小部件中打开手电筒,我该怎么做? - Viktor Apoyan
你可以将Activity主题设置为@android:style/Theme.Translucent.NoTitleBar,这样SurfaceView就完全不会显示。 - Muzikant
一个小提示。在打开相机后不需要设置setPreviewDisplay。文档中说 - “重要提示:将完全初始化的SurfaceHolder传递给setPreviewDisplay(SurfaceHolder)。没有表面,相机将无法启动预览。” - w201

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接