跳到主要內容

發表文章

目前顯示的是 十一月, 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 8 (Oreo) 上已無法執行,而 Google 也表明為了改善應用程式的安全與穩定,未來將逐步限制這些非正規的存取方式。

如果您有研究過 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.…

有所為有所不為? 談 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