剛剛從Chrome要列印一份文件時, 發現一件有趣的事, 在選擇印表機時, 發現我的手機也在清單當中
測了一下果然是如此, 在我的手機上會多了一份pdf, 內容就是由我的電腦列印過去的, 而且是透過Google Cloud Print, 打開Cloud Print的設定, 可以看到Print Jobs的確有我剛列印過去的
via Blogger http://bit.ly/17aurqN
剛剛從Chrome要列印一份文件時, 發現一件有趣的事, 在選擇印表機時, 發現我的手機也在清單當中
{username:"Bob", age: 14, sex: "m"}
解析一個物件, 要從beginObject開始(陣列則是beginArray), endObject結束, 接著透過一個while loop一個個走過這物件內所有的token, 說實在的, 不是很好debug, 你必須要先知道下一個要處理的token是啥類別, 以上面的例子為例, 物件內第一個token是"username", 這是一個JsonToken.NAME, 因此要用nextName來處理, 搞錯了就會出錯, 還不容易知道錯哪, 而上面那例子裡的"else"也是必須的, 拿掉的話, 在endObject就會出錯, 因為這段程式並沒去處理"sex", 因此處理完sex這個名字後, 並未消化掉"m"這個值(JsonToken.STRING), 而是直接endObject, 這會產生一個IllegalStateExceptionreader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("username")) {
username = reader.nextString();
} else if (name.equals("age")) {
followersCount = reader.nextInt();
} else {
reader.skipValue();
}
}
reader.endObject();
我家裡的電腦是Mac mini, OS是Mac OS Lion, 如果照著ADK2012的開發文件想要去設定環境來開發, 一開始就會碰壁了
在文件中寫著, 你可以從"repo init -u https://android.googlesource.com/accessories/manifest“下載原始碼, 或是下載Mac版的ADK 2012 IDE (應該是由Arduino IDE改的)來開始開發
但不管是IDE也好, 還是照著command line的步驟來做, 都會得到無法在找到/dev/ttyUSB0的錯誤(在IDE裡面也根本看不到這個), 剛用估狗大神查了一下, 有人討論, 但也沒有答案, 最後是在ADK2011的文件裡找到解答, 差的就是FTDI USB Driver, 其實照它講的位置也沒找到mac版本的driver, 只有windows版本的driver, mac版本的可以到FTDI chip的官網下載
裝完FTDI driver後, 打開IDE就可以看到USB serial的位置了
在我電腦的例子是/dev/tty.usbserial-AH015SE1接下來如果到"android-accessories/adk2012/board/MakefileBasedBuild"去在重build一次並重燒, 這次會發現, 在做
$> ./flash
這步驟時還是會失敗, 這是因為在這script裡寫死了
UART=/dev/ttyUSB0
所以UART的位置不是這個就會有問題, 因此我改成下列的方式燒
$> android-accessories/ADK2012.app/Contents/Resources/Java/hardware/tools/adk2tool /dev/tty.usbserial-AH015SE1 erase
$> android-accessories/ADK2012.app/Contents/Resources/Java/hardware/tools/bossac –port=tty.usbserial-AH015SE1 -w -b app/bin/test_sam3x_ek_sam3x8-flash.bin
$> android-accessories/ADK2012.app/Contents/Resources/Java/hardware/tools/adk2tool /dev/tty.usbserial-AH015SE1 reset
要照這順序執行, 一開始我不小心erase掉了後, 燒不成功(因為bossac少加了 –port), 整台黑漆漆的不動, 嚇了我一身汗, 以為把它搞掛了… :P
好吧, 可以開始亂改看看了
昨天去了GTUG聽了關於Arduino的分享, 硬體我是大外行, 但這東西還真的是很有趣呀! 其實在Google I/O拿到了免費的ADK 2012, 目前也還沒想到除了高級鬧鐘外, 我要拿它來玩啥, 先來個開箱好了…呃…但其實我老早就把箱子給破了….好吧, 這是個偽開箱
整個東西其實是用磁鐵吸住的, 所以要把這鬧鐘箱打開, 其實很簡單, 打開後分為兩塊版, 上面那塊版據說是Arduino Due, 下面則是一堆Sensor
這一塊就是Due, 後端有SD
前端則有兩個USB加上電源, 它可以由USB供電, 也可以由這個電源供電, USB一個是連接PC用, 一個則是手機
Sensor則是有溫濕度感應, 大氣壓感應, 光感應, 顏色, 加速度, 磁力, proximity sensor等等… (呃, 這樣還是個鬧鐘嗎?)
當然也有NFC:
整個合體的外觀就像這樣:
當然, 這不是普通的Arduino, 這是ADK 2012, Android手機可以透過USB或藍牙與它連結
Android developer網站上有開發簡介: http://developer.android.com/tools/adk/adk2.html
也有一個範例程式, 可以從Play store上下載
不過還沒想到該拿它來做啥, 不過以這形狀, 如果想拿來做個啥機器人之類的, 就有可能會需要把它給拆了吧?
不過如果能做一個這樣的東西, 也不賴呀:
這篇主要來自Google I/O 2012這兩個Sessions:
Making Good Apps Great: More Advanced Topics for Expert Android Developers
Doing More With Less: Being a Good Android Citizen
在這兩堂演講中有提到, 可以利用"PackageManager.setComponentEnabledSetting“把不用的Intent receiver給停用, 這在Android中的確相當有用處, 常常Intent broadcast都是一個造成系統忙碌的主要原因, 在早期的Android版本, 甚至常常碰到因"android.net.conn.CONNECTIVITY_CHANGE"所導致的ANR, 這是因為註冊聽這Intent的receiver常常非常的多(大多網路相關, 而智慧型手機最常見就是網路相關的軟體)
不過這邊要講的並不是這個問題, 不過也可以應用到同樣的技巧
Android中, 可以設定多個Activity去處理同一種的Intent, Share (android.intent.action.SEND)就是最典型的例子, 但這也造成另一種困擾, 註冊的應用程式太多, 導致整個Share menu相當的雜亂難選:
由這個例子看來整個list相當的長, 這對使用者來說可能不好用, 而且問題在於, 有些可能不用一開始就出現, 比如說如果沒有登入任何一個e-mail account, Mail這選項是可以被藏起來的, 這作法就是
ShareActivity 預設成disable:
<activity android:name="ShareActivity” android:enabled=“false”>
這樣如果沒enable它的話, 就不會在Share list出現, 只要我們在某個點(比如說已經完成登入帳號)去enable它, 它就又可以回到這list了:
if(pm.getComponentEnabledSetting(cname) != PackageManager.COMPONENT_ENABLED_STATE_ENABLED ) {
pm.setComponentEnabledSetting(cname, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0);
} else {
pm.setComponentEnabledSetting(cname, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);
}