發表文章

目前顯示的是 2012的文章

Google Play出現[RPC:S-5:AEC-0]錯誤

今天終於等到Android 4.2 OTA更新,不過升級完後開啟Google Play下載App時卻出現下面這個錯誤。

Update for "***" could not be downloaded due to an error.
(Error retrieving information from server. [RPC:S-5:AEC-0])

查了一下,解決步驟如下:
1.到"設定"(Settings)->"帳戶"(ACCOUNTS)->"Google"->選擇你的帳戶->按右上角的Menu選擇"移除帳戶"(Remove account)
2.重開機 Reboot your device.
3.再回到"設定"(Settings)->"帳戶"(ACCOUNTS)->"+ 新增帳戶"(+ Add account)->"Google",然後重新輸入你的帳戶資料即可。

解決NetworkOnMainThreadException的問題

好一陣子沒寫網路相關的程式了,最近有個專案剛好有連線Server的需求。好吧,把以前的程式拿出來用,但發現在Android 2.3的裝置運行正常,在Android 4.0的裝置就會出現NetworkOnMainThreadException這個錯誤。查了一下原來從Android 3.0開始,Thread Policy加強了限制,只要嘗試在主執行緒中進行網路操作,就會產生這個錯誤。

解決方式有幾個:
1.把網路操作從主執行緒中移走,你可以自己再開一個Thread,或使用AsyncTask來執行。

