Android MapView – Failed to find provider info

這篇Failed to find provider info for com.google.settings in MapView Example講得很仔細,該說的都說了。
我個人的經驗:

  • 有這個錯誤訊息,未必會看不到地圖。
  • 當apiKey是對的時候,沒有網路,仍然會看不到地圖,會讓人懷疑apiKey有誤。
  • 請務必讓網路暢通,如果公司裡面有proxy,可以試試在命令提示字元去啟動emulator:emulator -avd your_avd -http-proxy your_proxy_server:your_proxy_server_port -debug-proxy,這樣應該就可以了。(這指令是在Android 2.0, 2.0.1 proxy problems撈到的)。

關於網路的部份,還可以參考:

WebView裡$.parseJSON() fail

查了好久。我是先用setWebChromeClient()去處理WebView的onConsoleMessage() callback,將console.log()的輸出導向到Android的LogCat以便於觀察。先懷疑jQuery是不是有問題,就先拿另外一個變數放確定可以的JSON字串丟進去parse,沒問題。那我就懷疑從addJavascriptInterface()那兒來的物件的傳回值了,直接複製傳回結果,放到JavaScript裡當作一個字串,parse的結果,是沒問題的。那?會是型態的問題嗎?用typeof()檢查了一下,發現是object,而非字串,真相大白。我先試著把一個空字串加到傳回值裡,然後就可以得到字串,也就可以正常parse了。再查了一下,JavaScript是有轉換函式的,叫String(),試了一下,也可以把型態是object的傳回值轉為字串。至此,就解決了parseJSON()的問題。

WebView

畫面如果用Android裡的xml,光想,就讓我頭痛。還是用HTML來的方便,而且現在有HTML5,Android也有WebView,再加上之前敗了這本建構Android應用程式,我想這樣應該會方便很多。可是用HTML,就得用JavaScript,也需要從Android程式那邊溝通,就研究了一下。

Using WebViews裡提供的範例,就有講其中的關鍵了,就是使用WebView提供的addJavascriptInterface(),這可以把Java的物件加到JavaScript runtime裡去,這樣JavaScript就可以使用這個物件。可以呼叫之後,那麼資料該怎麼傳遞呢??這牽涉到轉換的問題,而且Android只允許傳遞int、String等一些基礎類別,而不允許使用自訂類別,這就糟了。還好,這篇Working with Android addJavascriptInterface就有討論到這個問題,他的結論是使用JSON字串,這看來是最簡便的方法。JavaScript可以使用jQuery提供的parseJSON()與toJSON()來從字串轉成物件,或從物件轉為字串,而Java則可以用jackson來轉換。Build a Contacts Application With jQuery Mobile & the Android SDK這篇是更完整的使用範例。

Using WebViews裡另外有提到WebView的setWebViewClient,這個其實是WebView的callback,讓你可以在WebView遇到一些特定狀況的時候,作一些處理。詳細的說明要參照WebViewClient這邊。

如果嫌麻煩的話,是參考書裡的PhoneGap就好,書上介紹的步驟就只要寫HTML+CSS+JavaScript就好,不用特別再寫Java的部份,也不用裝eclipse,最後就用ant,就可以build出apk。

