發表文章

目前顯示的是 2011的文章

如何立即結束前一個Toast ?

Toast是一個方便又簡單的工具,可以直接在畫面上顯示簡短的訊息以通知使用者。
最簡單的呼叫方式:
Toast.makeText(this, "Hello Toast!", Toast.LENGTH_SHORT).show();
但這樣會有一個問題,若使用者短時間內連續執行了一堆會產生Toast的操作,Toast會被排在佇列中依序顯示,直到前一個Toast的時間到了之後才顯示下一個Toast,Toast一直被累積的結果就是無法立即反應使用者的操作。

那麼要如何讓新的Toast能立即被顯示呢?
方法如下:
private Toast mToast; private void showToast(String msg) { if (mToast == null) { mToast = Toast.makeText(this, "", Toast.LENGTH_SHORT); } mToast.setText(msg); mToast.show(); }
需要使用Toast時,呼叫showToast()即可,此時若舊的Toast還在,會立刻被更新為新的Toast訊息。

參考資料:
http://stackoverflow.com/questions/5503682/how-to-cancel-toast-created-in-a-different-method-on-android

《App》Xmas Snowflakes LiveWallpaper

圖片
Flying snowflakes to wish you Merry Christmas and Happy New Year!

* This LiveWallpaper is modified form android 4.0 (Ice Cream Sandwich)'s Bubbles LiveWallpaper.
* You can adjust the amount of snowflakes(50~500).
* Supports 25 kinds of snowflake types.

If this app help you out, welcome to download or buy my other software.


飛翔的雪花祝福您聖誕&新年快樂!

* 此動態桌布是以Andr​​oid 4.0 (Ice Cream Sandwich)的Bubbles動態桌布修改而成。
* 你可以調整雪花的數量(50~500)。
* 提供25種雪花類型。

如果這個應用程式對您有幫助,歡迎下載或購買我的其他軟件



《News》慶祝Android App下載達百億,熱門應用限時特價!

圖片
為慶祝Android App下載達百億次,Android Market特別舉辦為期10天的熱門App特價活動,每天會有不同的特價商品,且每支特價App只要0.1美元(約3台幣)。此時不買更待何時? 趕緊點進你Market的特賣專區看看吧! (當然,台灣的朋友想購買必需先動點手腳...)


12/17特價活動正式結束,這次您總共買了多少App呢?

資料來源:
http://android-developers.blogspot.com/2011/12/10-billion-android-market-downloads-and.html

HTC Flyer with Honeycomb 3.2.1

圖片
這台HTC Flyer是2011 Taipei ADL (Android Developer Lab)活動送的贈品。Google辦活動一向很大方,之前送過Phone、Tablet、Chromebook,這次報名當然也很期待,最想要的莫過於近期問世的Galaxy Nexus或ASUS Transform Prime。雖然最後天不從人願,但能免費拿到Flyer也該感恩了。

宣布送這台時也滿有梗的,是在下午Codelab的時段,講師正在示範Honeycomb的開發,但眾所皆知Honeycomb的模擬器實在又慢又不穩,等了很久講師的模擬器還是開不起來,好不容易開起來還跳錯誤,所以講師說用模擬器開發Honeycomb是非常痛苦的,因此備援計畫就是提供每人一台Tablet,此時全場響起熱烈掌聲,工作人員也同時從後方推出好幾車Flyer發放。這下終於可以玩玩看HTC Sense了。





這台Flyer特別之處是userdebug的版本,且搭載Honeycomb 3.2.1及歐洲語系,印象中HTC官方似乎還未放出正式的Honeycomb升級(?)



build.prop相關屬性:
ro.build.display.id=htc_flyer-userdebug 3.2.1 HTK75C eng.root.20111018.232950 test-keys
ro.build.type=userdebug

最後講師們也提到,請不要把這台Flyer當成禮物,要當成工具使用,也期待台灣的開發者能開發更多Tablet App。

補充:
文章寫完沒多久官方似乎就宣佈3G版的3.2 OTA更新開始了
http://www.engadget.com/2011/12/05/ota-honeycomb-update-rolling-out-to-wealthy-htc-flyer-owners/

Android Market 將調整退款期限至48小時?

圖片
開發者最近登入Android Market Developer Console應該會看到下面這個通知:


根據新的開發人員散佈合約:

