欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 开启闪光灯做手电筒的详解

程序员文章站 2023-12-01 19:48:22
复制代码 代码如下: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" />