跳到主要內容

發表文章

目前顯示的是 2011的文章

如何立即結束前一個 Toast ?

Toast 是一個方便又簡單的工具,可以直接在畫面上顯示簡短的訊息以通知使用者。
最簡單的呼叫方式:
Toast.makeText(this, "Hello Toast!", Toast.LENGTH_SHORT).show();
但這樣會有一個問題,若使用者短時間內連續執行了一堆會產生 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 只要 0.1 美元。此時不買更待何時? 趕緊點進你的 Android 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 辦活動一向很大方,之前送過手機、平板、Chromebook,這次報名當然也很期待,最想要的莫過於近期問世的 Galaxy Nexus 或 ASUS Transform Prime。雖然最後天不從人願,但能拿到免費的 Flyer 也該感恩了。

宣布送這台時也滿有梗的,是在下午 Codelab 的時段,講師正在示範 Honeycomb 的開發,但眾所皆知 Android 的模擬器實在又慢又不穩,等了很久講師的模擬器還是開不起來,好不容易開起來還跳錯誤,所以講師說用模擬器開發是非常痛苦的,因此備援計畫就是提供每人一台平板,此時全場響起熱烈掌聲,工作人員也同時從後方推出好幾車 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: " + pSt…

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

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

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

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

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

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

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

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

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

用 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

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卡需要裝置以及應用程式本身支援