電影流水帳(2011/11/9~2011/11/20)

  • Rat Race(IMDB,Wikipedia),中譯:瘋狂世界。這在網樂通上面看的,蠻有趣的片子。就一堆人玩了角子老虎,然後拿到特別的珠子,說有特別的禮物,然後就到樓上去。到了樓上,賭場主人出來宣佈說,現在開始比賽,誰先到Silver鎮,就可以拿到兩百萬美金。一開始大家都用不可置信的心情,以為是騙人的。豈料到了門外,大部份人就開始衝了,有的人不屑一顧,有的人在樓下睡著。不過到了中間的時候,大家都卯起來往Silver鎮前進。中間就發生很多很妙的事情,也交代了為什麼賭場主人要辦這比賽,原來是他們賭到沒什麼可以賭,就亂找花樣來賭,這個比賽就是其中之一。到了最後,大家都趕到小鎮,結果在爭奪的過程裡,鈔票被掛到熱氣球上,開始飄啊飄,飄到了募款晚會會場。一群人從舞台後面衝了進去,大家手上都抓了幾把鈔票。到了台上,主持人跑了出來,陰錯陽差的對話之下,變成了捐款,這群人後來也大器地把錢捐了出去。然後律師看到了賭場主人也出現在舞台邊,就接過麥克風,開始說,我們會來到這裡捐款,都要謝謝這個賭場主人,然後就宣佈,賭場主人會捐出在大會募得金額的兩倍,片子就在賭場主人哭喪臉,眾人歡呼的情況下結束了。
  • 劍雨(IMDB, Wikipedia)。挺不錯的武俠片。片頭的動畫蠻精緻的,我很喜歡,把前因都交代挺清楚的。黑石是個暗殺組織,細雨是裏面頂尖的殺手,殺了張海瑞全家,奪得了羅磨遺體。後來她就帶著遺體逃走,途中遇到陸竹,這場相遇,陸竹死了,而她決定易容隱居。隱居的時候就遇到了阿生,並且被感動,結了婚。可是後來還是被發現了,黑石要脅她,幫忙從崆桐派手中搶回另一半遺體,沒辦法,為了阿生,只好幹了。後來搶到,黑石發生內鬨,細雨不想惹事,就把遺體留下,說今後再沒瓜葛,可是還是被轉輪王打傷。細雨勉勉強強逃了回去,叫阿生快逃,然後就昏了。阿生把細雨扶到床上以後,並沒有逃走,反而開始在地上挖洞。黑石的追兵雷彬跟綻青來了,準備要動手。阿生說,請等我一下,說完把劍拔了出來,開始磨劍。黑石的追兵從劍認出了阿生的真正身份,原來是張海瑞的兒子,他的心臟異位,所以並沒有被細雨殺死,還被神醫給救了,並易了容。黑石追兵在錯愕之下,佔了劣勢,後來雷彬受了重傷,綻青逃走。阿生把細雨帶去神醫那邊,然後跑去約轉輪王出來決戰。細雨沒多久就醒了,也跟著趕去,趕去前,神醫意味深長的說,這真是天意啊。最後就是阿生揭露了自己的身份,細雨知道了以後,很難過,但仍然決意由自己承擔一切,她先故意把阿生給刺傷,並讓他服下龜息散。跟轉輪王的決戰,靠著陸竹之前的指點,血戰之下贏的僥倖,自己也傷得很重。看似死亡但仍聽得到聲音的阿生也知道了一切,醒來以後,意想不到的抱著重傷的細雨離去。整個故事我還蠻喜歡的,特別是阿生跟細雨從相戀到背叛的那幾段,很讓人唏噓啊。看完才發現林熙蕾跟楊紫瓊還蠻像的,然後就是大S跟幻術師的那兩個角色不知道是戲份被抽掉了還是剪接的關係,感覺上挺雞肋的。

學校教材的下載

有些科目的教材好多,用滑鼠可能會按到死。本想用 curl 來硬幹的,可是從登入頁面一路解析到教材下載頁面的時候,發現 ASP.NET 的頁面還真是難搞,後來選擇放棄。

於是想了一下看Firefox有沒有現成的AddOn可用,有,的確是有,那是DownthemAll,可是,教材下載頁面的”下載”是用javascript埋起來,所以必須解析div的onclick屬性,把真正的連結拿出來。這時候GreaseMonkey又再次派上用場,就是你啦!!於是就弄了這個userscript,他會在原來的下載圖形下方增加一個download連結,這樣DownthemAll就可以抓到。要用的話,可以直接到userscripts.org這邊安裝,下面是原始碼:

wordpress以SSH自動更新

