Android Things:來跑一個Demo耍耍
這裡我們以官方提供的sample-simplepio專案的blink模組為例,這樣給大家演示一下如何使用Android Studio和樹莓派3開發板,進行Android Things專案的開發;
1.克隆程式碼
2.匯入工程[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.
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命令連線到開發板(這樣你就可以在構建執行的時候選擇樹莓派開發板進行安裝了 );
6.專案概述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
該專案實現了使用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() {