まずはマニュフェストを編集してパーミッションの設定を行う必要があります。
<uses-permission android:name="android.permission.FLASHLIGHT" /><!-- ADD Permission -->
上記のパーミッションを追加することでカメラライトの制御を行うことが出来ます。
次に以下のコードを使ってカメラライトを光らせます。
import java.lang.reflect.Method;
import android.app.Activity;
import android.os.Bundle;
import android.os.IBinder;
public class FlashLightActivity extends Activity {
public void hardwareFlash(Boolean turnon)
{
Object svc = null;
Method setFlashlightEnabled = null;
try {
Class sm = Class.forName("android.os.ServiceManager");
Object hwBinder = sm.getMethod("getService", String.class).invoke(null, "hardware");
Class hwsstub = Class.forName("android.os.IHardwareService$Stub");
Method asInterface = hwsstub.getMethod("asInterface", android.os.IBinder.class);
svc = asInterface.invoke(null, (IBinder) hwBinder);
Class proxy = svc.getClass();
setFlashlightEnabled = proxy.getMethod("setFlashlightEnabled", boolean.class);
}catch (Exception ex){ setFlashlightEnabled = null; }
try {
setFlashlightEnabled.invoke(svc, turnon);
} catch (Exception ex) { }
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
hardwareFlash(true);
}
@Override
protected void onDestroy() {
super.onDestroy();
hardwareFlash(false);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//End of Files
/////////////////////////////////////////////////////////////////////////////////////////////////
上記コードのhardwareFlashがライトのON/OFFを切り替えるメソッドです。
引数にtrueを指定することでライトを光らせ、falseを指定することでライトを消すことが出来ます。
また、以下のようにすることで、別クラスに分けることも出来ます。
import java.lang.reflect.Method;
import android.os.IBinder;
public class DroidLed {
private Object svc = null;
private Method getFlashlightEnabled = null;
private Method setFlashlightEnabled = null;
public DroidLed() throws Exception {
try {
// call ServiceManager.getService("hardware") to get an IBinder for the service.
// this appears to be totally undocumented and not exposed in the SDK whatsoever.
Class sm = Class.forName("android.os.ServiceManager");
Object hwBinder = sm.getMethod("getService", String.class).invoke(null, "hardware");
// get the hardware service stub. this seems to just get us one step closer to the proxy
Class hwsstub = Class.forName("android.os.IHardwareService$Stub");
Method asInterface = hwsstub.getMethod("asInterface", android.os.IBinder.class);
svc = asInterface.invoke(null, (IBinder) hwBinder);
// grab the class (android.os.IHardwareService$Stub$Proxy) so we can reflect on its methods
Class proxy = svc.getClass();
// save methods
getFlashlightEnabled = proxy.getMethod("getFlashlightEnabled");
setFlashlightEnabled = proxy.getMethod("setFlashlightEnabled", boolean.class);
}
catch(Exception e) {
throw new Exception("LED could not be initialized");
}
}
public boolean isEnabled() {
try {
return getFlashlightEnabled.invoke(svc).equals(true);
}
catch(Exception e) {
return false;
}
}
public void enable(boolean tf) {
try {
setFlashlightEnabled.invoke(svc, tf);
}
catch(Exception e) {}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//End of Files
/////////////////////////////////////////////////////////////////////////////////////////////////