2012-01-16 75 views
25

Android的这么多LED手电筒API问题。我不敢问另一个,但这里走..Galaxy Nexus上的LED手电可以通过什么API控制?

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

我注意到一个不是微不足道的数量的设备特定的本地IOCTL调用似乎是必需的。这是Galaxy Nexus的情况吗?我如何找到编程的参考?

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

这种看似标准的API毕竟看起来并不那么普遍,令人失望。

回答

44

我发现有些设备需要一个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 /底部掖它在一个角落里。这种方法适用于我的Galaxy Nexus,但它是Droid X的一个已知问题(手机端)(无论如何,.621更新),并且不适用于我的。很好的回答,timosch!

+0

我要给这个镜头。谢谢 - – Malachi 2012-02-24 08:17:26

+0

这个工作吗?对任何人? – 2012-03-02 10:07:48

+0

这是否奏效? – Ivan 2012-03-21 13:44:09

相关问题