考量到以後wordpress的更新問題,可是又不想開FTP的洞,所以研究了一下不使用FTP的方式,大致上就是照這一篇WordPress Automatic Update with SSH來操課即可。第一次更新失敗,在調整 wp-content/plugins 與 wp-content/themes 以後,就解決了。我把這兩個目錄的owner調整為apache:groupname,然後permission調整為0775。

Canon BJC-240+cups+SAMBA+CentOS

Canon BJC-240 以Parallel 轉 USB 接到電腦上,接上以後是在/dev/usb/lp0。

先設置一下跟cups相關的部份,你要先確定自己在sys群組裡,因為cups會需要權限來寫入設定檔。

cups,我是以web介面去安裝印表機,打開瀏覽器,在網址列輸入localhost:631,然後選新增印表機,首先會要求你輸入名稱以及描述,名稱裡不可以有空白。下一步之後,會要你選介面,這時候就選有偵測到的USB介面。接著會要選驅動程式,我試過raw了,不行,我改用了generic postscript。接著會要你選queue的部份,只有一個可以讓你選,就選吧。至此,cups會要你輸入帳號跟密碼,請輸入你的帳號跟密碼即可。

接著是SAMBA。SAMBA的部份比較簡單,打開 /etc/samba/smb.conf,確定 printcap name = /etc/printcap 、 printing = cups,然後將 [printers] 下的 guest ok、writable、public、use client driver 都設為 yes 即可,如果沒看到就自己補上。接著重新啟動SAMBA。

至此,Windows就可以連上,並且去新增印表機了。

p.s. 這邊不多贅述SAMBA的權限控管,就看是用user或share或其他什麼的,總之要有權限可以存取server就是了。

 

wordpress開多站(blog)

好久沒用,印象中有WPMU,上去wordpress看,發現已經被廢棄了,現在只有一套wordpress。

一開始是找到這篇Installing Multiple Blogs,但裏面介紹的方法,第1種是教你把wordpress放到多個目錄,然後用多個資料庫來切,第2種也是把wordpress放到多個目錄,然後以table的prefix來切。不管怎麼樣,這兩種方法都會讓維護變得麻煩。後來是看到這篇Create A Network,這個是3.0以後才有的新功能,正是我要的。

大致描述一下方法,我用的是分目錄的方法,而非分網域的方法:

  1. 先把wordpress裝好。看你是要放在根目錄還是建個wordpress的目錄來放都可以。
  2. 改wp-config.php,找到註解”Happy blogging!”,然後把 define(‘WP_ALLOW_MULTISITE’, true); 放在該行上方。
  3. 重新登入,你可以在管理介面的左邊找到 Tools,裏面多了一個Network Setup,點選,然後填資料,Network Title填你要的名字,Admin E-Mail address填你的e-mail位址,點選Install。
  4. 依照畫面的顯示去修改wp-config.php、在wordpress目錄下建立.htaccess並且在wp-content/下建立blogs.dir目錄。這裡可能會遇到的陷阱,比較常發生的是.htaccess未生效,請檢查httpd.conf,看有無載入mod_rewrite,然後檢查AllowOverride,AllowOverride不能是None,應該填All。我個人是因為眼花,少貼了一行在wp-config.php裡,導致我重來了好幾次。第2塊說要改_SALT的那邊,我都沒改,這邊我要再查一下,看要怎麼產生,再填入。不過看起來對後面沒啥影響。
  5. 登出,再登入,到右上角的下拉選單,就可以發現有Network Admin,選了這個以後,就可以去管理站點了,像是建立新站、刪除站點…等等的。這樣就大功告成了。

Create A Network的後面還有介紹一些plugin,讓你可以每個站點有自己的plugin,不需要透過Administrator來安裝。

