初次写应用程序

     现在有一个需求,在mt8735开发板上点亮指示灯,方便用户在无屏幕的情况下使用开发板的时候,能够了解开发板是否在正常工作。
      
      一、工具:
      使用的工具是Android Studio2.2,安装参考教程:Android Studio 2.2 安装教程
      使用 Android Studio 新建项目的教程:使用 Android Studio 新建项目参考教程

      二、具体实施:
      开发板上有一个三色灯,可以显示红绿蓝三种颜色,现在是用于充电指示,充电时显示红色,充满电显示绿色。那么还有一个蓝色的灯,就可以用于系统运行指示。 因此,这个应用程序要实现的功能是,1. 系统启动之后,蓝色指示灯亮,表明系统在运行;2. 不干扰充电和充满电的指示灯的显示。这个APP需要有的逻辑的是,1. 接收开机广播,控制蓝色指示灯显示;2. 检测USB是否连上,USB连接时充电状态如何(充电/充满)。
      我们可以在开发板连接电脑时,用 adb 控制灯的亮与不亮,具体操作如下:
      $ adb shell "echo 0 > /sys/class/leds/green/brightness"  // 绿色灯灭
      $ adb shell "echo 1 > /sys/class/leds/green/brightness"  // 绿色灯亮
      那么,在写应用程序的时候,我调用了一个 ShellUtils.java 代码(未上传),进行类似 adb 操作。                    

      关键部分测试代码如下:
  1. public class LedCtrlReceive extends BroadcastReceiver {

  2.     private Handler handler=new Handler();

  3. // adb 操作
  4.     private String cmdB = "echo 1 > /sys/class/leds/blue/brightness";
  5.     private String cmdb = "echo 0 > /sys/class/leds/blue/brightness";
  6.     private String cmdR = "echo 1 > /sys/class/leds/red/brightness";
  7.     private String cmdr = "echo 0 > /sys/class/leds/red/brightness";
  8.     private String cmdG = "echo 1 > /sys/class/leds/green/brightness";
  9.     private String cmdg = "echo 0 > /sys/class/leds/green/brightness";

  10.     private Context context;

  11.     @Override
  12.     public void onReceive(Context context, Intent intent) {

  13.         this.context = context;

  14.         String action = intent.getAction();

  15. // 显示蓝灯
  16.         ShellUtils.execCommand(cmdb, true);
  17.         ShellUtils.execCommand(cmdB, true);

  18.         if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
  19.             /*ShellUtils.execCommand(cmd,true);
  20.             handler.postDelayed(runnable, 10000);
  21.             ShellUtils.execCommand(cmdb, true);
  22.             ShellUtils.execCommand(cmdB, true);*/
  23.             Log.d("yjx","Boot_receive");
  24.             try {
  25.                 Thread.sleep(5000);
  26.                 Log.d("yjx","sleep");
  27.             } catch (InterruptedException e) {
  28.                 e.printStackTrace();
  29.             }
  30.             new Thread(runnable).start();
  31.             //handler.postDelayed(runnable, 5000);
  32.         }

  33.         Log.d("yjx","runnable_start");
  34.     }

  35.     private Runnable runnable = new Runnable() {
  36.         @Override
  37.         public void run() {
  38.             /*ShellUtils.execCommand(cmdR,true);
  39.             context.registerReceiver(mbatteryReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));*/
  40.             IntentFilter intentFilter = new IntentFilter();
  41.             intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
  42.             intentFilter.addAction("android.hardware.usb.action.USB_STATE");
  43.             context.registerReceiver(mbatteryReceiver, intentFilter);
  44.             Log.d("yjx","runnable");
  45.         }
  46.     };

  47. private BroadcastReceiver mbatteryReceiver=new BroadcastReceiver()
  48.     {
  49.         public void onReceive(Context context, Intent intent)
  50.         {
  51.             String action =intent.getAction();
  52.             if(Intent.ACTION_BATTERY_CHANGED.equals(action)) {
  53.                 int status=intent.getIntExtra("status", BatteryManager.BATTERY_STATUS_UNKNOWN);
  54.                 if(status== BatteryManager.BATTERY_STATUS_CHARGING){
  55.                     ShellUtils.execCommand(cmdr,true);
  56.                     ShellUtils.execCommand(cmdR,true);
  57.                     int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);//电量最大值
  58.                     int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);//电量百分比
  59.                     float batteryPct = level / (float)scale;
  60.                     if (batteryPct > 0.95){
  61.                         ShellUtils.execCommand(cmdg,true);
  62.                         ShellUtils.execCommand(cmdG,true);
  63.                     }
  64.                     Log.d("yjx",batteryPct+"");
  65.                 }
  66.             }
  67.             if ("android.hardware.usb.action.USB_STATE".equals(action)){
  68.                 boolean connect = intent.getExtras().getBoolean("connected");
  69.                 if (connect){
  70.                     Log.d("yjx","USB IN");
  71.                 } else {
  72.                     ShellUtils.execCommand(cmdb, true);
  73.                     ShellUtils.execCommand(cmdB, true);
  74.                     Log.d("yjx","USB OUT");
  75.                 }
  76.             }
  77.         }
  78.     };
  79. }
      
      三、存在问题:
      目前在MainActivity.java测试成功,还未完全实现作为系统程序,还存在不能够检测到USB是否插入的问题,这个问题会影响充电的指示灯的显示。1. 开机能够显示蓝灯,但是插入USB,不显示充电状态(充电/充满)指示灯;2. 重新拔插USB,充电指示灯正常显示;3. 拔出USB,工作指示灯(蓝灯),不显示。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值