今天接到一个需求
手机Fn按键需要进行打开关闭闪光灯
坑爹的是打开关闭是同一个按键
其实并不难
由于今天直接在广播打开关闭手电筒
踩了好多坑,所以记录下来
废话先不多说,上代码
<receiver android:name=".MyflashReceiver" >
<intent-filter>
<action android:name="android.intent.action.FUNC.down" />
</intent-filter>
</receiver>
<service android:name=".MyService"/>
切记,加入权限。
public class MyflashReceiver extends BroadcastReceiver {
SharedPreferences sp;
Editor et;
boolean isOpen;
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.d("MyflashReceiver", "intent=" + action);
if (action.equals("android.intent.action.FUNC.down")) {
sp=context.getSharedPreferences("flash",context.MODE_PRIVATE);
et=sp.edit();
isOpen=sp.getBoolean("isOpen", false);
Intent MyServiceIntent = new Intent(context, MyService.class);
Log.d("MyflashReceiver", "isOpen="+isOpen);
if (isOpen) {
et.putBoolean("isOpen",false);
et.commit();
context.stopService(MyServiceIntent);
} else {
et.putBoolean("isOpen",true);
et.commit();
context.startService(MyServiceIntent);
}
}
}
}
Camera open的时候一定要进行异常处理,
也不要进行重复的open
因为Camera是唯一的,
别的地方Camera打开了
此处就会引起程序崩溃
熟悉生命周期的人会很快理解。
public class MyService extends Service {
Camera camera;
Parameters parameter;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.d("Cuihangchao",">>>>>>>>>>>>>>>>>>>>>>onCreate");
try {
camera = Camera.open();
} catch (Exception e) {
Log.d("Cuihangchao",">>>>>>>>>>>>Exception>>>>>>>>>e"+e);
return;
}
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
Log.d("Cuihangchao",">>>>>>>>>>>>>>>>>>>>>>onStart");
camera.startPreview();
parameter = camera.getParameters();
parameter.setFlashMode(Parameters.FLASH_MODE_TORCH);
camera.setParameters(parameter);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("Cuihangchao",">>>>>>>>>>>>>>>>>>>>>>onDestroy");
if(camera!=null){ //切记不要忘记,其他地方打开了Camera,上面就会异常,导致camera为null ,此处就会崩溃
parameter = camera.getParameters();
parameter.setFlashMode(Parameters.FLASH_MODE_OFF);
camera.setParameters(parameter);
camera.stopPreview();
camera.release();
camera = null;
}
}
}
Fn键最终处理在下层发送了一个广播,也发送了一个Key的值
最初想法是在一个界面实现OnKeyDown方法,(界面退出的情况下不能接收)
所以采用了广播的写法
尽量不要直接在广播里面打开和关闭。要不你会发现很多的坑
网友评论