這篇主要來自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);
        }

尼克大說,對Julian的十大IO問題之一應該是"你是自己花錢去的嗎?“, 今年的確自費出國參加了幾個活動, 本以為今年也無緣IO了, 不過最終還是成行了, 不用繼續怨念, 這都得感謝很多人呀…首先是Tiffanie的幫忙牽線, 以及Elvis的慷慨讓票(老實說他大可以拿去賣黃牛票賺一筆,卻原價轉賣給我), 還有wuman, 不曉得幫我跟他朋友煩過幾次, 後來聽到尼克大也差點幫我弄到票, 實在非常的感動….還得感謝Arthur, 我這次就可以不用自費出去了(還得間接感謝這時候離職的Johnny :P , 還有也有幫我問的mifong), 反正終於不用在台灣枯坐在電腦前熬夜看轉播, 雖然去了美國還是熬著夜被公司這邊要東西(不是有人拿著保障名額出去的?), 好吧….總歸還是很高興….很感謝這麼多的人….

好了, 感謝完了, 進入正題, 猶豫半天, 還是把這篇當半遊記來寫, 反正好像還在Jet lag (呃, 都回來三四天了), 還睡不著, 適合胡言亂語, 寫寫流水帳

這次的Google I/O是第一次一口氣舉辦了三天, 大概越來越熱門了, 才會讓Google這次乾脆延長了一天, 不過票價也提高到了九百鎂, 這大概也已經成為每年developer最大的活動之一了, 老實說, 第一次來的我也有點興奮過頭了, 早上"六點"不到就到了Moscone Center, 本以為我已經夠瘋了, 結果:

DSC03266

好吧, 早來其實沒特別好處,  除了可以早點來吃早餐, 吃完早餐後看到長長一列的排隊人潮就發現, 完全沒佔到便宜, 一堆人排隊等著上樓聽Keynote呀! 我這時候才排, 已經是落後了, 事實上, Keynote開始時, 我還被卡在外面呢….

不過排隊排的後面也不完全差, 不知道怎回事, 我就這麼被擠到這位子:

DSC03293

雖然在邊邊, 但這是前十排的位置呀….中間的位置好像是媒體

不意外的, 今年Android也是一大主題, 這幾年, Android, Chrome似乎就已經佔去Google話題的大半, 當然, Glasses還有跳傘噱頭也是今年的一大亮點, 不過, 畢竟還不算是現實的東西

會場很多比較東西都跟Android比較相關 (機器人比較好做話題吧, 總不會要Chrome拿來當神奇寶貝球):

DSC03323DSC03318DSC03320DSC03317

今年雖然增加了三天, 但Keynote還是維持跟往年一樣就只有兩天, Keynote內容基本上也跟去年差不多, 第一天著重在Android, 第二天著重在Chrome, 只是第一天這次插入了Glasses和G+, 第二天則是加入了Drive, Cloud…有老面孔也有新面孔…

老賈上天堂後, Vic是我覺得現在Keynote講的最好的一個, 條理分明, 速度也控制得宜, 不像Cook的那種拖長長還不知道他表達什麼, 現場聽Keynote的感覺是…. "比較熱鬧”…台上的3D投影也很炫…不過就是少了跟朋友同步聊天的樂趣, 在台灣看還可以同時用Skype, Facebook, Plurk, 現場人多混亂, 認識的朋友也早不知道被擠到哪去了, 上網也很不穩定, Wifi, 3G都不是很OK呀….

大老遠跑去現場跟在家看轉播錄影有啥不同?除了說可以去一些沒有轉播的場次外, 跟外面一堆攤位的互動, 也是在家沒辦法辦到的…. 本來很認真的邊聽Keynote邊排好後面想聽的東西, 不過後來想想就沒照著跑了, 大部分時間同時在多個場次跑來跑去, 還有在外面的攤位逛逛, 主要是覺得, 大老遠跑去, 如果只是去聽那些會有錄影轉播的場次, 其實挺浪費的, 因為那些回去還可以反覆複習, 不用去到裡面打瞌睡, 打游擊, 然後回去再複習錄影, 收穫可能比較多, 而且, 外面還是有些寶可以挖呀

今年跟往年一樣, 也有大放送一堆東西, 首先第一天是Android developer三寶 - Tablet (Nexus 7), Phone (Galaxy Nexus), 和Nexus Q, 第二天則是Chromebox

