第二个Android things应用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zfan93/article/details/80665195

经过第一个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();
        }
    }

}

同样不要忘记添加权限

<uses-permission android:name="com.google.android.things.permission.USE_PERIPHERAL_IO"/>

到这代码就准备就绪了,接下来是连接硬件了。连接的示意图还是跟上个led灯的类似。
这里写图片描述
这次就要只关注左边说的按钮,忽略掉上个项目用到的右边led灯了。这里对应的GPIO还是BCM21针脚,树莓派3B的针脚示意图:
这里写图片描述
BCM21在右下角,连接方便。
连接完毕以后还需要做一件重要的事情,因为Android things只能运行一个应用的,如果我们要运行现在的button程序,就要把上一个程序卸载掉,直接命令行:

adb uninstall 上个应用的applicationId

之后,就可以直接运行了。运行以后点击按钮,查看log就可以了;
这里写图片描述
log如下所示,按钮有明显的按下和松开两个过程,这应该就是 setEdgeTriggerType的原因吧。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/zfan93/article/details/80665195