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 = (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 service
4     } 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_dev
28         }
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系统框架层奋斗,不断学习,不断努力;从现在起,往垂直方向深度学习。

时间: 2024-08-03 18:36:51

Android三色呼吸灯实现的相关文章

(原创)用Verilog实现一个参数化的呼吸灯(Verilog,CPLD/FPGA)

1.Abstract     观察到一个有趣的现象,每当把Apple笔记本合上的时候,那个白色的呼吸灯就会反复地由暗渐明,然后又由明渐暗,乍一看就像Apple笔记本在打盹休息一样,十分可爱!于是突发奇想,要不用Verilog也写一个吧,资源也不需要太多,一个LED灯就可以了.为了使用方便,可以把它做成参数化的,可以根据时常进行参数调节:深睡.浅睡跟清醒的时候呼吸频率似乎是不一样的-     下面就来分析和实践一下. 2.Content   2.1 理论分析     根据上述描述的现象,仔细分析一

好玩的WPF第二弹:电子表字体显示时间+多彩呼吸灯特效button

我们先来看看Quartz MS字体动态显示系统时间的效果,难度相较于上一篇也要简单很多. 首先是定义一个TextBlock例如以下. <Grid> <TextBlock Name="tBlockTime" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="68" Foreground="Green"/>

【格局视野】三色需求与工作层次

三色需求 人们的社会经济生活本身就是一个互相交换,价值传递的循环,但这个循环有一个核心,这个核心就是社会大众的需求,也可以称为市场需求,围绕这个需求产生了层级递进的需求关系. 第一个层次是蓝色需求 是最基础的社会大众的需求,也可以称为市场需求. 这个需求可以是全体社会大众的,也可以是其中一部分人的需求,或一小部分人的.比如,全体大众都需要粮食和衣服,这就是全体大众的需求:其中一部分人需要运动时穿的衣服,这就是一部分人的需求:女士在怀孕时需要更肥大的合身的衣服,这就是更小一部分人的需求. 但这个需

无法开机 如果您的手机黑屏无法开机,可以按照以下方式操作尝试: 如果是,使用原装充电器或使用弱电流方式充电(例如使用电脑USB接口充电)充电15-30分钟后尝试重新开机;注意:电量过低引起的无法开机,刚插入充电器时可能不亮屏但呼吸灯闪烁状态。

https://www.mi.com/service/support/startup 无法开机 如果您的手机黑屏无法开机,可以按照以下方式操作尝试: 技术支持 如何刷机 无法开机 手机自动关机.重启 无法充电/充电时间过长 无法解锁 手机耗电 屏幕失灵 刷机常见问题 BL锁解锁失败必看 如何备份手机数据 联系客服 无法开机 如果您的手机黑屏无法开机,可以按照以下方式操作尝试: (注:若是长时间卡在白色米字界面且屏幕底部无Android显示,长按电源键10秒重启无效的,建议您前往小米授权维修中心或

算法--三色排序练习题

三色排序练习题 第17节 三色排序练习题 有一个只由0,1,2三种元素构成的整数数组,请使用交换.原地排序而不是使用计数进行排序. 给定一个只含0,1,2的整数数组A及它的大小,请返回排序后的数组.保证数组大小小于等于500. 测试样例: [0,1,1,0,2,2],6 返回:[0,0,1,1,2,2] Java (javac 1.7) 代码自动补全 1 import java.util.*; 2 3 public class ThreeColor { 4 public int[] sortTh

Ui培训之如何设计极简三色图标

小编之前在ui培训课程里面了解到,在ui设计当中,时下图标设计流行的是一种不一样的极简风,这样会更加细腻有趣.配色是设计中永恒的话题,在我看来简易更是设计的精髓. Banana Bird 在刚刚接受ui培训的时候,一般会从单色,或者双色结构来授课,就如上图的banana bird图标,如此简易,但也明确体现图标所表达的内容. KZ 然而,许多设计师都认为三种色彩构成的配色是最平衡也是最漂亮的,多一色显得太花,少一色又过于朴素,这也是为什么许多配色方案的构成多为3种色彩.就如小米的包装设计,都是以

NE555-DIY呼吸灯的电路图

NE555设计的呼吸灯电路图 再提供一个LM358设计的呼吸灯电路图.

[Android]三种广播接收器1

/************ 动态注册 ************/ ActivityMain.java  package home.lee.broadcastreceiver; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.Inten

【三色汉诺塔】

/* 三色汉诺塔 */ #include <stdio.h> void hanoi(int disks, char source, char temp, char target) { if(disks == 1) { printf("move disk from %c to %c \n", source ,target); printf("move disk from %c to %c \n", source ,target); printf("