DSC03347

大老遠跑過去, 雖然不完全是為了這些贈品, 但說不想拿這些就太虛偽了 :P 開箱時忘了拍照片(其實是懶得拍), 所以就不放照片了, 由於今年Android的主題是新版的4.1 (Jelly bean), 因此Tablet和Phone都已經升級到最新, 馬上可以把玩了

除了這些, 還有T-shirts外, 如果跑對門路, 還有別的東西, 比如說我和Wuman跑去ADK這個場次, 賭的就是去年這topic有送ADK, 今年應該也會, 果然這也是有送的場次, 此外第二天Sony在場外(離會場很遠)也舉辦了活動, 有送前五百名參加者Google TV, 結果我們一行人, 冒著冷風排了兩個多小時, 排倒數20名內, 成功的進去讓Sony請喝酒拿Google TV

雖然Google排了三天的內容, 但第三天其實就是垃圾時間了, office hour也都收了, 這天想問問題根本就白跑了(本來想去問問G+ history API的說), 連便當都只剩下盒餐, 只好跟Tiffanie搜刮一下桌上的Jelly bean

555768_3977770399215_694333072_n

 

這次的一些重點內容心得(大略想到的, 以後有機會再補充);

Android Jelly Bean: 實際上的感覺真的是非常的順暢, 感覺下了很多功夫在performance上面呀, 雖然整個Usability還不夠好, 但也有了不錯的進步, 整體流暢度可以幹掉iPhone了, 第一次拿到裝了JB的Galaxy Nexus後, 就有點愛不釋手了, Google Now雖然不像是直接針對Siri來的, 但感覺像是一個以Search為中心整合的一個產品, 不過, 我實際試用, 不覺得它有台上展示的那麼聰明, 我拿著它的建議搭車, 老要我搭下一班, 不過JB真很令人惶恐, 尤其時Android手機製造商呀, 快被Google打成純製造商了吧….

Nexus 7: 拿在手上, 還是擺脫不了廉價感, 不過就199, 能要求啥? 一打開到桌面, 濃濃的Play store味, 很明顯的感覺Google的重點不是放在硬體跟OS, 而是內容, 擺明的就是跟Kindle Fire嗆聲, 不過, 雖然電子書也是它的其中一個重點, 但實際上看, 覺得這螢幕看電子書, 不舒服

Nexus Q: Google進軍客廳的一個"實驗", 為啥說是"實驗"? 因為這東西功能實在不多, 也不特別突出, 就是上Play store下載下來播放, 某種程度上跟Apple TV近似, 但卻又賣超貴(比起Apple TV), 而且, 進客廳, 跟原本Google TV的重疊度太過於高了~~設定程式必須跑在JB的裝置上, 現在JB裝置也就那兩個, 所以到時候它開賣時, 想買它的人搞不好還得同時搬個Nexus 7回家(假如Galaxy Nexus那時候還沒升級)

Google+: 在Keynote提的Event等於就是Facebook Event的升級版了! 看來它是試著去解決Facebook event碰到的問題, party mode是一個不錯的設計, 雖然我之前就有想要做類似的東西了, 至於這次也同樣發表的history api, 一整個看起來就是Facebook open graph的複製品, Google+有在進步, mobile client有做更好, 但其他的, 似乎太跟Facebook走了, 這不見得是好事

Glasses: 目前噱頭大於實際用途的東西, 感覺上現有的功能不多, 從keynote和會場的聊天聽來, 沒多少功能, 拿來Hangout還OK, 預購價格1500還算很貴, 不過預購的人不少, 功能不齊全, 明年才能拿到, 電池續航力都是個疑問

Chrome: 今年的Keynote主要集中在不同裝置間的Sync, keynote上太陽馬戲團用CSS3D, WebRTC做出來的東西還挺不錯的, 會場的攤位則是有展示各種不同以HTML5 API做的東西, 還有以Native client打造的遊戲(如古墓奇兵) , 至於Chromebox…用了之後的感想是, ChromeOS是個爛東西 = =“

其他: Google Drive API應該值得看一下(Drive整個好像Dropbox + evernote + google doc), Mobile Youtube API , 至於GCE, 細節似乎還不太多, 不過以後應該有機會來跟AWS做競爭

以上, 懶得寫了, 該睡了…

最後,

跟著老朋友新朋友, 一起參加這活動, 是意義非凡的一件事呀

