AndroidThings(一)控制LED亮灭

AndroidThings(一)控制LED亮灭

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

【转载请注明出处:https://blog.csdn.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


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Android通过App来控制开发板上LED灯的亮灭需要使用Android开发板上的GPIO接口。具体步骤如下: 1. 在Android App中添加权限: 在AndroidManifest.xml文件中添加以下权限: ```xml <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.DELETE_PACKAGES" /> <uses-permission android:name="android.permission.RESTART_PACKAGES" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.SET_WALLPAPER" /> <uses-permission android:name="android.permission.SET_WALLPAPER_HINTS" /> <uses-permission android:name="android.permission.SET_TIME_ZONE" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> <uses-permission android:name="android.permission.READ_CALL_LOG" /> <uses-permission android:name="android.permission.WRITE_CALL_LOG" /> <uses-permission android:name="android.permission.RECORD_VIDEO" /> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.WRITE_SMS" /> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.RECEIVE_MMS" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" /> <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" /> <uses-permission android:name="android.permission.READ_PROFILE" /> <uses-permission android:name="android.permission.WRITE_PROFILE" /> <uses-permission android:name="android.permission.READ_SOCIAL_STREAM" /> <uses-permission android:name="android.permission.READ_USER_DICTIONARY" /> <uses-permission android:name="android.permission.WRITE_USER_DICTIONARY" /> <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" /> <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" /> <uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER_ADVANCED" /> <uses-permission android:name="android.permission.ACCESS_CACHE_FILESYSTEM" /> <uses-permission android:name="android.permission.ACCESS_ALL_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_MTP" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_MEDIA_STORAGE" /> <uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" /> ``` 2. 在App中创建GPIO控制类: 创建一个名为GPIOControl的Java类,用于控制GPIO口的开关。代码如下: ```java import java.io.File; import java.io.FileWriter; import java.io.IOException; public class GPIOControl { private static final String GPIO_ROOT_PATH = "/sys/class/gpio/"; private static final String GPIO_EXPORT_PATH = GPIO_ROOT_PATH + "export"; private static final String GPIO_UNEXPORT_PATH = GPIO_ROOT_PATH + "unexport"; private String mGpioPath; public GPIOControl(int gpio_num) { mGpioPath = GPIO_ROOT_PATH + "gpio" + gpio_num + "/"; } public boolean open() { File gpioFile = new File(GPIO_EXPORT_PATH); if (!gpioFile.exists()) { return false; } try { FileWriter exportFile = new FileWriter(gpioFile); exportFile.write(Integer.toString(getGpioNum(mGpioPath))); exportFile.flush(); exportFile.close(); } catch (IOException e) { e.printStackTrace(); return false; } return true; } public boolean close() { File gpioFile = new File(GPIO_UNEXPORT_PATH); if (!gpioFile.exists()) { return false; } try { FileWriter unexportFile = new FileWriter(gpioFile); unexportFile.write(Integer.toString(getGpioNum(mGpioPath))); unexportFile.flush(); unexportFile.close(); } catch (IOException e) { e.printStackTrace(); return false; } return true; } public boolean setDirection(String direction) { File directionFile = new File(mGpioPath + "direction"); if (!directionFile.exists()) { return false; } try { FileWriter directionWriter = new FileWriter(directionFile); directionWriter.write(direction); directionWriter.flush(); directionWriter.close(); } catch (IOException e) { e.printStackTrace(); return false; } return true; } public boolean setValue(int value) { File valueFile = new File(mGpioPath + "value"); if (!valueFile.exists()) { return false; } try { FileWriter valueWriter = new FileWriter(valueFile); valueWriter.write(Integer.toString(value)); valueWriter.flush(); valueWriter.close(); } catch (IOException e) { e.printStackTrace(); return false; } return true; } private int getGpioNum(String gpio_path) { int start = gpio_path.indexOf("gpio"); int end = gpio_path.indexOf("/", start); String gpio_num_str = gpio_path.substring(start + 4, end); return Integer.parseInt(gpio_num_str); } } ``` 3. 在App中调用控制类: 在App的主Activity中调用GPIOControl类,控制LED灯的亮灭。代码如下: ```java public class MainActivity extends AppCompatActivity { GPIOControl gpioControl; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); gpioControl = new GPIOControl(23); gpioControl.open(); gpioControl.setDirection("out"); } @Override protected void onDestroy() { gpioControl.close(); super.onDestroy(); } public void turnOn(View view) { gpioControl.setValue(1); } public void turnOff(View view) { gpioControl.setValue(0); } } ``` 在App的布局文件中添加两个按钮,分别用于控制LED灯的开和关: ```xml <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center"> <Button android:id="@+id/button_turn_on" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Turn On" android:onClick="turnOn"/> <Button android:id="@+id/button_turn_off" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Turn Off" android:onClick="turnOff"/> </LinearLayout> ``` 以上就是使用Android App控制开发板上LED灯的亮灭的具体步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值