1. 程式人生 > >Android Things:來跑一個Demo耍耍

Android Things:來跑一個Demo耍耍

一、Demo執行實踐
這裡我們以官方提供的sample-simplepio專案的blink模組為例,這樣給大家演示一下如何使用Android Studio和樹莓派3開發板,進行Android Things專案的開發;
1.克隆程式碼
[email protected] MINGW64 ~/AndroidThingsSources $ git clone https://github.com/androidthings/sample-simplepio.git
Cloning into 'sample-simplepio'...
remote: Counting objects: 781, done.
remote: Total 781 (delta 0), reused 0 (delta 0), pack-reused 781
Receiving objects: 100% (781/781), 1.85 MiB | 18.00 KiB/s, done.
Resolving deltas: 100% (265/265), done.
Checking connectivity... done.
2.匯入工程
Open an existing Android Studio Project->選擇sample-simplepio專案->OK->按照預設引導匯入專案;

3.工程目錄
sample-simplepio專案執行基本的程式碼練習PIO API, 專案包含3個模組,每個例子是一個可以獨立執行的Android模組。這裡我們僅僅使用blink模組跟大家演示和介紹:

3.硬體準備
在搭建電路之前,我們列舉一下需要的硬體裝置:
  樹莓派3開發板 1塊
  LED燈 1個
  電阻 1個
  麵包板 1塊

廣告時間咯:如果你還沒有自己的開發板和元器件,到我們的“1024工場微店逛逛一逛吧(文章底部二維碼),這裡能一次性有買到你想要的!

4.電路搭建
根據下面的電路設計圖,使用相關的元器件搭建電路如下(注意正極連線BCM6引腳,負極連線Ground引腳 ):


5.連線系統
連線好樹莓派開發板,啟動Android Things系統,並在開發電腦中使用adb connect命令連線到開發板(這樣你就可以在構建執行的時候選擇樹莓派開發板進行安裝了 );
C:\Users\chengxiang.peng.QUNARSERVERS>adb connect 192.168.1.106:5555
connected to 192.168.1.106:5555
C:\Users\chengxiang.peng.QUNARSERVERS>adb devices
List of devices attached
192.168.1.106:5555      device
6.專案概述
該專案實現了使用SeekBar UI控制元件來控制電路中LED等閃爍頻率的功能,主要使用了GPIO API進行如下處理:
  使用PeripheralManagerService來開啟一個連線到GPIO埠的LED連線;
  使用DIRECTION_OUT_INITIALLY_LOW配置埠;
  給setValue()方法傳遞getValue()相反的值來改變LED的狀態;
  使用Handler來執行觸發GPIO的事件,在一段時間後再次觸發;
  當應用程式不在需要GPIO連線的時候,關閉Gpio資源;
原有官方的Demo上我進行相關的修改,使用一個SeekBar來控制LED等的閃爍頻率;
sample-simplepio\blink\build.gradle:
apply plugin: 'com.android.application'                                                       
android {                                                                                     
    ... ...                      
}                                                                                             
dependencies {
    //新增依賴                                                                                
    provided 'com.google.android.things:androidthings:0.1-devpreview'                         
}  
sample-simplepio\blink\src\main\AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.androidthings.simplepio">
    <application android:allowBackup="true" android:icon="@android:drawable/sym_def_app_icon"
        android:label="@string/app_name">
        //新增共享庫
        <uses-library android:name="com.google.android.things"/>
        //新增啟動Activity
        <activity android:name=".BlinkActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            //在系統啟動的時候自動啟動app
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.IOT_LAUNCHER"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
    </application>
</manifest>
BlinkActivity.java:實現SeekbarUI控制介面,並且向Gpio介面引腳傳送指定頻率的訊號;
public class BlinkActivity extends Activity {
    private static final String TAG = BlinkActivity.class.getSimpleName();
    //LED閃爍時間間隔,單位毫秒
    private int interval_between_blinks_ms = 1000;
    