DSC03316

Media_httpdistilleryi_mjmyk

Taken at 山頭火 Santouka

Instagram是一個我一直蠻喜歡的service, 主要是簡單, 加上有一些濾鏡可以豐富我隨手拍的照片, 當然, 重要的是, 高價賣給了Facebook而一炮而紅

上星期, 參加了AT&T Palo Alto Hackthon, 拿到大獎的團隊用了一個lib叫 caman.js 的, 這東西讓我有點小小驚艷, 它光用javascript (其實是Coffee script)就實作出了許多影像處理的功能, 這讓我興起想用這個來試著做出類似Instagram的東西, 當然是純用HTML+Javascript

首先面臨的一個問題是, 實作Camera的部份, HTML5支援media capture的方式有三種(請參考Reference 3) : Input tag, device tag, WebRTC (getUserMedia)

但很不幸, 除了Input tag以外, 大部分手機上的browser,如Android browser, Firefox, Chrome, 可以說幾乎全部都不支援, 這可真是有點令人傷心的消息, 因為用Input tag, 會離開browser跳到另一個程式, 這樣就無法結合自己的UI了

不過, 其實也沒那麼絕望, Android上的Opera Mini, 就支援getUserMedia (參考Reference 1)

因此就可以實作出像這樣的東西:

Device-2012-05-10-021018

WebRTC(getUserMedia)的原理是把media stream導到video tag去播放(理應就這樣做), 但這樣出來的比例是camera的比例, Instagram的照片都是方形的, 要實現這點, 其實也不難, 就另外把內容畫到另一個方形canvas, 在video play的時候開始每隔40ms畫一次, 把video畫到canvas的方式也不難, 就把他當image看待就行了

不過當第一次使用時, 瀏覽器會跳出詢問是否允許使用相機的對話窗:

Device-2012-05-10-021029

因為偷懶, 拍照的部份沒沿用原本的canvas, 另起一個Canvas, 並把可用的濾鏡放在下面:

Device-2012-05-10-021056

接下來就是神奇的CamanJS的工作了, CamanJS是一個以CoffeeScript實作出來的影像處理的lib, 還真的蠻厲害的, 害我都有點想研究一下CoffeeScript了

使用方式非常的簡單, 像以下面的程式:

Caman(“path/to/image.jpg”, “#canvas-id”, function () {

    // manipulate image here

    this.brightness(5).render();

});

就可以提高影像的亮度了,

此外還有許多預設的濾鏡, 我也偷懶直接採用, 這就是做出來的效果:

Device-2012-05-10-021122
Device-2012-05-10-020928

Source codes分享於此: https://github.com/julianshen/instagramlikecam

References: 

  1. http://dev.opera.com/articles/view/playing-with-html5-video-and-getusermedia-support/
  2. http://people.opera.com/danield/webapps/instant-camera/
  3. http://www.html5rocks.com/en/tutorials/getusermedia/intro/
  4. http://camanjs.com/

B2G並未一定要開發者把應用程式發表到一個特別的app store, 網站也可以自行加一個install按鍵, 讓使用者把你的網站當應用程式裝到手機內

首先, 你必須要先有個manifest, 目前manifest並沒強制的檔名, 但文件裡建議叫 xxxx.webapp, 以下是範例內容:

{ "name": "MyTestApp", "description": "test app", "launch_path": "/", "icons": { "128": "/img/icon.png" }, "developer": { "name": "Julian Shen" } }

 

然後在網頁內加上檢查是否安裝, 以及安裝的程式碼, 範例如下:

var manifestUrl = 'http://localhost:3000/manifest.webapp'; var app = navigator.mozApps;  function checkInstalled() { var request = app.getSelf(); request.onsuccess = function() { if(request.result) { //installed console.log('installed'); document.getElementById('installmsg').style.display='none'; } else { //not installed console.log('not installed'); } }; }  function install(cb) { var request = app.install(manifestUrl); request.onsuccess = function() { alert('installed'); };  request. function() { alert('Not installed'); } }
這邊要注意的是manifestUrl必須是full path而不是只有相對位置, 寫相對位置, 它還是讀的到, 但會出parse error, 之前害我搞半天一直以為是格式問題, trace了一下Webapps.js, 發現可能是判斷install origin有問題
目前安裝介面很醜:
_2012-05-08_2
安裝完就可以在Home screen看到它的存在了:
_2012-05-08_2