2.在onCreate()中加入下列程式,透過StrictMode重新設定ThreadPolicy。
if (android.os.Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD) { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() // or .detectAll() for all detectable problems .penaltyLog() .build()); }
3.把AndroidManifest中的android:targetSdkVersion設定成"9",也可以暫時解決,但不建議。

最好的方式還是第一種,能避免耗時的網路操作阻礙主執行緒工作,或產生ANR錯誤,我想這也是設計此例外的原因。

《News》慶祝App下載達250億次,Google Play限時特價再度展開!

圖片
還記得2011年底,Android Market為慶祝App下載量突破100億次所舉辦的$0.10特賣會嗎? 不知道那時大家買了多少特價軟體?

而不到一年後的今天,Google宣布App下載量已達到突破倍數成長的250億次。為了慶祝這個里程碑,在接下來的5天除了將提供$0.25的軟體特賣之外,電影、書籍、音樂等也有特價供應,你現在應該能在Google Play中看到相關活動。
當然,拜偉大的政府所賜,台灣的朋友們想買還是得動點手腳囉。



Day1特價軟體:
http://www.androidpolice.com/2012/09/26/here-are-some-of-the-0-25-google-play-25-billion-promotion-apps-so-far-today-92612/
Day2特價軟體:
http://www.androidpolice.com/2012/09/27/here-are-the-0-25-google-play-25-billion-promotions-for-day-2/
Day3特價軟體:
http://www.androidpolice.com/2012/09/28/here-are-the-0-25-apps-and-games-for-day-3-of-the-play-stores-25-billion-downloads-promotion/
Day4特價軟體:
http://www.androidpolice.com/2012/09/29/here-are-the-0-25-apps-and-games-for-day-4-of-the-play-stores-25-billion-downloads-promotion/
Day5特價軟體:
http://www.androidpolice.com/2012/09/30/here-are-the-0-25-apps-and-games-for-the-final-day-of-the-play-stores-25-billion-downloads-promotion-horn-dark-knight-rises-nova-prime-and-more/

參考資料:
http://officialandroid.blogspot.tw/2012/09/googl…

在Android中使用Jaudiotagger的注意事項

在開發AudioTagFixer時,使用了Jaudiotagger這個第三方函式庫。它主要是用來做音樂檔標籤的存取與修改,並且支援多種音樂檔與標籤格式。使用上很簡單,只要把Jaudiotagger的JAR加進你的專案,再參考它的程式範例來操作即可。

不過測試時卻發現一個怪問題,在Android 2.1以下的裝置運作時,取得的標籤前面都會多出��,當然存檔也就有問題。而在2.2以上就一切正常,一開始搞不清楚為什麼,只好暫時把App的minSdkVersion設成8,以避免出錯。

直到最近才發現似乎是某些Android的Bug所導致,而Jaudiotagger則提供了一個設定:
TagOptionSingleton.getInstance().setAndroid(true); 只要加上這行,就能正確的在Android 2.1以下存取音樂檔標籤了。

參考資料:
http://stackoverflow.com/questions/5447145/jaudiotagger-and-android-change-a-value-in-an-mp3
http://www.jthink.com/jaudiotagger/maven/apidocs/org/jaudiotagger/tag/TagOptionSingleton.html#setAndroid(boolean)

LevelListDrawable的使用

在開發Battery Widget時,需要在不同電量狀態下顯示對應的圖檔,比如電量100%時顯示電池全滿的圖,電量50%的時候顯示電池半滿的圖。那時很單純的用一堆 if else 來判斷,然後在裡面分別setImageResource()。當然這樣結果也是OK,但看到程式碼裡一堆判斷式,就覺得有點討厭。最近發現原來Android早就有替類似的需求設計了LevelListDrawable,而且是Since: API Level 1。(我真是太不用功了@@)

用法很簡單,範例如下:
1.首先當然得先準備好不同Level的圖檔。
2.在res/drawable 裡新增一個battery_level.xml 內容如下:
<level-list xmlns:android="http://schemas.android.com/apk/res/android">     <item android:maxLevel="20" android:drawable="@drawable/battery_20" />     <item android:maxLevel="40" android:drawable="@drawable/battery_40" />     <item android:maxLevel="60" android:drawable="@drawable/battery_60" />     <item android:maxLevel="80" android:drawable="@drawable/battery_80" />     <item android:maxLevel="100" android:drawable="@drawable/battery_100" /> </level-list> 可以看出是用<level-list>標籤來包<item>,而每個<item>中分別指定數值範圍及圖檔。
3.在La…

《News》Android 4.1 (Jelly Bean) Announced!

圖片
Android 4.1 (Jelly Bean) announced at Google I/O 2012, SDK also available for download.

For more detail please refer to:
http://android-developers.blogspot.tw/2012/06/introducing-android-41-jelly-bean.html
http://developer.android.com/about/versions/jelly-bean.html

Eclipse plugin - Sequoyah Android Localization Editor

圖片
在 Android 中要支援多國語系是很容易的,只要為不同語系準備好各自的 strings.xml 就可以了,這樣 App 執行時就會自動依裝置目前語系去套用對應的 strings.xml。

但如果支援的語系一多,要維護這麼多 strings.xml 有時也常會手忙腳亂甚至出錯。因此在這邊推薦一個 Eclipse plugin 叫做 Sequoyah Android Localization Editor。( Sequoyah Android 本地化編輯器)

安裝方法如下:
 首先在 Eclipse 中選擇 Help -> Install New Software。 Install 視窗中點選 Add。 於 Add Repository 對話框的 Location 輸入 http://download.eclipse.org/sequoyah/updates/2.0/。Name 則可自己取。接著按 OK。  此時應該會出現可安裝項目的列表。(如果沒有出現項目,請將下面的 Group items by category 取消勾選) 於列表中選擇 "Sequoyah Android 本地化編輯器" 然後按 Next。之後就依畫面指示一步一步安裝完畢。
安裝完後只要開啟任何strings.xml,它就會用一個整合性的編輯表單來取代原本的xml文字編輯器(如下圖):


這樣您就可以快速編輯不同語系的文案了,也可以讓你知道哪些文案還沒被翻譯,或幫您新增/刪除項目。自己用了一陣子下來,真的是很方便,推薦給各位!

《App》AudioTagFixer

圖片
AudioTagFixer can help you:
1. Edit the tags of your audio files, include Title, Artist, Album, Genre and Track.(Modify Album Art is not yet supported.)
2. Fix the incorrect encoded tags in Traditional Chinese(Big5), Simplified Chinese(GBK), Japanese(Shift_JIS), Korean(EUC-KR) and Russian(CP1215) audio files quickly.
3. Support mp3, mp4, ogg, wma and flac formats.(Please note that although this app can modify tags in wma file, but in fact the Android system does not read them, so you may not be able to see the changes in your music player.)

* This app can help you correct garbled, but NOT translate into different languages or conversion of Traditional Chinese and Simplified Chinese.
* After you saved the audio file, the list will re-sort according to the new tags. Therefore, the order of the audio file in the list may be changed.
* If you need more encoding support, please e-mail to me, thank you.


AudioTagFixer 能幫助您:
1. 編輯音樂檔案中的標籤,包含標題、歌手、專輯、類型以及曲目。(修改專輯封面尚未支援。)
2. 快速修正在繁體中文(Big5)、簡體…

利用TouchDelegate設定元件的觸控區域

開始前請先看看這篇文章~

您是否有同樣的經驗,想點擊Listview item中的Checkbox時,卻常常意外點到整個item,而造成預期外的動作? 嚴格來說這好像也不能怪開發者,誰叫預設的Checkbox就是那麼小,更不可能怪使用者說你手指怎麼那麼肥...。

但若想保有優良的使用者體驗,這個小細節是可以被解決的。處理的方法有很多種,比如放大Checkbox本身的Drawable或從Layout下手...但由於這樣做可能擠壓到其他的元件,再加上Checkbox本身的缺限,讓過程也有些麻煩。

因此我們可以考慮另一個方法,使用TouchDelegate來增加元件的觸控響應區域。

程式範例:
final View parent = (View) delegate.getParent(); //delegate是想擴大觸控範圍的元件 parent.post( new Runnable() { public void run() { final Rect r = new Rect(); delegate.getHitRect(r); r.top -= 10; //觸控範圍往上增加 r.bottom += 10; //觸控範圍往下增加 r.left -= 10; //觸控範圍往左增加 r.right += 10; //觸控範圍往右增加 parent.setTouchDelegate( new TouchDelegate( r , delegate)); } }); 簡單來看就是透過父容器setTouchDelegate,以調整觸控響應區域。這樣就不必動到元件本身或Layout,一來讓元件維持小巧精美,二來又有足夠的響應區域。

參考連結:
http://developer.android.com/reference/android/view/TouchDelegate.html
http://www.daggie.be/?p=1006
http://android.cyrilmottier.com/?p=574

如何檢測裝置是否有Camera?

在做影像處理的應用時,可能會需要用到裝置內的 Camera 來截取影像。而 Android 裝置百百種,不一定每台都有相機,因此如何在沒有相機的裝置上避免程式發生錯誤就是必須考量的。

第一種狀況是當你的應用會上架至 Google Play 商店時,請用 AndroidManifest.xml 中的 <uses-feature> 與 <uses-permission> 標籤宣告會使用 Camera 功能及相關權限:
例如:
<uses-feature android:name="android.hardware.camera" /> <uses-permission android:name="android.permission.CAMERA"/>
這樣你的應用程式就不會出現在無 Camera 裝置的 Google Play 商店中,使用者無法下載,自然也就避免了發生錯誤的可能。

第二種狀況是使用者可能從第三方市集或透過其他途徑取得軟體,那就不一定都有完善的篩選機制了,因此你可能必須在程式內部做判斷處理,以避免Crash。

第三種狀況是 Camera 並非你應用中的主要功能,即使裝置沒有 Camera,還是可以使用其他功能,但使用者介面可能必需做一些調整,比如隱藏呼叫 Camera 的按鍵或是在使用者試圖使用 Camera 相關功能時跳出提示訊息。

而針對狀況二與狀況三,可用的判斷方法如下:
PackageManager packageManager = context.getPackageManager(); if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)) { Log.i("camera", "This device has camera!"); } else { Log.i("camera", "This device has no camera!"); } 簡單說就是利用 PackageManager 檢查裝置是否有 Camera 功能,注意PackageManager.FEATURE_…