3.4 特殊退款要求。所有退款事宜均適用「付款處理者」的退款標準條款及細則,但是您在 Market 上發佈「產品」時需優先遵守下列條款。 買家能夠預覽的「產品」(例如鈴聲和桌布):不需亦不允許退款。 買家無法預覽的「產品」(例如應用程式):您授權 Google 退還「產品」定價的全額款項,惟買家需在購買後的 48 小時內提出退款要求。
退款期限由最初的24小時縮減為現在的15分鐘,接下來又要調整成48小時。
說實話我對這已經沒啥感覺了,反正每次調整都會引發消費者與開發者的論戰。而且就算改成48小時,還是離台灣法規要求的7日有很大的差距,終究我們還是買不到付費軟體。

補充:
消息說48小時是誤解,退款窗口依然會維持15分鐘,關於這點如果有確認的消息會再更新。

《News》Android 4.0.1 Source Code Released!

圖片
Android 4.0.1 (Ice Cream Sandwich) Source Code Released!

How to download:
http://source.android.com/source/downloading.html

利用Java Reflection來呼叫被隱藏{@hide}的API

圖片
如果您有研究過Android Source Code,應該會發現其中有許多函式都被標註了@hide。也就是這些函式在SDK中是被隱藏的,一般情形下無法被呼叫使用。但有時我們又想使用這些功能該怎麼辦呢? 在不更動Android System的前提下,我們可以透過Java的反射機制(Java Reflection)來達成。

範例:
我們在Android Source Code中的PackageManager類別裡發現了一個函式getPackageSizeInfo,可以用來取得應用程式的磁碟空間使用量,但在SDK內卻找不到此函式。

我們先試著用getMethods列出PackageManager中所有的函式
PackageManager pm = getPackageManager(); Method[] methods = pm.getClass().getMethods(); for (int i = 0; i < methods.length; i++) { Log.d(TAG, methods[i].getName()); }
看一下結果,沒錯,裡面確實有getPackageSizeInfo這個函式


