美文网首页Android知识Android开发部落
通过手机一个按键打开和关闭手电筒

通过手机一个按键打开和关闭手电筒

作者: Exception_Cui | 来源:发表于2016-12-29 17:55 被阅读1829次

    今天接到一个需求
    手机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方法,(界面退出的情况下不能接收)
    所以采用了广播的写法

    尽量不要直接在广播里面打开和关闭。要不你会发现很多的坑

    相关文章

      网友评论

        本文标题:通过手机一个按键打开和关闭手电筒

        本文链接:https://www.haomeiwen.com/subject/hrdpvttx.html