Android 开启闪光灯做手电筒的详解
程序员文章站
2024-02-05 22:55:52
复制代码 代码如下:public class handlightactivity extends activity implements onclicklistener{p...
复制代码 代码如下:
public class handlightactivity extends activity implements onclicklistener{
private togglebutton togglebutton;
private camera m_camera;
@override
protected void oncreate(bundle savedinstancestate) {
// todo auto-generated method stub
super.oncreate(savedinstancestate);
setcontentview(r.layout.handlight);
togglebutton = (togglebutton)this.findviewbyid(r.id.togglebutton1);
togglebutton.setonclicklistener(this);
getwindow().addflags(windowmanager.layoutparams.flag_keep_screen_on);
}
@override
public void onclick(view v) {
togglebutton tb = (togglebutton)v;
if(!tb.ischecked()){
packagemanager pm= this.getpackagemanager();
featureinfo[] features=pm.getsystemavailablefeatures();
for(featureinfo f : features)
{
if(packagemanager.feature_camera_flash.equals(f.name)) //判断设备是否支持闪光灯
{
if ( null == m_camera )
{
m_camera = camera.open();
}
camera.parameters parameters = m_camera.getparameters();
parameters.setflashmode(camera.parameters.flash_mode_torch);
m_camera.setparameters( parameters );
m_camera.startpreview();
togglebutton.setbackgroundcolor(0x30ffffff);
}
}
}else{
if ( m_camera != null )
{
m_camera.stoppreview();
m_camera.release();
m_camera = null;
}
togglebutton.setbackgroundcolor(0xffffffff);
}
}
}
handlight.xml
复制代码 代码如下:
<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<togglebutton android:id="@+id/togglebutton1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:checked="true"
android:text="togglebutton"/>
</linearlayout>
需要加上权限
<uses-permission android:name="android.permission.flashlight"/>
<uses-permission android:name="android.permission.wake_lock"/>
<uses-permission android:name="android.permission.camera"/>
<uses-permission android:name="android.hardware.camera"/>
注意:并不是所有的设备都支持
网上还有一种说法是调用系统隐藏api,不过我试了没反应,可能是系统版本问题,备份一下
用ihardwareservice直接控制
android1.5以前是直接提供这个接口的,之后呢,需要我们自己来做一下。
在你的项目中新建一个包android.os,新建一个ihardwareservice.aidl文件,内容如下:
复制代码 代码如下:
package android.os;
/** {@hide} */
interface ihardwareservice
{
// obsolete flashlight support
boolean getflashlightenabled();
void setflashlightenabled(boolean on);
}
然后在你的程序中引入
复制代码 代码如下:
import android.os.ihardwareservice;
/**
* 设置闪光灯的开启和关闭
* @param isenable
* @author linc
* @date 2012-3-18
*/
private void setflashlightenabled(boolean isenable)
{
try
{
method method = class.forname("android.os.servicemanager").getmethod("getservice", string.class);
ibinder binder = (ibinder) method.invoke(null, new object[] { "hardware" });
ihardwareservice localhardwareservice = ihardwareservice.stub.asinterface(binder);
localhardwareservice.setflashlightenabled(isenable);
}
catch (exception e)
{
e.printstacktrace();
}
}
这样就可以开启闪光灯了。要使用的权限:
复制代码 代码如下:
<uses-permission android:name="android.permission.flashlight" />
<uses-permission android:name="android.permission.hardware_test" />