發表文章

目前顯示的是 十一月, 2011的文章

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