首页 > 代码库 > Android三色呼吸灯实现

Android三色呼吸灯实现

三色(红绿蓝)呼吸灯,主要控制来电,短息,未接三种情况下不同颜色呼吸灯显示。

具体实现在应用层(Phone,mms)获取呼吸灯服务,调用预留的接口,传递频率和色值;

 1     private void RGBBreathLedsSwitchOn() { 2         IBreathLedsService ledSvc = IBreathLedsService.Stub.asInterface(ServiceManager.getService("breath_leds"));  // 获取呼吸灯服务 3         int time = 2; 4         int reqType = 0x80 | time;  // 频率 5         int ledType = 1;        // 色值 6         try { 7             if(FeatureOption.HEXING_CUSTOM_BREATH_LEDS) {  // 宏控制代码 8                 ledSvc.setLedsBrightness(reqType, ledType); // 调用setLedsBrightness()接口 9                 Log.i(this, "Breathleds SwitchOn, reqType = " + reqType + ", ledType = " + ledType);10             } else {11                 Log.i(this, "Not Support BreathLeds.");12             }13         } catch (Exception e) {14             e.printStackTrace();15         }16     }

在Service端,继承IBreathLedsService.aidl服务通讯,实现setLedsBrightness()接口,调用本地方法,访问JNI;

 1 public class BreathLedsService extends IBreathLedsService.Stub { 2  3     // 亮度等级(32级) 4     private static final int[] BRIGHTNESS_LEVEL = { 5             0,   1,   2,   4,   6,   10,  13,  18, 6             22,  28,  33,  39,  46,  53,  61,  69, 7             78,  86,  96,  106, 116, 126, 138, 149, 8             161, 173, 186, 199, 212, 226, 240, 255, 9     };10 11     public BreathLedsService(Context context) {12         init_native();13     }14 15     public void turnOnLeds() {16         set_brightness_native(0x80);17     }18 19     public void turnOffLeds() {20         set_brightness_native(0x00);21     }22 23     public void setLedsBrightness(int which, int level) {24         //if ((which > 12) || (which < 1))  return;25       26         //level = level % 32;27         int data = http://www.mamicode.com/(which << 8) | level;28         set_brightness_native(data);29     }30 31     private native void init_native();32     private native void set_brightness_native(int data);33 }

注意:需在SystemServer.java中add服务

1     try {2         Slog.i(TAG, "BreathLeds Service");3         ServiceManager.addService("breath_leds", new BreathLedsService(context));  // add service4     } catch (Throwable e) {5         Slog.e(TAG, "Failure starting BreathLeds Service", e);    6     }

在JNI中实现模块的初始化,函数映射和注册本地方法,完成呼吸灯模块的整个流程;

 1 #define LOG_TAG "BreathLedsService" 2  3 #include "jni.h" 4 #include "JNIHelp.h" 5 #include "android_runtime/AndroidRuntime.h" 6  7 #include <hardware/hw_breath_leds.h> 8 #include <hardware/hardware.h> 9 10 namespace android {11 12     struct breath_leds_device_t* leds_dev = NULL;  // hw_breath_leds.h中定义的HAL设备结构体13     14     static void leds_ctl_open(const struct hw_module_t* module, struct breath_leds_device_t** dev)15     {16         // 调用open函数进行一系列初始化工作17         module->methods->open(module, BREATH_LEDS_HW_MODULE_ID, (struct hw_device_t**) dev);18     }19     20     static void init_leds(JNIEnv* env, jobject thiz)21     {22         breath_leds_module_t* leds_module = NULL;23         24         // 通过hw_get_module函数查找HAL模块25         if (hw_get_module(BREATH_LEDS_HW_MODULE_ID, (const hw_module_t**) &leds_module) == 0)26         {27             leds_ctl_open(&(leds_module->breath_module), &leds_dev);   // 装载leds_dev28         }29     }30     31     static void set_brightness_leds(JNIEnv* env, jobject thiz, jint level)32     {33         leds_dev->set_breath_value(leds_dev, level);34     }35     36     // 定义jni函数映射37     static const JNINativeMethod method_tab[] = {38         {"init_native", "()V", (void*) init_leds},39         {"set_brightness_native", "(I)V", (void*) set_brightness_leds},40     };41     42     int register_android_server_BreathLedsService(JNIEnv *env)43     {44         return AndroidRuntime::registerNativeMethods(env, 45                       "com/android/server/BreathLedsService", method_tab, NELEM(method_tab));46     }47 48 }  /*  namespace android  */

 

 

感言:励志向Android系统框架层奋斗,不断学习,不断努力;从现在起,往垂直方向深度学习。

 

Android三色呼吸灯实现