    //控制LED燈閃爍頻率控制元件
    private SeekBar mSeekbar;
    //當前LED等閃爍頻率
    private TextView mSeekbarValue;
    private Handler mHandler = new Handler();
    //Gpio介面物件
    private Gpio mLedGpio;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG, "Starting BlinkActivity");
        setContentView(R.layout.blink_activity);
        mSeekbarValue = (TextView) findViewById(R.id.seekBar_value);
        mSeekbar = (SeekBar) findViewById(R.id.seekBar);
        mSeekbar.setProgress(interval_between_blinks_ms);
        mSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                mSeekbarValue.setText("LED between time:" + i + "ms");
                //通過SeekBar控制元件改變LED等閃爍頻率
                interval_between_blinks_ms = i;
            }
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) { }
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) { }
        });
        
        // 使用指定引腳名稱,PeripheralManagerService來開啟一個連線到GPIO埠的LED連線 
        PeripheralManagerService service = new PeripheralManagerService();
        try {
            String pinName = BoardDefaults.getGPIOForLED();
            mLedGpio = service.openGpio(pinName);
            //設定引腳為輸出訊號
            mLedGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
            Log.i(TAG, "Start blinking LED GPIO pin");
           
            //Post一個Runnable物件,在指定的時間間隔持續的改變GPIO介面的狀態,使得LED等閃爍
            mHandler.post(mBlinkRunnable);
        } catch (IOException e) {
            Log.e(TAG, "Error on PeripheralIO API", e);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //從Handler中移除blink Runnable物件
        mHandler.removeCallbacks(mBlinkRunnable);
        Log.i(TAG, "Closing LED GPIO pin");
        try {
            //頁面銷燬,當應用程式不在需要GPIO連線的時候,關閉Gpio資源
            mLedGpio.close();
        } catch (IOException e) {
            Log.e(TAG, "Error on PeripheralIO API", e);
        } finally {
            mLedGpio = null;
        }
    }
    
    private Runnable mBlinkRunnable = new Runnable() {
        @Override
        public void run() {
            // 如果GPIO引腳已經關閉,則退出Runnable
            if (mLedGpio == null) {
                return;
            }
            try {
                //使用setValue()方法傳遞getValue()相反的值來改變LED的狀態;
                mLedGpio.setValue(!mLedGpio.getValue());
                Log.d(TAG, "State set to " + mLedGpio.getValue());
                mHandler.postDelayed(mBlinkRunnable, interval_between_blinks_ms);
            } catch (IOException e) {
                Log.e(TAG, "Error on PeripheralIO API", e);
            }
        }
    };
}
blink_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">
    <!--控制LED燈閃爍頻率SeekBar控制元件-->
    <SeekBar
        android:id="@+id/seekBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="1000"
        android:progress="1000"/>
    <!--LED等當前閃爍頻率-->
    <TextView
        android:id="@+id/seekBar_value"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:textSize="30dp"/>
</LinearLayout>
7.專案執行
選擇blink模組,點選執行,選擇樹莓派(Iot_rpi3)安裝程式;

注意:如果工程匯入構建的過程中,提示升級Build Tools,則按照Android Studio引導升級即可。Android Things要求:

 SDK Tools為24或者更高版本;
 Android SDK為7.0(API 24)或者更高版本;

8.安裝成功
應用安裝成功後,顯示器上顯示如下;

電路執行效果,如搭建電路上圖。
程式碼庫:
提示1:在安裝其它的專案模組的時候,報錯如下:
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.androidthings.simplepio.PWMActivity" on path: DexPathList[[zip file "/system/framework/com.google.android.things.jar", zip file "/data/app/com.example.androidthings.simplepio-2/base.apk"],nativeLibraryDirectories=[/data/app/com.example.androidthings.simplepio-2/lib/arm, /system/lib, /vendor/lib]]
 at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
 at android.app.Instrumentation.newActivity(Instrumentation.java:1078)
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2538)
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
 at android.app.ActivityThread.-wrap12(ActivityThread.java) 
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
 at android.os.Handler.dispatchMessage(Handler.java:102) 
 at android.os.Looper.loop(Looper.java:154) 
 at android.app.ActivityThread.main(ActivityThread.java:6077) 
 at java.lang.reflect.Method.invoke(Native Method) 
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 
處理1:Android Things系統只允許安裝一個應用,在安裝其它應用之前,應該確保當前系統的應用被解除安裝
C:\Users\chengxiang.peng.QUNARSERVERS>adb uninstall com.example.androidthings.simplepio
Success
3.新技術,新未來!歡迎大家關注“1024工場”微信服務號,時刻關注我們的最新的技術訊息。4.加入“Android Things開發”QQ討論群,一起學習一起Hi。(甭客氣!盡情的掃描或者長按!)

相關推薦

Android Things一個Demo

一、Demo執行實踐這裡我們以官方提供的sample-simplepio專案的blink模組為例,這樣給大家演示一下如何使用Android Studio和樹莓派3開發板,進行Android Things專案的開發;1.克隆程式碼[email protected] M

Android Things擼起袖子建立第一個Things工程

在前面的章節,我們利用官方的sample-simplepio專案的blink模組,給大家演示瞭如何匯入和執行現成的Android Things工程。那麼這個章節,我們來手把手的給大家演示,如何從零開始建立、開發和執行一個Android Things專案。1.前期準備在你開始建

Spark2.3.1中用各種模式官方Demo

ast 使用 進入 -c clas 技術分享 home str strong 1 使用單機local模式提交任務 local模式也就是本地模式,也就是在本地機器上單機執行程序。使用這個模式的話,並不需要啟動Hadoop集群,也不需要啟動Spark集群,

android學習TextView 馬燈的實現

最近無意間看到了涉及到跑馬燈效果的程式碼,於是在網上查閱了很多資料,在這裡對自己看的一些文章進行一下總結,順便加上自己的一些體會。 讓我們一步步逐漸向下。 首先我們要實現走馬燈這樣一個效果,通常來說都是在TextView這個控制元件中來實現的,而且其中的文

Android Things使用者驅動-輸入驅動