ADT 17之後使用第三方函式庫會產生NoClassDefFoundError的解法

圖片
這幾天在為之前開發的 App 改版,修改完後在裝置上測試時,咦? 怎麼一啟動就出現錯誤? 看了一下 Log 是 AdMob 函式庫裡的 AdView 出現 NoClassDefFoundError 錯誤...怪了,我根本沒動到 AdMob 相關的程式碼啊?

查了一下發現原來是 ADT 17 有修改函式庫引用方式,解法有以下兩種:
方法1: 在專案目錄下建一個 libs 資料夾,然後將你用到的第三方函式庫 (.jar) 放在裡面
方法2: 在專案 Properties -> Java Build Path -> Order and Export 裡勾選你用到的第三方函式庫


重新編譯、執行,OK了~
這個錯誤比較機車的是在編譯時期不會出錯,到執行時才死給你看。只能說 ADT 你好樣的!

參考連結:
http://android.foxykeep.com/dev/how-to-fix-the-classdefnotfounderror-with-adt-17
http://tools.android.com/recent/dealingwithdependenciesinandroidprojects

LiquidNext無法於DDMS中檢視File Explorer的解法

圖片
今天終於把手上的 Acer Liquid E 刷成 LiquidNext 1.9.2 (Android 2.3) 了,話說 Liquid 能一路從 1.6 升到 2.3 也真算是物盡其用。刷完整體感覺還不錯,沒啥大問題,不過當打開 Eclipse 的 DDMS 時就發現 File Explorer 空空如也,這在開發App時多少會造成點困擾。由於 LiquidNext 是基於 CM7 的 rom,就查查 CM 的 Forum 看有沒有相關的解法。

順利找到辦法並記錄如下:
1. 先開個模擬器,然後將 /system/bin 中的 toolbox 抽出來
2. 將 Liquid 接上電腦,執行adb remount
3. adb push c:\toolbox /system/bin (c:\ 是你剛抽出來的 toolbox 所放置的路徑 ,請自行修改)
4. adb shell
5. cd /system/bin
6. chmod +x toolbox
7. ln -s toolbox ls
8. exit
9. 重新啟動裝置