電影流水帳(2011/10/8~2011/11/8)

  • Transformers: Dark of the moon(IMDB, Wikipedia),中譯:變形金剛3。故事很簡單,但加入了感情衝突的片段,一個是背叛,一個是嫉妒。背叛,是Autobot的前任領袖,原來很早以前他駕船逃出Cybertronian,是因為已經跟Decepticons談好條件,所以帶著Pillars飛走,可是卻墜落在月球的背面。之後,Decepticons故意讓Optimus Prime知道這個消息,讓他去把Sentinel Prime救回來。想不到Sentinel Prime被救回之後,搶走Pillars,打算把Cybertronian移動到地球,把地球人當作奴隸。第二個背叛則是人類,美國總統跟國會因為Deceptions的威脅,而決議把能幫助地球人的Autobots給遣返。而嫉妒,則是Sam嫉妒他女友的上司,想不到他女友的上司家族已經跟Deceptions狼狽為奸了好幾十年了。在一堆梗都交代以後,那就是開打了。Deceptions先開始打Chicago,打的亂七八糟,這裡我是很納悶,不是說要讓地球人當奴隸嗎?怎麼還亂殺?殺完是有人可以當奴隸嗎??然後Sentinel Prime就用Pillars準備開始傳送了。假裝離去的Optimus Prime回頭跟Sam的人一起殺入Chicago,一陣亂打之後,當然Autobots就贏了,故事結束。
  • 武俠(IMDB, Wikipedia)。我覺得還蠻好看的。劉金喜一開始因為有強盜,被迫出手,但卻以偽裝的方法殺了他們。徐百九來查案,非常懷疑劉金喜,一陣試探之後,雖然金喜自白了一切,但徐百九還是覺得很擔心,後來發現他是七十二地煞的人,唐龍。這一段的試探相當好看,也很搶戲,前面的鋒頭都被他搶走了。於是徐百九回縣城找人來幫忙,好不容易跟前妻借了錢,找到人要去捉金喜,結果卻讓七十二地煞的人找上了劉金喜。惠英紅演的十三娘先出現在金喜的村子裡,大開殺戒,這段真的很莫名其妙的開始,然後莫名其妙地在十三娘掉到河裡結束。徐百九帶著人到了村子,發現村子被打的亂七八糟,村民也逃難去了,而他帶的人,也因為不想淌渾水,而想走避。然後他遇到金喜,他的仁慈之心又出現,決定幫金喜,所以他用針灸幫金喜假死,但只能假死15分鐘。在出村子的時候,遇到了七十二地煞,七十二地煞的領頭確定金喜死了,領著人唱悲歌。唱悲歌唱太久了,徐百九趕緊救人,金喜醒來,發現四周都是七十二地煞的人,他坐起身開始笑,他知道失敗了。然後他趁勢抽了七十二地煞領頭的刀,把自己的手砍斷,說明自己脫離七十二地煞的決心。七十二地煞知道他的決心以後,告訴他,你還有一關,是教主,他在你家裡。於是最後的大魔王出現了,他挾持著金喜的兒子跟妻子,在哈拉一陣以後,教主不肯放他走,說要一人換一人,想把小兒子帶走。金喜為了救妻兒而展開拼博,可是教主非常厲害,一身橫練的金鐘罩,刀槍不入,再加上拳勁驚人,斷了左手的金喜根本沒勝算。最後在徐百九跟老天的幫助下,終於把教主給殺了,可是徐百九也受了嚴重的內傷死去。徐百九看著即將死去的徐百九那一幕,有點像是死神的精準度裡的情節。金喜活了下來,成功地擺脫了唐龍的身份,繼續跟妻兒過著平淡的日子。

ANativeWindow::query = query

在FramebufferNativeWindow.cpp裡看到這樣的用法:ANativeWindow::query = query; 回頭看ANativeWindow的定義,query是一個函式指標,那照理來說應該不能這樣指定,應該要在ANativeWindow實體化以後才可以。好吧,我搞迷糊了。

重新追蹤代碼:

  • query 是一個在 FramebufferNativeWindow 裡的 static function
  • FramebufferNativeWindow其實繼承了ANativeWindow,所以在FramebufferNativeWindow裡使用ANativeWindow::query,就是指定父類別的query。

就這兩點看下來,可以使用ANativeWindow::query=query這點,就不會覺得奇怪了。