android+things+入门,第二个Android things应用

本文介绍如何在Androidthings环境下实现按钮点击监听功能。通过定义Gpio并设置其为输入设备,利用BCM21针脚进行信号传输。文章详细展示了如何设置回调函数以响应按钮状态变化,并提供了完整的MainActivity代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经过第一个Android things应用,基本可以确定我们已经建立起一个正确的开发环境,不过很多东西还是陌生的,可能某些方法或者值在另外一种环境下的使用会有新的启发。是时候开始真正的开发入门了,Android things的第二个应用:button点击的监听。(为了防止记混,将之前的module名称由app改为blink,和官方示例代码脑保持一致)。

首先还是在第一个项目里面,创建一个新的module:

1528937913991599.png

当然还是选择Android things模块了:

1528937919629442.png

名字还是和官方示例一致,叫button好了:

1528937924603780.png

老规矩,不要界面:

1528937929387636.png

还是主要在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灯的类似。

1528937936569909.png

这次就要只关注左边说的按钮,忽略掉上个项目用到的右边led灯了。这里对应的GPIO还是BCM21针脚,树莓派3B的针脚示意图:

1528937941426701.png

BCM21在右下角,连接方便。

连接完毕以后还需要做一件重要的事情,因为Android things只能运行一个应用的,如果我们要运行现在的button程序,就要把上一个程序卸载掉,直接命令行: adb uninstall 上个应用的applicationId

之后,就可以直接运行了。运行以后点击按钮,查看log就可以了;

1528937951196083.png

log如下所示,按钮有明显的按下和松开两个过程,这应该就是 setEdgeTriggerType的原因吧。

1528937956483632.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值