经过第一个Android things应用,基本可以确定我们已经建立起一个正确的开发环境,不过很多东西还是陌生的,可能某些方法或者值在另外一种环境下的使用会有新的启发。是时候开始真正的开发入门了,Android things的第二个应用:button点击的监听。(为了防止记混,将之前的module名称由app改为blink,和官方示例代码脑保持一致)。
首先还是在第一个项目里面,创建一个新的module:
当然还是选择Android things模块了:
名字还是和官方示例一致,叫button好了:
老规矩,不要界面:
还是主要在MainActivity里面编辑,首先是定义几个量: private static final String TAG = MainActivity.class.getSimpleName(); Gpio gpio;//通用输入输出
一个日志标记,因为没有界面的,按钮是否被点击是通过log来查看的。另外一个就是之前使用过的Gpio,之前理解为一个led灯,现在可以理解为一个按钮了。
然后是onCreste()方法: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { gpio= PeripheralManager.getInstance().openGpio("BCM21");//打开“BCM21”针脚为该设备 gpio.setDirection(Gpio.DIRECTION_IN);//设置该设备为输入设备 gpio.setEdgeTriggerType(Gpio.EDGE_FALLING);//设置从高到底的转换会触发回调 gpio.registerGpioCallback(gpioCallback);//注册监听回调 } catch (IOException e) { e.printStackTrace(); } }
我们还是用的BCM21这个针脚,可以发现open设备的代码和led灯闪烁的应用一样,之前把gpio当作一个led灯处理,现在又当成了button,如何区分呢?其实无论是led灯还是button,都只有两种状态,亮或暗,点击或者不点击,Gpio就是“设备”,可以是灯或者按钮,但是我们不关心这些,我们只关心这个设备如何传出信号或者获取信号,所以我们要根据具体的设备来设置代码里拿到的这个gpio,这里我们打开BCM21针脚上的设备,设置是输入设备,当状态从高到底转换的时候出发回调,然后为这个设备注册一个回调。一下是回调内容,只打个日志; GpioCallback gpioCallback=new GpioCallback() { @Override public boolean onGpioEdge(Gpio gpio) { Log.i(TAG,"button pressed"); return true; } };
最后还是需要把资源释放了: @Override protected void onDestroy() { super.onDestroy(); try { gpio.unregisterGpioCallback(gpioCallback);//注销回调 gpio.close();//关闭输入输出 } catch (IOException e) { e.printStackTrace(); } }
整个MainActivity的完整代码如下: package wang.buxiang.button; import android.app.Activity; import android.os.Bundle; import android.util.Log; import com.google.android.things.pio.Gpio; import com.google.android.things.pio.GpioCallback; import com.google.android.things.pio.PeripheralManager; import java.io.IOException; public class MainActivity extends Activity { private static final String TAG = MainActivity.class.getSimpleName(); Gpio gpio;//通用输入输出 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { gpio= PeripheralManager.getInstance().openGpio("BCM21");//打开“BCM21”针脚为该设备 gpio.setDirection(Gpio.DIRECTION_IN);//设置该设备为输入设备 gpio.setEdgeTriggerType(Gpio.EDGE_FALLING);//设置从高到底的转换会触发回调 gpio.registerGpioCallback(gpioCallback);//注册监听回调 } catch (IOException e) { e.printStackTrace(); } } GpioCallback gpioCallback=new GpioCallback() { @Override public boolean onGpioEdge(Gpio gpio) { Log.i(TAG,"button pressed"); return true; } }; @Override protected void onDestroy() { super.onDestroy(); try { gpio.unregisterGpioCallback(gpioCallback);//注销回调 gpio.close();//关闭输入输出 } catch (IOException e) { e.printStackTrace(); } } }
同样不要忘记添加权限
到这代码就准备就绪了,接下来是连接硬件了。连接的示意图还是跟上个led灯的类似。
这次就要只关注左边说的按钮,忽略掉上个项目用到的右边led灯了。这里对应的GPIO还是BCM21针脚,树莓派3B的针脚示意图:
BCM21在右下角,连接方便。
连接完毕以后还需要做一件重要的事情,因为Android things只能运行一个应用的,如果我们要运行现在的button程序,就要把上一个程序卸载掉,直接命令行: adb uninstall 上个应用的applicationId
之后,就可以直接运行了。运行以后点击按钮,查看log就可以了;
log如下所示,按钮有明显的按下和松开两个过程,这应该就是 setEdgeTriggerType的原因吧。