再看看DDMS,目錄結構出現了。打完收工~


參考連結:
http://forum.cyanogenmod.com/topic/30765-solved-ls-command-for-eclipse-file-explorer/

BlackBerry PlayBook 超冷門開箱

圖片
BlackBerry 黑莓手機據說在國外還滿受商務人士歡迎的,國內也有電信商引進,但好像就沒那麼風行。而這台 PlayBook 是 BlackBerry 跨足平板的第一號產品,台灣目前沒有正式上市(不過Y拍買得到)。生在這個平板戰國時代,面對其他陣營的夾擊,BlackBerry 似乎也沒能有好的表現。但相較於 HP 果斷放棄 TouchPad,BlackBerry 似乎還想再努力一下。

至於為何會入手這台呢? 雖然它也是一路降價,但還是引不起我的興趣,不過當 BlackBerry Tablet OS 2.0 宣布支援 Android App 後,事情就變得有趣了些。雖然說支援,API卻也不是100%能用,另外開發者還是必須花點時間重新包裝、簽章並上架至BlackBerry App World才行。當 2.0 升級在即,卻僅有少量的開發者願意為其轉換 Android App,這可不是個好消息。因此在2月初,BlackBerry 宣布了 Free BlackBerry PlayBook Offer,只要在限定期間內上架軟體並經審核通過,就能免費得到一台 PlayBook。反正原本就有在開發 Android App 了,就來轉轉看吧,不拿白不拿。

不過要拿這台 PlayBook 也不是一路順遂的,中間來來回回快兩個月,尤其App審核&回覆信件時間真是有夠慢,APK轉換工具與上架流程也不是挺好用,真是搞得我很煩ㄚ。以下是處理時間表:

2/6 申請開發者資格
2/8 開發者資格通過 並 提交App審核
2/21 App審核失敗 並 發信給客服詢問
3/1 收到客服回覆
3/2 重新提交App審核
3/12 App審核通過
3/14 填寫送貨地址
3/23 PlayBook 寄出
3/26 提交報關資料給FedEx
3/27 收到 PlayBook


抱怨了一堆,不過看在免費的份上就算了,來開箱吧~














AIDE - 在Android裝置上寫Android App

圖片
你沒看錯! 在Android裝置上也能寫Android App!

自從用了6年的NB掛點之後,手邊一直缺少一個行動開發裝置,雖然目前大部分時間都還是使用桌機開發,但偶有外出需求時就很麻煩,也因此一直在猶豫要不要買台MBA或MBP。

但現在,AIDE讓我也能在Android裝置上開發Android App了。不過可以想見,在純手機或純平板上寫程式應該是一個痛苦的體驗。還好手邊有台Asus Transformer,只要接上鍵盤就能跟使用NB開發的感覺接近了。


AIDE下載頁面
https://play.google.com/store/apps/details?id=com.aide.ui

AIDE檔案小、免費、安裝後立刻能使用。而且相容Eclipse的專案檔,只要把程式目錄整個搬到Android裝置上再用AIDE開啟就行了,只能說太神了!

使用畫面:

上半部為程式碼編輯區,下半部可切換為Logcat或檔案目錄結構等等。當然也可以把下半部隱藏,讓程式碼全畫面編輯
寫好程式可以直接編譯執行 
 問你是否要安裝剛寫好的App
安裝完畢,成功執行
當然,若期望目前AIDE能完全取代Eclipse絕對還是有差距,不過其基本功能已經具備,可以作為一個輕量或臨時的開發環境。也非常期待其後續發展,讓Android App開發更為直覺、方便。

補充:
AIDE Team訪談 http://www.infoq.com/news/2012/03/AIDE

《App》EZ Folder Player

圖片
Prefer using folder to manage your music files?
Always hard to find the song you want to play in stock music player?

This app is for you!
EZ Folder Player is an alternative music player based on folder structure.

Features:
* Simple and easy to use.
* Supports Shuffle / Repeat one / Repeat All.
* Provides 4x1 and 4x2 widgets.
* Support sleep timer.
* Color theme select option.
* Support 3rd party Equalizer.
* Support notification control.
* Support lock screen control. (On android 5.0 and above, you need to change your "Sound & Notification" -> "When device is locked" setting to "Show all notification content" or "Hide sensitive notification content".)
* Ad-supported, you can purchase an in-app feature to remove ads.

How to use:
* Browse to your music folder and choose which music file you want to start playing.
* You can play all the music within a folder and it's subfolders by clicking the folder icon.
* You can select multiple fold…