AndroidThings(一)控制LED亮灭
AndroidThings(一)控制LED亮灭
版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.****.net/Java_zjj/article/details/79946676
【转载请注明出处:https://blog.****.net/Java_zjj/article/details/79946676】
一、新建一个项目,选择创建一个Android Project,输入你的项目名,next
二、取消勾选Phone and Tablet,我们勾选Android Things(没有Android Things选项请升级你的Android studio),next
三、选择默认就好,next,next,Finish
四、创建好了
五、要用到button,首先我们需要添加依赖,点击build.gradle在dependencies{}添加 implementation 'com.google.android.things.contrib:driver-button:0.6' (其他的都在创建时就添加了),添加后点击Sync Now 同步一下
六、接下来配置我们的标签文件AndroidManifest.xml,添加MANAGE_INPUT_DRIVERS权限
<uses-permission android:name="com.google.android.things.permission.MANAGE_INPUT_DRIVERS" />
七、好了,接下来选择新建一个BoardDefaults.java,这个类的主要功能是返回我们所用开发板的型号对应的GPIO口,直接上代码,还是很简单的
public class BoardDefaults {
private static final String DEVICE_RPI3 = "rpi3";
private static final String DEVICE_IMX6UL_PICO = "imx6ul_pico";
private static final String DEVICE_IMX7D_PICO = "imx7d_pico";
/**
* 根据开发板型号返回连接LED的I/O口
*/
public static String getGPIOForLED() {
switch (Build.DEVICE) {
case DEVICE_RPI3: //树莓派
return "BCM6";
case DEVICE_IMX6UL_PICO:
return "GPIO4_IO22";
case DEVICE_IMX7D_PICO:
return "GPIO2_IO02";
default:
throw new IllegalStateException("未知设备" + Build.DEVICE);
}
}
/**
* 跟据开发板型号返回连接Button的I/O口
*/
public static String getGPIOForButton() {
switch (Build.DEVICE) {
case DEVICE_RPI3: //树莓派
return "BCM21";
case DEVICE_IMX6UL_PICO:
return "GPIO2_IO03";
case DEVICE_IMX7D_PICO:
return "GPIO6_IO14";
default:
throw new IllegalStateException("未知设备" + Build.DEVICE);
}
}
}
八、回到我们的MainActivity,注释还是蛮详细的,onKeyUp()方法监听按键松开,onKeyDown()方法监听按键按下。
有同学可能会问到:为什么要设置 Button.LogicState.PRESSED_WHEN_LOW , mLedGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);有篇博客很好的阐述了这个问题:《Android Things-硬件基础 》https://www.jianshu.com/p/f0df498e91a1
public class MainActivity extends Activity {
private Gpio mLedGpio;
private ButtonInputDriver mButtonInputerDriver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
//使用PeripheralManager列出可用的GPIO端口
PeripheralManager pio = PeripheralManager.getInstance();
try {
mLedGpio = pio.openGpio(BoardDefaults.getGPIOForLED());//获取设备型号的LED的GPIO端口
mLedGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);//设
} catch (IOException e) {
Log.e(String.valueOf(MainActivity.this), "led GPIO口错误", e);
}
try {
mButtonInputerDriver = new ButtonInputDriver(
BoardDefaults.getGPIOForButton(),//获取设备型号的LED的GPIO端口
Button.LogicState.PRESSED_WHEN_LOW,//
KeyEvent.KEYCODE_SPACE);//按键事件,判断按键状态
mButtonInputerDriver.register();//注册button
} catch (IOException e) {
Log.e(String.valueOf(MainActivity.this), "button GPIO口错误", e);
}
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_SPACE){
//关闭LED灯
setLedValue(false);
return true;
}
return super.onKeyUp(keyCode, event);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_SPACE){
//打开LED灯
setLedValue(true);
return true;
}
return super.onKeyDown(keyCode, event);
}
public void setLedValue(boolean ledValue) {
try{
mLedGpio.setValue(ledValue);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected void onStop() {
if (mButtonInputerDriver != null){
mButtonInputerDriver.unregister();
}
try{
mButtonInputerDriver.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
mButtonInputerDriver = null;
}
if (mLedGpio != null){
try {
mLedGpio.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
mLedGpio = null;
}
}
super.onStop();
}
}
九、代码敲好了,开始连线吧,贴上官方连线图
再献下丑。。
十、运行项目,发现报错了,仔细一看是权限的问题。因为AndroidThing暂时不支持动态权限,解决办法是重启一下你的板子emmmm,接线没有错的话,我们按下按钮灯亮,松开灯灭。
刚试着写博客不久,多有不足,也是刚学androidthings,可以加入QQ群:295446315一起交易
我的gayhub:https://github.com/zhu1105132453/AndroidThingsLED