調用方式:
Method getPackageSizeInfo = pm.getClass().getMethod( "getPackageSizeInfo", String.class, IPackageStatsObserver.class); getPackageSizeInfo.invoke(pm, "xxx.xxx.xxx", new IPackageStatsObserver.Stub() { @Override public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException { Log.d(TAG, "codeSize: " + pStats.codeSize + " dataSize: " + pStats.dataSize + " ca…

有所為有所不為? 談Airpush的侵入式廣告

圖片
您是否有過這種經驗,安裝了某個Android App之後,您手機上方的通知列竟三不五時跳出莫名的廣告?
沒錯! 這有可能是Airpush的傑作,只要開發者在其App中嵌入了Airpush SDK並做些設定後,就可以讓您手機的通知列彈出像這樣的廣告。

寫App畢竟不是慈善事業,能從中獲取實質的收益也是開發動力之一。除了直接推出付費版或走In-app Purchase之外,以免費模式結合廣告也是常見的做法。

但說實在,身為開發者其實也不太希望在自己的App內放廣告,除了佔用畫面,破壞整體感覺外,大部分使用者也討厭廣告。但在付費購買模式還未被廣泛接受或想更快提高下載量的狀況下(更別說還有外力介入,幹掉整個付費Market這種鳥事),免費模式結合廣告就成了一個讓使用者既不用花錢,開發者也能賺取微薄收入的折衷辦法。

那麼Airpush的問題是什麼呢?
以傳統的行動廣告模式來說,廣告大多是呈現在App內的某個區塊(開發者通常會放在最上方或最下方)。也就是只有在App被開啟的時候,使用者才有機會看到廣告。在這種狀況下廣告給使用者感覺是附屬、重要性低的(即便如此,對使用者也是干擾)。

但在通知列跳出廣告我認為是一種中斷行為。當然,中斷行為也有程度之分,最高程度的中斷行為是直接跳出全螢幕視窗或對話框來中斷使用者目前正在做的事,比如來電、鬧鐘響、電量不足...等。而次要程度我認為就是通知列了,比如收到簡訊、磁碟空間不足、軟體下載/安裝...等重要但不需使用者立即處理的事情。Airpush的作法等於提高廣告的重要性來中斷使用者,就像讓你不斷的收到廣告簡訊。

還有一點,在使用者的心目中,通知列通常會被當作是系統的一部份,當通知列三不五時跳出廣告,甚至使用者當下根本沒有在使用那隻掛廣告的App。此時,使用者可能會覺得他的手機被入侵、或中毒了,接下來就是想找出有掛廣告的App並移除。

若利用廣告賺錢是必要之惡,開發者可能得考量何種方式最適合自己的App,以避免錢還沒賺到就先打壞自己名聲。順帶一提,Airpush除了這種主動推送通知的廣告之外,還有AppWall Ads(全畫面廣告)及Icon Ads(在桌面產生一個廣告連結Icon),看來Airpush打算以這種爭議性的廣告模式來衝擊市場。

考量到可能的反彈,Airpush官方也提供了兩個方法給不想看到推送通知廣告的人,一是在手機上另外安裝…

用ColorMatrix將Bitmap轉成灰階(Grayscale)

之前提過從RGB格式計算其灰階明亮度的方法。
在Android中,若想將整張圖片轉成灰階效果其實有更簡便的方式,只要透過ColorMatrix類別的setSaturation函式將飽和度設為0即可。(您也可以試試從0~1之間的值,看看不同飽和度的效果)

詳細方法如下:
//colorBitmap為原始Bitmap,grayBitmap則用來存放處理過後的灰階Bitmap Canvas canvas = new Canvas(grayBitmap); Paint paint = new Paint(); ColorMatrix colorMatrix = new ColorMatrix(); colorMatrix.setSaturation(0); ColorMatrixColorFilter colorMatrixFilter = new ColorMatrixColorFilter(colorMatrix); paint.setColorFilter(colorMatrixFilter); canvas.drawBitmap(colorBitmap, 0, 0, paint);
參考資料:
http://developer.android.com/reference/android/graphics/ColorMatrix.html

《News》Android 4.0 (Ice Cream Sandwich) Announced!

圖片
Android 4.0 (Ice Cream Sandwich) announced, SDK also available for download.

For more detail please refer to:
http://android-developers.blogspot.com/2011/10/android-40-platform-and-updated-sdk.html
http://developer.android.com/sdk/android-4.0-highlights.html

RGB轉灰階公式

想取得RGB格式的灰階明亮度,可以利用RGB轉YUV公式中Y的部份:
Y = R * 0.299 + G * 0.587 + B * 0.114;
參考資料:
http://zh.wikipedia.org/wiki/YUV

Bitmap copyPixelsFromBuffer 顏色不正確?

最近在做圖像處理的功能時發現一個奇怪的現象,當使用copyPixelsFromBuffer直接將ARGB_8888順序的Buffer丟回給Bitmap時,顏色會偏藍。
後來查了一下才發現用copyPixelsFromBuffer丟ARGB_8888資料時,必須將R跟B交換,也就是用ABGR的順序,顏色才會正確。


將ARGB轉ABGR的方法:
pixel = (R << 0) | (G << 8) | (B << 16) | (A << 24); 或
pixel = (pixel & 0xff00ff00) | ((pixel & 0x00ff0000) >> 16) | ((pixel & 0x000000ff) << 16);
註:若使用setPixel或setPixels來設定Bitmap的話,則不需調換。

參考資料:
http://developer.android.com/reference/android/graphics/Bitmap.html#copyPixelsFromBuffer(java.nio.Buffer)
http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/BitmapPixels.html

《App》Image to ColorSketch

圖片
Image to ColorSketch can help you:
1.Convert your images and photos into colored-pencil style.
2.Set processed image as wallpaper or contact icon.
3.Share processed image with your friends.

*You can set the intensity of colored-pencil effect in settings.
*Processing speed depends on the hardware and image size.
*Processed image will be saved in your SD Card/Pictures/ImageToColorSketch directory.


Image to ColorSketch 能幫助您:
1. 將圖像或照片轉換成彩色鉛筆素描風格
2. 將處理過的圖像設為桌布或聯絡人圖示
3. 將處理過的圖像與朋友們分享

*您可以自行設定彩色鉛筆效果的強度
*處理速度依硬體等級與圖像大小而定
*處理過的圖像將被儲存於您SD Card中的Pictures/ImageToColorSketch 目錄.



《App》 EZ App Installer

圖片
EZ App Installer can help you:
1. Install app
2. Uninstall app
3. Backup app (Backup files will be in the root directory of your internal storage.)
4. View app on Play Store

* Long press on the app item to enable multi-select mode.
* Move app to SD card need device and app itself supports.


EZ App安裝器 能幫助您:
1. 安裝應用程式
2. 移除應用程式
3. 備份應用程式 (備份的檔案將位於您內部儲存空間的根目錄)
4. 在Play Store中查看應用程式

* 長按應用程式項目以啟動多選模式
* 將應用程式移動到SD卡需要裝置以及應用程式本身支援