一、驅動介紹輸入使用者驅動程式為應用程式提供介面,向Android的輸入管道注入事件。有了這個API,應用程式可以使用Peripheral I/O模擬一個人機介面的裝置(HID)或者連線外部硬體到輸入系統。比如說,我們可以使用開關按鈕GPIO的訊號輸入,通過輸入驅動API模擬

樹莓派Android Things物聯網開發建立一個Things專案

Things apps use the same structure as those designed for phones and tablets. This similarity means you can modify your existing apps to also run on embedde

從零開始學Apollo自動駕駛起來第一個Demo

圍繞著百度開源的Apollo自動駕駛專案展開,重點分析整個專案的框架,核心的計算機視覺感知模組。 下載專案程式碼 專案主頁:https://github.com/ApolloAuto/apollo git clone https://github.com/ApolloAu

webpack-第02節讓你快速上手一個Demo

bpa live data- ati translate 輸入 理解 dex ans 上節課已經安裝好了Webpack到電腦上,這節課就開始一個簡單的Demo,讓你快速上手和熟悉Webpack的基本用法,學習並作完這節課內容你就可以和朋友小吹一下說:我也會Webpack。

Android Things 專題6 完整的栗子運用TensorFlow解析圖像

out 好玩的 mod tex 解答 debug 碼流 寫文件 應用 文| 谷歌開發技術專家 (GDE) 王玉成 (York Wang) 前面絮叨了這麽多,好像還沒

算法用兩個棧實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素為int類型。《劍指offer》

pack 代碼 exception 隊列 imp scrip 入棧 return tro 算法:用兩個棧來實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素為int類型。《劍指offer》 利用棧來進行操作,代碼註釋寫的比較清楚:首先判斷兩個棧是否是空的:

分享知識-快樂自己搭建第一個 Hibernate (Demo

分享圖片 depend 文件夾 super bbb tool ets 數據庫配置 unicode 使用 Hibernate 完成持久化操作 七大 步驟: 1、讀取並解析配置文件及映射文件:   Configuration configuration=new Configur

Swift我的第一個Demo(UILabel和UIButton)

完成的邏輯,按下按鈕從hello變成感謝點選,鬆手還原 檔名:AppDelegate.swift import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var

微服務 使用eclipse 搭建一個簡單的微服務

下載地址:https://download.csdn.net/download/qq_18430613/10642372 1.先看看整體專案的一個架構,parent 專案父依賴包,用於管理我們的依賴,provider 服務提供方,consumer 消費者。 2.建立parent 專案

作業系統,核心定時器使用“訊號”建立一種使用者空間機制測量一個多執行緒程式的執行時間。

      核心是一個作業系統的核心。它負責管理系統的程序、記憶體、裝置驅動程式、檔案和網路系統,決定著系統的效能和穩定性。 定時器是Linux提供的一種定時服務的機制,它在某個特定的時間喚醒某個程序來進行工作。核心在時鐘中斷髮生後檢測各定時器是否到期,在li

分享知識-快樂自己初始 Struts2 (基本概念)及 搭建第一個Demo

表單 控制器 title dtd eth -name 技術 mar 麻煩 1):struts2 的基本概念:   1-1):Struts2 是什麽?     1、Struts2是一個基於MVC設計模式的Web應用框架,它本質上相當於一個servlet,在MVC設計模式中,S

Kubernetes系列之四使用yaml檔案建立deployment部署一個應用程式到k8s叢集

目的 從零開始開發一個超小的應用,將它打包成一個image,利用yaml檔案部署到kube叢集中。 具體的思路是:在開發環境中,打算建立一個node.js應用程式,因為使用它可以讓我的程式足夠簡單,然後使用dockerfile去建立一個docker image,再將它push到doc

.NET Core微服務之路讓我們對上一個Demo通訊進行修改,完成RPC通訊

 最近一段時間有些事情耽擱了更新,抱歉各位了。   上一篇我們簡單的介紹了DotNetty通訊框架,並簡單的介紹了基於DotNetty實現了迴路(Echo)通訊過程。   我們來回憶一下上一個專案的整個流程: 當服務端啟動後,繫結並監聽(READ)設定的埠,比如1889。

一個Demo學完Android中所有的服務

                注:這個例子來自“安卓巴士”,經閱讀,理解,寫此文章說明:這個例子實現了Android中常見的許多服務,下面是實現的截圖接下來,以原始碼的方式分析這個例子1.MainActivity--主介面這個類主要是實現使用者所看到的這個Activity,其中包含了一系列的按鈕,使用者點選

Android 通知欄Notification的整合 全面學習 (一個DEMO讓你完全瞭解它)

在android的應用層中,涉及到很多應用框架,例如:Service框架,Activity管理機制,Broadcast機制,對話方塊框架,標題欄框架,狀態列框架,通知機制,ActionBar框架等等。 下面就來說說經常會使用到通知機制中的通知欄框架(Notificaiton

多執行緒的使用技巧使用匿名內部類實現一個執行緒的建立

/*  * 多執行緒使用的技巧,即使用匿名內部類來建立一個多執行緒  */ public class ThreadDemo { public static void main(String[] args) {new Thread(){public void run() {