tag:blogger.com,1999:blog-34025397039934795342024-02-19T17:33:54.897+08:00ysl 的程式天堂 - Android 應用開發 ‧ 研究 ‧ 與諮詢寫程式是自己二十多年來的興趣。因為,程式讓我在我的想像天堂裡,盡情創造。擅長的領域有: Android 應用程式開發與訓練, 大型應用軟體開發, C/C++/Java, Android/Palm/Aibo, Windows/MFC/Qt, Perl/Tcl/PHP/JavaScript, MySqlUnknownnoreply@blogger.comBlogger140125tag:blogger.com,1999:blog-3402539703993479534.post-83551201487403307632016-04-18T20:52:00.001+08:002016-04-18T20:53:59.268+08:00當防毒軟體說你的 app 有病毒時<p>當 app 開發者真的很辛苦,app store 會用下架來嚇你,廣告平台會用倒閉來陰你,連防毒軟體都會說你的 app 有病毒來搞你。</p>
<p>別笑、我真的被防毒軟體搞過好幾次,store 上滿是 "Fxxx 有病毒別下載" 的留言,透過 email 來罵你的信,更是如雪片般飛來,當下心想如果這些信都是訂單該有多好。</p>
<span class="fullpost">
<p>如果你將來和我一樣遇到這無妄之災,<strike>第一時間先叫你的使用者給那個防毒軟體一顆星</strike>(誤),再來透過底下這個網頁內提供的各家防毒軟體 false positive (false alarm) 回報系統回報。</p>
<p><a href="http://www.techsupportalert.com/content/how-report-malware-or-false-positives-multiple-antivirus-vendors.htm">http://www.techsupportalert.com/content/how-report-malware-or-false-positives-multiple-antivirus-vendors.htm</a></p>
<p>希望你不會用到。</p>
</span>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3402539703993479534.post-22094103754748827502016-04-17T07:43:00.000+08:002016-04-22T19:25:26.143+08:00千萬不要用加速 apps<p>最近看到 HTC Boost+ app 強調可以透過清除背景程式的方式,來達到加強手機效能的目的。
其實市面上這類加速 apps 不僅是做白工,啟動程式變得更慢,最糟的是讓手機更耗電。</p>
<span class="fullpost">
<p>我剛簡單做個實驗,用他的加速功能清除記憶體 (我的手機是Nexus 6),清除後號稱清出 700 MB。
十分鐘後再打開加速功能,你會發現原先號稱清除的記憶體空間幾乎都長回來了。</p>
<p>為什會這樣?</p>
<p>原來這些佔用記憶體的背景程式有分三種類型︰</br>
1. 常駐程式 (如 facebook)</br>
2. 會自我啟動的程式 (如 gmail)</br>
3. 不用的程式 (按 BACK 或 HOME 跳離)。</p>
<p>如果你手動用這類加速 apps 殺掉這些背景程式,幾分鐘內系統會自動重啟 1, 2 類的程式,只有第三類背景程式才真正可被清除,這解釋我先前的實驗結果。
所以如果你頻繁地用加速 apps,導致殺掉又重啟程式的不斷循環,不僅是做白工,還會讓手機更加耗電。</p>
<p>你可能會說他還是有殺掉第三類背景程式啊。
要回答這個問題,要先知道系統為什麼要保留第三類背景程式。</p>
<p>原因是,當記憶體空間還充足時,系統保留第三類背景程式,就是為了讓你再次執行該程式時,不需重啟程式。
這是系統內建的加速啟動機制,結果反而被這些所謂的加速 apps 變得慢速。</p>
<p>其實當記憶體空間不夠時,系統會自動依照 3, 2, 1 的順序逐一殺掉背景程式騰出空間。
所以,你根本不需要這些加速 apps。</p>
<p>這些 Android 記憶體空間管理機制,做手機的 HTC 比誰都懂。</p>
<p>HTC 今天推出這樣的 app,我實在很失望。</p>
<p>更多討論也可以看我 <a href="https://www.facebook.com/samlu128/posts/10204460091701235">Facebook 上的文章</a>。</p>
</span>
Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-3402539703993479534.post-48704372323198870302016-03-25T15:56:00.000+08:002016-03-25T15:56:43.051+08:00在 Android 中,有哪些 IPC 方法?<p>前不久在我的 Facebook 上,問了底下這個問題:</p>
<p>在 Android 中,當 process A 要向 process B 索取動態 parcelable 資料 (動態資料指,資料是經由計算所產生) 時,你會用甚麼方式來做?</br>
</br>
1. 最常見的方法是 Service + AIDL (http://developer.android.com/guide/components/aidl.html)。</br>
</br>
還有誰要貢獻其他方法?</br>
</p>
<p>最後找出將近十種方法,還有範例與文件,有興趣的自行點下面連結參考。</p>
<p><a href="https://www.facebook.com/samlu128/posts/10204283071555842">https://www.facebook.com/samlu128/posts/10204283071555842</a></p>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3402539703993479534.post-1105929308896967982016-01-19T19:18:00.001+08:002016-01-19T19:40:19.112+08:00在 Android M 上如何檢查我的程式已取得要求的權限?<p>How to check if a requested permission has been denied by users?</p>
<p>Android marshmallow 以上的手機開始允許使用者取消程式所要求的某些權限,從使用者的角度來看,這個新功能當然很好。不過從開發者來看,這卻是一個災難的開始。</p>
<p>為什麼?因為我就遇到使用者之前曾經手動取消我的程式所要求的某些權限,過了一陣子,他來信抱怨某些功能無法正常執行。查了半天,原來事實上是,他早已忘了他曾手動取消權限這檔事;或者他根本不知道取消這些權限,會導致那些功能無法正確運作。</p>
<p>身為開發者的你,要怎麼知道權限被使用者偷偷取消了呢?</p>
<span class="fullpost">
<p>如果你程式的 targetSdkVersion 是設為 23 或以上的值,可用下列方法檢查:</p>
<textarea name="code" class="java:nogutter:nocontrols">
boolean bGranted = (ctx.checkSelfPermission(Manifest.permission.READ_CALENDAR)
== PackageManager.PERMISSION_GRANTED);
</textarea>
<p>或是:</p>
<textarea name="code" class="java:nogutter:nocontrols">
boolean bGranted = (ctx.checkPermission(Manifest.permission.READ_CALENDAR,
android.os.Process.myPid(),
android.os.Process.myUid()) == PackageManager.PERMISSION_GRANTED);
</textarea>
<p>如果你程式的 targetSdkVersion 是設為 22 或以下的值,那上述方法都會傳回 true,即使使用者已手動取消權限。所以你要換成下列方法:</p>
<textarea name="code" class="java:nogutter:nocontrols">
String strOp = AppOpsManager.permissionToOp(Manifest.permission.READ_CALENDAR);
if (strOp != null) {
AppOpsManager mgrAppOps = (AppOpsManager)ctx.getSystemService(Context.APP_OPS_SERVICE);
boolean bGranted = (mgrAppOps.checkOpNoThrow(strOp,
android.os.Process.myUid(),
getPackageName()) == AppOpsManager.MODE_ALLOWED);
}
else {
boolean bGranted = (ctx.checkPermission(Manifest.permission.READ_CALENDAR,
android.os.Process.myPid(),
android.os.Process.myUid()) == PackageManager.PERMISSION_GRANTED);
}
</textarea>
</span>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3402539703993479534.post-85624440774146815572015-01-06T19:23:00.002+08:002016-01-28T19:37:57.898+08:00Material style Dialogs<p>如果你依照 <a href="http://android-developers.blogspot.jp/2014/10/appcompat-v21-material-design-for-pre.html">AppCompat v21 — Material Design for Pre-Lollipop Devices!</a> 文件中的說明,為你的 APP 加上 material style 的顏色設定 (colorPrimary, colorPrimaryDark, colorAccent)。執行時,你會發現只有 Activity 內的 ActionBar(Toolbar) 或 Views 會套用這些顏色設定。就算在 Android 5+ 上面執行,Dialog (AlertDialog) 中各 Views 的顏色並不支援 material style 的顏色設定。就像上圖中的左邊,RadioButton 不是 colorAccent 所定義的顏色。</p>
<span class="fullpost">
<p>這原因在於 AppCompatV7 (r21) 並不支援 Dialog 或 AlertDialog。要解決這個問題,有兩種方法:</p>
<p>第一種解法是加一個 res/values-v21/themes.xml,其內容如下範例:</p>
<textarea name="code" class="java:nogutter:nocontrols">
<resources>
<style name="Theme.MyTheme" parent="Theme.AppCompat.Light">
<item name="colorPrimary">@color/color_primary</item>
<item name="colorPrimaryDark">@color/color_primary_dark</item>
<item name="colorAccent">@color/color_accent</item>
<item name="android:dialogTheme">@style/MyDialogStyle</item>
<item name="android:alertDialogTheme">@style/MyDialogStyle</item>
</style>
<style name="MyDialogStyle" parent="android:Theme.Material.Dialog">
<item name="android:colorPrimary">@color/color_primary</item>
<item name="android:colorPrimaryDark">@color/color_primary_dark</item>
<item name="android:colorAccent">@color/color_accent</item>
</style>
</resources>
</textarea>
<p>這解法的的好處是簡單,不用額外的套件。壞處是在 Android 4- 平台上,Dialog 的長相與 Views 顏色仍然與原生平台相同。</p>
<p>第二種解法是採用 <a href="https://github.com/afollestad/material-dialogs">Material Dialogs</a> 這個套件。優點是在 Android 4+ 平台上會有一致的 Dialog 長相與 Views 顏色,缺點是這位開發者三天兩頭就改個版本,看來離穩定版還有一段距離。</p>
<p>如果你問我,我現在是用那個解法?答案是解法一,因為用第三方套件的風險實在很高,非必要盡量少用,以免增加無謂的程式錯誤與維護程式的複雜度。</p>
</span>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-3402539703993479534.post-11225400523969782892014-12-08T10:23:00.002+08:002014-12-08T10:23:32.391+08:00又有 APP 被 Google 下架<p>最近得知又有一位朋友的 app 被 Google 下架,身旁的朋友曾被 Google 下架的,我知道的就有好幾位。</p>
<p>我也是苦主之一,事實上應該算是全球第一位被 Google 下架 app 的開發者,早在 2009 我和 Jason Cheng 共同開發的 aNetShare 就被下架過 (見 <a href="http://www.cool3c.com/article/7186">www.cool3c.com/article/7186</a>),理由當然很瞎。</p>
<span class="fullpost">
<p>開發者條款中很多禁止事項都寫得很含糊,解釋權又在 Google 身上,硬要說你違反那一條,都可以ㄠ的過去。我覺得 Google Play 最差的部分是沒給你改的機會,不管你已經累積多少使用者,投入多少資源,說下架就下架,這不是一個友善的 B2B 做生意方式。App Store 的事先審核,在這個面向來說,就是優點。可以做的,有無違反商標,Apple 都事先告訴你。不像 Google, 在你投入這麼多資源後,一覺醒來時,突然發覺全部被 reset to zero. 那可是會想殺人的。</p>
<p>我每次遇到相關的 Google 負責人員,都會向他們提到此事,不過這麼多年過去,看來他們舞照跳,馬照跑,外頭求救無門的 app 苦主還是有增無減。</p>
<p>要看原本我在 Facebook 的 po 文,請點 <a href="https://www.facebook.com/samlu128/posts/10201968529373734">www.facebook.com/samlu128/posts/10201968529373734</a></p>
<p>在 Google 的服務有所改善之前 (看來是沒希望了),最好的方式還是熟讀底下這些與 APP 相關的協議</p>
<ul>
<li><a href="https://play.google.com/intl/ALL_tw/about/developer-content-policy.html">Google Play 開發人員計劃政策</a></li>
<li><a href="https://play.google.com/intl/ALL_tw/about/developer-distribution-agreement.html">Google Play 開發人員發佈協議</a></li>
<li><a href="https://support.google.com/googleplay/android-developer/answer/188189?hl=zh-Hant">Google Play 內容分級規範</a></li>
<li><a href="https://support.google.com/googleplay/android-developer/?hl=en#topic=2364761">Google Play 開發人員說明中心 - 政策和最佳做法</a></li>
</ul>
</span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3402539703993479534.post-43550710833788354912014-05-12T16:05:00.003+08:002014-05-12T16:47:23.677+08:00為什麼你的 app 要在每個 Android 版本上測試?<p>先看一下底下的程式片段。這樣的程式在某些手機上會當掉,你有看出來這問題出在那?</p>
<textarea name="code" class="java:nogutter:nocontrols">
public class MyReceiver extends BroadcastReceiver {
@Override public void
onReceive(Context ctx, Intent it)
{
super.onReceive(ctx, it);
IntentFilter itf = new IntentFilter(Intent.ACTION_BATTERY_CHANGED)
Intent it = ctx.registerReceiver(null, itf);
if (it != null) {
int nBatteryLevel = it.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
...
}
}
</textarea>
<span class="fullpost">
<p>程式中的 registerReceiver(null, IntentFilter) 用的是一個很典型<a href="http://developer.android.com/training/monitoring-device-state/battery-monitoring.html">取得當前手機電量</a>的方法。由於 ACTION_BATTERY_CHANGED 是一種 "sticky intent",因此我們可以透過傳 null 給 receiver 及適當的 IntentFilter,來取得該 intent 所攜帶的 bundle 資料。</p>
<p>乍看之下,這樣的程式好像沒有問題。不過我們先來看一下 <a href="http://developer.android.com/reference/android/content/Context.html#registerReceiver%28android.content.BroadcastReceiver,%20android.content.IntentFilter%29">Context.registerReceiver() 的文件說明</a>。看到沒,文件中的 Note 說明了這個函式不能在 BroadcastReceiver 中被呼叫。<p>
<blockquote>
Note: this method cannot be called from a BroadcastReceiver component; that is, from a BroadcastReceiver that is declared in an application's manifest. It is okay, however, to call this method from another BroadcastReceiver that has itself been registered at run time with registerReceiver(BroadcastReceiver, IntentFilter), since the lifetime of such a registered BroadcastReceiver is tied to the object that registered it.
</blockquote>
<p>嚴格地說,應該是呼叫 registerReceiver() 的 ctx 不能是一個 BroadcastReceiver 或其繼承物件。程式當掉的原因看起來似乎是清楚了。</p>
<p>不過另個問題來了,多數工程師寫程式時,沒法記住所有的特別限制。而這樣的問題,在編譯階段無法被偵測到,只能靠動態測試。就以我來說,我寫程式多半在最新的 Android 版本 (4.4.2) 上開發、測試。上述的程式在我手機上,當時竟然是可以正確執行無誤。在 app 要釋出前,我還在 4.3.x, 4.2.x 的手機上測過,也都沒有問題。直到一位使用者的回報,我才發現這樣的程式在 4.1.x 的手機上執行,會有問題。</p>
<p>看起來正確的結果應該是,上述程式在4.1(含)以前的手機上執行,都會出問題。但是在4.2(含)之後的手機上,卻可以正確執行無誤。</p>
<p>為什會這樣?我們看看 frameworks\frameworks\base\core\java\android\app\ContextImpl.java 原始碼,就可以找到答案。</p>
<p>底下是 Android 4.1(含)以前的原始碼:</p>
<textarea name="code" class="java:nogutter:nocontrols">
...
class ReceiverRestrictedContext extends ContextWrapper {
ReceiverRestrictedContext(Context base) {
super(base);
}
@Override
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
return registerReceiver(receiver, filter, null, null);
}
@Override
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
String broadcastPermission, Handler scheduler) {
throw new ReceiverCallNotAllowedException(
"IntentReceiver components are not allowed to register to receive intents");
//ex.fillInStackTrace();
//Log.e("IntentReceiver", ex.getMessage(), ex);
//return mContext.registerReceiver(receiver, filter, broadcastPermission,
// scheduler);
}
...
</textarea>
<p>底下是 Android 4.2(含)之後的原始碼:</p>
<textarea name="code" class="java:nogutter:nocontrols">
...
class ReceiverRestrictedContext extends ContextWrapper {
ReceiverRestrictedContext(Context base) {
super(base);
}
@Override
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
return registerReceiver(receiver, filter, null, null);
}
@Override
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
String broadcastPermission, Handler scheduler) {
if (receiver == null) {
// Allow retrieving current sticky broadcast; this is safe since we
// aren't actually registering a receiver.
return super.registerReceiver(null, filter, broadcastPermission, scheduler);
} else {
throw new ReceiverCallNotAllowedException(
"BroadcastReceiver components are not allowed to register to receive intents");
}
}
...
</textarea>
<p>很不幸,你在文件中找不到這個 API 規格變動的相關說明。這個因 APIs 規格變動,所引起的問題,還不是唯一的例子。事實上,類似的問題,不管是 Android, iOS 或是其它作業系統,都會發生。所以當你開發好你的 app 時,千萬記得要在各個作業系統版本上都測試一遍。只不過要做到這樣,你得先建立自動化測試的機制與完善的測試案例。隨著 Android 作業系統的快速演進與增加,慢慢地你會發現 app 的測試成本,將不下於開發成本。</p>
</span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3402539703993479534.post-36747386758879898632014-04-27T21:17:00.000+08:002014-04-28T15:54:56.998+08:00Hardware Acceleration 的陷阱<p>最近寫了個程式,剛好要利用 Canvas 中的 <a href="http://developer.android.com/reference/android/graphics/Canvas.html#clipPath(android.graphics.Path)">clipPath()</a> 函式來繪圖。結果是,不管我如何呼叫 Canvas.clipPath(),似乎一點作用也沒有。最後才發現,原來是 hardware acceleration (硬體加速) 這個系統功能搞的鬼。</p>
<p><a href="http://developer.android.com/guide/topics/graphics/hardware-accel.html">Hardware acceleration</a> 是從 Android 3.0 開始,Android 繪圖系統利用 GPU 支援的 OpenGL 渲染功能來加速 2D 圖像繪製的一種新功能。硬體加速?可以加速繪圖的速度,這聽起來似乎很美好。不過實際上,這個功能有很多的限制。例如,Canvas.clipPath() 在 API 17 之前就是不支援的。</p>
<span class="fullpost">
<p><a href="http://developer.android.com/guide/topics/graphics/hardware-accel.html#unsupported">這個連結中</a> 列出所有硬體加速功能的限制。很複雜吧!更糟的是,只要你的 minSdkVersion 或是 targetSdkVersion 設定為 14 以上,這硬體加速功能,預設竟然是開啟的!</p>
<p>如果你的應用需要用到的 Canvas 的各式繪圖函式,而結果又出乎你預期時,我會建議你先關掉硬體加速功能,試試看是否因為這個原因所導致的。</p>
<p>要關閉硬體加速功能,最簡單的方法是加上 android:hardwareAccelerated="false" 這個屬性到 AndroidManifest.xml 中的 Application 標籤中。不過這個方法會讓你應用中的所有 View 的繪製都不允許硬體加速。這似乎有點極端,所以 Android 也提供 <a href="http://developer.android.com/guide/topics/graphics/hardware-accel.html#controlling">Window based 或 View based</a> 的關閉方法。當你確定應用的不正常行為是因硬體加速功能所導致,這時你可以利用前述方法,將某些 Views 或 Windows 的硬體加速功能關掉即可。</p>
</span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3402539703993479534.post-42713872512011353272014-04-20T14:24:00.000+08:002014-04-23T19:10:57.228+08:00好用的 Activity.getView()<p>在 Activity 中最常看到的函式呼叫,就是 findViewById(),常見用法如下:</p>
<textarea name="code" class="java:nocontrols">
TextView tv = (TextView)findViewById(R.id.my_text_view);
...
ImageView iv = (ImageView)findViewById(R.id.preview);
</textarea>
<p>由於 findViewById() 傳回的是 View 這個通用型別。因此實務上每次都要強制轉型成實際的型別,這樣的程式碼看起來實在有點礙眼。</p>
<span class="fullpost">
<p>要解決這樣的問題,你只要在 Activity 中,加入底下這個 getView() 函式。</p>
<textarea name="code" class="java:nocontrols">
public final <E extends View> E
getView(int id)
{
return (E)findViewById(id);
}
</textarea>
<p>之後,你就可以將原先的 findViewById() 呼叫改寫成底下這個方式:</p>
<textarea name="code" class="java:nocontrols">
TextView tv = getView(R.id.my_text_view);
...
ImageView iv = getView(R.id.preview);
</textarea>
<p>一個小技巧,卻可以讓你的程式碼看起來清爽許多。當然在 Fragment 中,你也可加上自己的 getView(),至於如何寫?建議自己研究一下。</p>
</span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3402539703993479534.post-30311431541296952352014-01-06T17:31:00.001+08:002014-01-06T17:32:36.069+08:00冬天是為了迎接更美麗的春天<p align=center><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRlRdeqw3ipewZ2c-oQ_GRqAGVgrDqtNNwS8NFRujLw96GSqWNNlfgYHMvQ1Qs98qNKG6De0ZXbOzLEo85gYF7B0FPrNISPLWT-LnL7Pb5w8MwwT54OXCYF8XdnyXzGQ8Ame1BFmx4m6c/s320/snow-android.jpg" /></p>
<p>APP 如果說是一個產業,他的春天是開始於 2009,2011 則是百花盛開的季節。不過在 2014 的開始,我感覺 APP 產業 (我只開發工具類 apps, 以下觀點對於遊戲類 apps 可能不適用) 已開始邁向寒冬,這第一波寒流尤其對個人開發者或新創小團隊會是個嚴厲的考驗,建議及早作好過冬準備。</p>
<p>由於我之前一直鼓吹 APP 對於小開發團隊,會是個很好的發展。現在我有這個不對勁的感覺,我覺得我有這個義務,要儘早告訴大家。</p>
<span class="fullpost">
<p>說寒冬,可能是誇張了點,不過 app 開發者獲利往下滑與新 apps 難獲利的趨勢,應該在 2014 年 Q2-Q3 會更加明顯。如果打算離職寫 app 的朋友,我建議延後你的計畫;想要大舉擴編 app 團隊,開發新 apps,最好三思;新 app 的損益平衡點時間,你得加倍計算。</p>
<p>至於現有的大咖 app 開發團隊,會延後感受到這波寒流。說到這,這有點像是房地產,現在的大咖 app 開發團隊,就像是市區豪宅,而新加入的 app 開發團隊,就像是市郊小套房。當產業空頭來到時,總是先跌套房,再跌豪宅;先從市郊跌起,最後才是市中心。</p>
<p>在之前,開發一套工具 app,從開發完成到有足夠的收入,可以養活自己,樂觀估計最少要 1 年。現在加上這第一波寒流,時間鐵定要拉長,所以我說要及早作好過冬準備,免得到時彈盡糧絕。</p>
<p>這是我個人透過我旗下 apps ,再加上一些不便透露的數字,所獲得的 "感覺" (所以有一定的不可靠性與主觀偏差)。我不是分析師,也沒更多客觀數據可以向你證明我說的正確性有多高。</p>
<p>我希望我的感覺是錯的,也不想危言聳聽,如果其他人有不同的感覺,那就把我這篇說的忘掉。日後我如果有更新的"感覺",再和大家更新。</p>
<p>至於 APP 產業會不會消失,那倒不至於,因為需求是真的,也還在。只是參與的人多了,他需要時間去蕪存菁。APP 產業也需要有些結構性的改變,才可讓市場活絡起來。</p>
<p>我相信寒冬過後,會是更美麗的春天</p>
<p>PS: 從 2009 年到 2013 我一直致力於 Android Apps 開發之各項教學與推廣活動。到了 2014 年的開始,我想這項階段性任務應該是到了他該結束的時候。也就是說,從 2014 年開始,請不要找我接演講、授課或採訪等相關活動,謝謝曾經幫助過我的各位好朋友。</p>
</span>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3402539703993479534.post-83003387020499701022014-01-05T12:21:00.001+08:002014-01-05T12:21:58.761+08:00第二個千萬下載 APP - 省電超人<p>My second 10M downloads app - 2x Battery</p>
<p align=center><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrgYmGNFPWwamNqeaVdAIzT6ne_ATdp_c0zuYj8TkHX1lurkLmq6LvB_sUr4lrX-gpZftswqmyimcWllXNZjfkxA2_6GPmiTH600d9QhuVXXPavZB0Fbw4yqQ6rfM1Gxu1eZlgfRJ0lnA/s320/2xBattery_10M1.png" /></p>
<p>在 2013/11 月底,<a href="https://play.google.com/store/apps/details?id=com.a0soft.gphone.aDataOnOff">省電超人 (2x Battery)</a> 的下載數來到一千萬這個新的里程碑,這是我第二個下載數超過千萬的 APP。第一個破千萬下載的是 <a href="https://play.google.com/store/apps/details?id=com.a0soft.gphone.app2sd">AppMgr III (app 2 sd)</a>,<a href="http://ysl-paradise.blogspot.tw/2012/08/app.html">AppMgr 的千萬下載花了26個月並歷經30多次的改版</a>,而 2x Battery 的千萬下載則歷經更長的 29 個月以及 50 多次的改版。由這兩個千萬下載應用來看,首先你會發現一般的工具型APP要達到千萬下載的等級,至少要等兩年的時間。因此新創APP團隊或開發者,在等待成功來臨之前,你必須好長期抗戰的準備,包括心理與你手上的資源。</p>
<p>依照慣例,在此分享 2x Battery 千萬下載的相關數據。</p>
<span class="fullpost">
<p><b>不可忽視的東南亞使用者</b></p>
<p>下圖是使用者的分布餅型圖。美國使用者還是最多,不過香港、台灣、印尼、印度、菲律賓、馬來西亞等國家,包辦了2~7名。看來東南亞 Android 使用者,已是不可忽視的一群。</p>
<p align=center><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRn-nJvBaYcmaKV_4ek5MHb3F8aBxK72Vx4p6FTK0ZMV8TCACMiKa3IRVvhT_otUCOoXpZI_kOCxUoac05i3rC10_-5JiEP0heOqfOYmaqDHD4VqrtrGgLPIt6gcUjOpLnKfpJhUSYvPE/s320/byCountry1.png" /></p>
<p>台灣使用者佔了9.16%,這比例算是蠻高的,我想主要原因是不少3C達人 (像是 <a href="http://briian.com/tag/%E7%9C%81%E9%9B%BB%E8%B6%85%E4%BA%BA">重灌狂人</a>,<a href="http://walker-a.com/archives/2206">挨踢路人甲</a>,<a href="http://www.kocpc.com.tw/archives/1414">電腦王阿達</a>) 有寫省電超人介紹文的關係。</p>
<p><b>支援21種語系</b></p>
我所有的應用,第一個發行的語言一定都是英文版。接下來才是中文版與其他由使用者協助翻譯的語系。到千萬下載時,2x Battery 已經支援多達21種不同語系,底下是各語系使用者百分比數:
<p align=center><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilsdyDGFs5aqU4y5YB_8YABdXP2QRL70aAsjehgKcBMkT724Cv-2EyzNvGLvvMaWZ_LGsIzzO-wZZQA0EEaCWVmOzaZZVkyThctkklFagzOUdfhhA4rl8h5LQfw1JXuPpuJCPH4cBVtYI/s320/byLanguage1.png" /></p>
</span>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-3402539703993479534.post-36122870755298055802013-11-14T00:00:00.000+08:002013-11-14T07:11:28.424+08:00AppNext 2013 年度最佳 APP - 省電超人<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr3HPlAZmK9UByRrHtywhV8hp_OG03JrHNJV-yBy6Dgo5fmXd4cqsbE_WlJ4FezG01kfbAAatiGUpVcvJWNDJnlAxEK2gf6hNSBPmYDY2IR40Xu0PEDjZe1QfiXjO0l1fNRtaJZNbC5A4/s1600/AppNext2013_2xBattery.jpg" />
<p>很高興「<a href="https://play.google.com/store/apps/details?id=com.a0soft.gphone.aDataOnOff">省電超人 (2x Battery)</a>」榮獲「<a href="http://www.bnext.com.tw/edm/2013AppNext/">《數位時代》AppNext 2013 應用程式創新大賽</a>」年度最佳 APP 首獎。</p>
<p>為慶祝省電超人的得獎,我決定在 2013/11/14-2013/11/16 這三天,讓支持省電超人的朋友們(僅限台灣與香港)都可以用五折(原價 US$3.99) 的價格升級到專業版。省電超人專業版的下載連結是 <a href="https://play.google.com/store/apps/details?id=com.a0soft.gphone.aDataOnOff.pro">https://play.google.com/store/apps/details?id=com.a0soft.gphone.aDataOnOff.pro</a></p>
<p>底下是這次比賽得獎的作品:</p>
<span class="fullpost">
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTpL8k2ovu12oZ41LjOt1hxkdsJArT0FpD5F-rZlQC8BsrdYlW-aGrlHKivsbE0C9tfPnQHPWd4iyh1deju5gHu8rMRulbI-kWPLIzPfhGtDv4uya4HPU8m3tpAqrCg-GQnhkflcXg3bE/s1600/2013_11_AppNext2013-2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTpL8k2ovu12oZ41LjOt1hxkdsJArT0FpD5F-rZlQC8BsrdYlW-aGrlHKivsbE0C9tfPnQHPWd4iyh1deju5gHu8rMRulbI-kWPLIzPfhGtDv4uya4HPU8m3tpAqrCg-GQnhkflcXg3bE/s320/2013_11_AppNext2013-2.jpg" /></a></div>
<p>入圍的作品在<a href="http://appnext.bnext.com.tw/">這裡</a>。</p>
<p>在 2013/11/20 7pm-9-pm 《數位時代》將舉辦 AppNext 2013 應用程式創新大賽頒獎暨優勝團隊分享活動,我也會上台進行 6 分鐘的分享。想要參加(需自費)的,報名網址在<a href="http://www.bnext.com.tw/edm/meet/">這裡</a>。<br>
時間:11月20日(週三) 晚上7:00-9:00<br>
地點:台北科技大學綜合科館第三演講廳,忠孝東路3段1號<br>
</p>
</span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3402539703993479534.post-3615776734866193342013-10-09T17:31:00.001+08:002013-10-09T17:31:56.513+08:00APP 著作權侵權處理實例<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJSHQ-zgh1xfGJPEfe4MU2n3qrbX7_XPlZiXZ90ulXrfPDo2tgEVP0WCHrriOcnL4T1ECUkzCEZKGFnepM3V9cBcRv_UvuKO77ep3AtpuPlb7L7aq-y1RYs8bEaqwEzDZxM9LsTvcF0dw/s1600/copyright.jpg" />
<p><a href="https://play.google.com/store/apps/details?id=com.a0soft.gphone.uninstaller">Batch Uninstaller</a> 是我最近開發的 app,其 app icon 圖示及名稱見下圖的上半部。前幾天在 Google Play 上突然發現有個 app 的圖示很眼熟 (見下圖的下半部),定神一看才發覺這不是我的 app,仔細檢查他的 app icon,發現他基本上是拿我的 icon 當背景,再做點淺加工而成。很明顯地他侵犯了我的著作權!</p>
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia4K7fYX5COG0XenQnwMJbiT0uXKdij0CDmY_iX9Nku8vgFH1tsa8lVHy7CQhidqG3DxYtx_QBLXbCXTLQ0a68F78S802SswKp01GWpknN9TYdUwQY-NwRyuCzomgvAA23xByPa1KbXsw/s1600/compare.jpg" />
<span class="fullpost">
<p>別擔心,要解決這樣的侵權問題,通常還不到上法院對簿公堂的地步。首先,我先到 <a href="https://support.google.com/legal/contact/lr_dmca?dmca=images&product=googleplay&hl=zh-Hant">Google 的檢舉疑似侵權的行為</a> 網頁,提出著作權侵權檢舉。在這裡你可以用英文或中文來說明。不過遇到法律的問題,我建議你還是使用你最熟悉的語言,免得到時啞巴吃黃連,有理說不清。</p>
<p>進入檢舉網頁後,首先看到的是 "投訴者資訊",這部分就照實填寫。</p>
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisj6BizSWBOwPhyphenhyphencTARmUABgJVr5kcwADAfuMFcPMcNIr1HMr5A_pXn8lvAuWkFJVtK8uMLRex_5Fqya7Mh6g35KgZpyKb6jfvxWrzMwi2HzlOdD7AiiLYbhRGoHq0_VHTePEUX1rypn8/s1600/part1_1.jpg" />
<p>接下來是我的版權作品資訊,也就是我必須要清楚說明我的著作權物是甚麼,在那可以看到。下圖你可以看到我處理這案件時所填的內容。</p>
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFfhhFGkpRha6jbzpFDoXnpkQtMJCNyfZLNlTUTBucKuXo_zn4tHalEVx0aixHGbEMqTU-EnSYby4RF7p1X6hx33bRSoPPiEquPK1j8U-2XU_Nw_UEiVegFm6pnkYr8Lhe0ENRCF81_H8/s1600/part2_1.jpg" />
<p>最後,如下圖,是宣誓聲明與數位簽章。確保我知道這檢舉案所應負的法律責任(例如,不實檢舉)。</p>
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSlYGiBkMMp2IPchD5VZIVdd2T-Gv4V54HQEoZ4kgJk8di8BeJlQ6ef6cz7FIReuzIgan286j-nPmtYAj3TlP1-M_J_QvTGRK3xYB7K-uccyelyLAnHYmx-2pSRoiqi5yPuVGG2sfPruw/s1600/part3_1.jpg" />
<p>再三檢查沒問題後,按下 "提交" 按鈕,信箱內就收到標題是 "[1-566xxxxxxxx] 您的Google投訴" 的信件,通知我 Google 已收到我的法律要求,會儘速著手處理之類的罐頭回文。</p>
<p>三天後,我就收到真正的回信,告知 Google 已依據《數位千禧年著作權法》的規定,將我所投訴的侵權案件處理完畢,也就是將對方的 APP 從 Google Play 中移除。檢查一下,Google Play 上果然再也找不到對方的 APP。</p>
<p><b>CASE CLOSED!</b></p>
<p>類似的 APP 著作權侵權案,這已經是我所處理過的第三個案件,都是 app icon 或應用內的圖直接盜用的著作權侵權。最長要等到將近一個月,才會收到 Google 的回信,這次最快,全部只花三天就解決。</p>
<p>著作侵權、商標侵權或無端被人不實檢舉,都可以到 <a href="https://support.google.com/legal/troubleshooter/1114905?rd=1#ts=1115643">從 Google 移除內容</a> 上提出檢舉或申訴。至於專利侵權,就不是看看疑似侵權物就可以判定的事,所以你得先上法院,提出訴訟,告贏了再說。</p>
<p>前陣子有位朋友告訴我,有別的 app 偷他們 app 的 "圖", "動畫", "程式設計流程" 還有 "設計的概念",來信問我的想法及建議。靜態圖與動畫,還有文章都可以靠著作權來保護。"程式設計流程" 與 "設計的概念" 的保護我覺得還是得靠專利權才行。著作權是著作人於著作完成時即享有著作權,不用特別去申請。專利權,你得先申請到專利,才享有專利權的保護。所以,我建議他們直接從著作權侵權著手。</p>
<p>最近還有一個 <a href="http://marisaliu.blogspot.tw/2013/10/blog-post.html">My etag app 收到遠通警告信函</a> 的案例,仔細研究一下,這明顯是疑似商標侵權的實例。先不論遠通的 etag 註冊商標是否存議,至少他已取得中華民國的商標權。所以 app 開發者在取 app 名稱之前,我都建議你先到 "各國" 商標局,檢索一下你所欲取的名稱是否與其它註冊商標相同或相似。絕對不要與現有的註冊商標衝突,事前的避免總比事後上法院處理來的容易許多,不是嗎?</p>
<p>我也常常建議產品開發者還是要仔細研讀著作權,商標權與專利權的內容,我在這裡只能提到這些權的皮毛,開發者一定要熟悉及申請這些權利,並做好事前的保護。</p>
<p>最後,我僅在這分享我個人的實際處理案例供你參考。以上言論不代表本人立場,如有疑問,請自行找台灣最貴的律師諮詢請教。</p>
</span>
Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-3402539703993479534.post-55656294099039461342013-07-17T19:50:00.001+08:002013-07-17T19:51:25.981+08:00APP定期與SERVER同步資料應該要注意的事<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh32vl2eqm0EGzyh-ZJM96Tg31qb86E4UbQD_IcgX7adiLxy8Uibtei9bCz0uF_i3lBtQd1igaQbyDTdIBj2qd9mlykfnPK4I0istyU4QctY_hWV7gyVfFouApfC9-rbCGxdFqbC0AJq8Q/s1600/DataSync.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh32vl2eqm0EGzyh-ZJM96Tg31qb86E4UbQD_IcgX7adiLxy8Uibtei9bCz0uF_i3lBtQd1igaQbyDTdIBj2qd9mlykfnPK4I0istyU4QctY_hWV7gyVfFouApfC9-rbCGxdFqbC0AJq8Q/s1600/DataSync.png" /></a></div>
<p>今天一位國外開發者遇到他的應用在定期與 server 同步資料時,因為 <a href="https://play.google.com/store/apps/details?id=com.a0soft.gphone.aDataOnOff">2x Battery</a> 會將網路斷開,而造成他的程式始終無法抓到資料,來信問我是否有解法。其實就算使用者沒裝 2x Battery, 手機上的網路還是隨時會處於無法連線的狀態。因此,真要寫一個定期 polling (or post) 的 app。我建議還是要寫個 broadcast receiver 監聽android.net.conn.CONNECTIVITY_CHANGE intent。如果上次同步沒成功,就可在連線恢復時,繼續上次的同步工作。</p>
<p>有興趣知道細節的,可先閱讀底下資料:</p>
<ul>
<li><a href="http://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html">http://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html</a></li>
<li><a href="http://developer.android.com/reference/android/net/ConnectivityManager.html#CONNECTIVITY_ACTION">http://developer.android.com/reference/android/net/ConnectivityManager.html#CONNECTIVITY_ACTION</a></li>
</ul>
<p>原先這文章是發佈在我的 facebook, 有位網友加入討論,我覺得值得在這分享我們的討論給大家。底下就是我們的後續討論:</p>
<span class="fullpost">
<hr>
<p><b>Julian Shen</b>: 這Intent使用上要稍微小心, 網路有變化就會收到(像是3G<->Wifi),在網路不穩定的環境下就很容易頻繁收到, 在這份 document : http://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html 有特別提到"it's good practice to monitor this broadcast only when you've previously suspended updates or downloads in order to resume them."</p>
<hr>
<p><b>盧育聖</b>: Julian Shen 你說的沒錯。
<p>Android's DownloadManager 就是靠 CONNECTIVITY_CHANGE 來恢復網路下載的工作。想深入研究的開發者,可參考底下 Android 原始碼的實作。</p>
<ul>
<li>packages\providers\DownloadProvider\src\com\android\providers\downloads\DownloadReceiver.java</li>
<li>packages\providers\DownloadProvider\src\com\android\providers\downloads\DownloadService.java</li>
</ul>
<hr>
<p><b>盧育聖</b>: 另外補充 Julian Shen 提到的會頻繁收到 CONNECTIVITY_CHANGE intent 問題的解法。實務上,這個 receiver 預設是處於 disabled (加 android:enabled="false") 狀態的,只有當你上次同步失敗時,才 enable 這個 receiver,同步好後,記得要 disable 該 receiver。</p>
<p>如何動態 enable/disable receiver,請見:</p>
<p><a href="http://developer.android.com/training/monitoring-device-state/manifest-receivers.html">http://developer.android.com/training/monitoring-device-state/manifest-receivers.html</a></p>
<hr>
<p>看到這,你是否有不同的想法或解決方法?也歡迎在此一起討論。</p>
</span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3402539703993479534.post-40609730215689485302013-05-26T13:23:00.002+08:002013-05-26T13:23:59.170+08:00Android 不再 open source?<p>5/23 我在 FB 上貼上下列這段我對最近 Google Play Services 的看法。</p>
<p>這次 Google Play Services 更新,新增不少好用的 APIs。這些新功能都不在 AOSP 中,只隨 Google Play 出。講好聽一點是用戶可以很快拿到最新的 APIs。不過 Apps 一但用這些 APIs 就只能在有 Google Play Services 的機器上執行。山寨機可以不管智財權,直接內建 Google Play 及 Google Play Services,不過 Amazon 的機器就不能這樣做。難不成 Google 這招是項莊舞劍意在沛公?</p>
<span class="fullpost">
<p>原貼文:<a href="https://www.facebook.com/samlu128/posts/4145094164566">https://www.facebook.com/samlu128/posts/4145094164566</a></p>
<p>過沒幾天 Mark Murphy 也在他的部落格上,發表他對 Google Play Services 的想法。</p>
<p><a href="http://commonsware.com/blog/2013/05/22/remember-google-play-services-proprietary.html">Remember, Google Play Services is Proprietary</a></p>
<p>對 Google 採用這個新作法,他的諸多擔憂也與我不謀而合。</p>
<p>這個新作法,就像是雙面刃。一邊雖然可以解決硬體商 firmware 更新過慢的問題。但另一邊 Google Play Services 採 closed source 的方式,違背當初 open Android source 的初衷;且另一方面,靠這個方式排擠第三方 Android 勢力,只會讓 Google 越來越傲慢。</p>
<p>希望這一天永遠不要到來。</p>
</span>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3402539703993479534.post-66193808964149071202013-05-22T16:12:00.001+08:002013-05-22T16:12:34.149+08:00AppMgr APP 下載破兩千萬<p align=center><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgi2flOT15TX9ISCHFZCyVvyVdkC0povSia5Tuuv0wJ5_n0UkGSKiG8LDkADdnbExtGrAZalreXYsVJmDDs_cQpKEyO0ECVnRymtLd5RtP4j8mG9Ge6d_cg-XGe_dGj_yxf8_RoYCVZXZI/s1600/appmgr_20m.png" /></p>
<p>我的 <a href="https://play.google.com/store/apps/details?id=com.a0soft.gphone.app2sd">AppMgr (原名App 2 SD)</a> app 在歷經780天、30多次的改版後,在2012/8/15日寫下我 <a href="http://ysl-paradise.blogspot.tw/2012/08/app.html">第一個千萬下載</a> 的紀錄。接下來 AppMgr 很快在280天後的2013/5/20,來到兩千萬下載的新紀錄。算起來,這第二個千萬下載,只需花費原先第一個千萬下載36%的時間。</p>
<span class="fullpost">
<p>底下就是從10M到20M下載的成長曲線,在這期間,有9次的改版。要維持成長的動能,定期改版是不可或缺的。</p>
<p align=center><img width=380 src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUJ3Fviy-WPb708bLc38hGKv6GMXy5tTKjD40m9FoRYP-sxl3Aoj72Jiqyww6aqC2ESfAjFOM1yGAN785gugOSa9BlKuE40U6MpRyG_4FN-4dFvZ13vQ7n-LNLWjp1-baV475Jv449MLs/s1600/appmgr_20m_curve.png" /></p>
<p>支援的語系,也從原先的20種語系,增加到36種。底下是各語系的主要使用者分佈圖。英文當然是一定要支援的語系。與 <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2vEhDF2G23pEzF4hFMNPDJfXmoSVUQKegJVX0FCRuO4dc8l-b-YxVI3ACGD49yKURjP41Wo0EdXgnvZtS-UGqCIRX_P8FjYnu7t5WZGFkjKxHs3XzpqrXosq1EJz8kRccLKn_S1Qzzug/">之前</a> 相比,西班牙語及泰語的使用人口,有較顯著的增加。</p>
<p align=center><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJollBu2CVm3qQ4CIzp1u3T1u4Jzj-t3WJ9g-x57brG0ee-EGjlfVLEj_ZzD5ua4jWOom3NNkMZ5jS-J_0nx13138qGTaQDEFvzZri60GhhrPDqKnYwtfKb_NYB5XZ5k9W5eXd6eeAxCI/s1600/by_lang.png" /></p>
<p>下圖是免費版使用者的分佈圖。與 <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmuruWTYbLMmU63lhmbE40OmGDnStngjOR3HGfXWFBwh1GMer60JUMw7SO0YQRwbrzgYARwsUSTPQmwDCSvd3wpW_nNDRipHMEtVKRfOZ-hzO9qPbzQrChvnbWGL0TTM9KCsSZ9qvHXAs/">之前</a> 相比,雙印(印度及印尼)使用者增加最多。</p>
<p align=center><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTLUDubLgLHd1U2y0qkT_I0jEH7BIIsgCQJkR-7XKUHP2oOjaaq7eLZSPDNTYRplNf_hmnQ7IUwOon3g6R7Ps3Uqy-dITx0NG8ZuOpMb3DG8Xo2KIvTYFfMzQA5QZ_7NtCHNj3ccO_x9o/s1600/free_users.png" /></p>
<p>下張付費版本的使用者分佈圖倒是沒有太多改變,與 <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmuruWTYbLMmU63lhmbE40OmGDnStngjOR3HGfXWFBwh1GMer60JUMw7SO0YQRwbrzgYARwsUSTPQmwDCSvd3wpW_nNDRipHMEtVKRfOZ-hzO9qPbzQrChvnbWGL0TTM9KCsSZ9qvHXAs/">之前</a> 相比,俄羅斯從第四變成第三,而泰國也首次進入前10名。</p>
<p align=center><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9uMsn-hzXopvLJyO6peZ-fluPnyRr5HdufFENjUVzRNqJTIwoSuBv4m5EAqxvKl4RAPsuRn3t52Gtq7YdWRHtnnl0_nH1h4_EhEh_bpnrqxOvV5rONwp802D9JNoD1x9FWl0Fguy0i-k/s1600/pro_users.png" /></p>
<p>目前我所有apps下載數的總和約3千6百萬,其中已經破百萬下載的apps有 <a href="https://play.google.com/store/apps/details?id=com.a0soft.gphone.app2sd">AppMgr</a>,<a href="https://play.google.com/store/apps/details?id=com.a0soft.gphone.aDataOnOff">2x Battery</a> 及 <a href="https://play.google.com/store/apps/details?id=com.a0soft.gphone.acc.free">1Tap Cleaner</a>。而下載數即將來到百萬的也有 <a href="https://play.google.com/store/apps/details?id=com.a0soft.gphone.aCompass">3D Compass</a>,<a href="https://play.google.com/store/apps/details?id=com.a0soft.gphone.bfont">Big Font</a> 與 <a href="https://play.google.com/store/apps/details?id=com.a0soft.gphone.aTrackDog">aTrackDog</a>。那下一個千萬下載會是誰呢?</p>
</span>Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-3402539703993479534.post-32441066718600145422013-03-27T16:09:00.001+08:002013-03-27T16:11:37.713+08:00Google AdMob 年度合作夥伴大獎<p align=center><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdPSnmCnDPToOIgFDTn8I9rc4BkGxhJk54rmHn5yf3AnHOi9DD3k5z4wDf-0_IhW1vun3XdnIVBUGz8t4WpxNLSg88HnG18lEPmUmMyp-yF-m2cLHOUxCevuWvVlQiqdzdAHdowyRXMrs/s320/IMG_20130313_201248.jpg" /></p>
<p>2013/3/13 得到 Google AdMob 在台北寒舍艾美酒店頒發的年度合作夥伴大獎。頒獎日之前,AdMob 團隊還特地到我工作的地方拍了底下這支影片。</p>
<span class="fullpost">
<p>AdMob 成功案例分享 - 盧育聖 Sam Lu</p>
<iframe width="560" height="315" src="http://www.youtube.com/embed/0jYuShbRoSs" frameborder="0" allowfullscreen></iframe>
<p>想查閱 2012 年底在 Google AdMob 合作夥伴日給的「獨立開發者之最佳獲利實踐」演講投影片,請 <a href="http://ysl-paradise.blogspot.tw/2012/11/blog-post.html">點這</a>。</p>
<p>底下是當日活動的照片:</p>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgftexLhhnkOF50uX5W5GWsdHql36S-nY38cdhcwVRSAMumWUk6abEoxhA5stAl0yILQpIYSDxjxEr8kWMyeDUTMF76FuDP0_PdiXcYTlG0Lm6cDQ-104PYweziElpnL8pSKjZJE5RKHVc/s1600/184.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgftexLhhnkOF50uX5W5GWsdHql36S-nY38cdhcwVRSAMumWUk6abEoxhA5stAl0yILQpIYSDxjxEr8kWMyeDUTMF76FuDP0_PdiXcYTlG0Lm6cDQ-104PYweziElpnL8pSKjZJE5RKHVc/s320/184.jpg" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2n2dvw1CFT8l5v5A-8MZ74usAYr-l6uRK17w22Vik3kevr2-IFcpkuA2N2Dl-aQ2ymie1WaIxhOijOGSjbqNbZ9JTnHVtQHEfo5oN0s3pAw3rlBdSYiGjVxsrv4EG531gOLNo_G5Rauo/s1600/293.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2n2dvw1CFT8l5v5A-8MZ74usAYr-l6uRK17w22Vik3kevr2-IFcpkuA2N2Dl-aQ2ymie1WaIxhOijOGSjbqNbZ9JTnHVtQHEfo5oN0s3pAw3rlBdSYiGjVxsrv4EG531gOLNo_G5Rauo/s320/293.jpg" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6bxz-j7f61Cxl0t5-L-mCMXzfZDBHuxRrS4v_IwypoX5VnkwEVz_ij3YWVdKzQrSq0upyubRVdQAppDvAZeETvuIPdQBpsMluITMRKiswa3ctNzhh-ND5Lj2Yk2pGSVIQYvi8HSraXCk/s1600/187.jpg" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6bxz-j7f61Cxl0t5-L-mCMXzfZDBHuxRrS4v_IwypoX5VnkwEVz_ij3YWVdKzQrSq0upyubRVdQAppDvAZeETvuIPdQBpsMluITMRKiswa3ctNzhh-ND5Lj2Yk2pGSVIQYvi8HSraXCk/s320/187.jpg" /></a>
</span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3402539703993479534.post-58410546711453586772012-11-29T09:37:00.001+08:002012-11-29T09:37:32.646+08:00獨立開發者之最佳獲利實踐<p align=center><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDnlD1B1VbzItewAwV86BiDiRdHLCQ0gmk-tp1v8EPFhyPJJYTkXTmJhDvaL3cW6YYVw1gzIVqbOnAUcRgH0W5WICp-dQWjJPpkLWsTM5_qu1H7rWnr_GQYfROQmUR3S-VCRHgwgTz7x0/s320/idp.jpg" /></p>
<p>應 Google AdMob 邀請,在 2012/11/29 2pm 的「Google AdMob 2012 合作夥伴日」活動中,給一場 AdMob 的使用經驗分享。</p>
<p>底下是這次我給的演講投影片:</p>
<span class="fullpost">
<p><a href="https://docs.google.com/open?id=0BzsUaCH0kw7QMHlsUGJtM2YzSVk">獨立開發者之最佳獲利實踐 - 投影片</a></p>
<iframe src="https://docs.google.com/file/d/0BzsUaCH0kw7QMHlsUGJtM2YzSVk/preview" width="400" height="320"></iframe>
</span>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3402539703993479534.post-43212180122224298552012-11-27T17:55:00.002+08:002014-01-04T14:58:53.631+08:002013 Android 4 手機應用開發課程 @ 台灣<p><font color="red" size="+1">從 2009 年到 2013 我一直致力於 Android Apps 開發之各項教學與推廣活動。到了 2014 年的開始,我想這項階段性任務應該是到了他該結束的時候。也就是說,從 2014 年開始,我將不再承接所有授課、演講與採訪等活動。</font></p>
<p>2013 mobile app development training courses for Android 4 @ Taiwan</p>
<p align=center><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRlZOZy9qGxrT0l_ew0N2DVqsX1u0Bat5rXT20IdxvzDbje2nPwrU4cpLYmoPdRidb3bNIMDvdm2Eb6asWuVBBt-eMEHFD7k_bec0ymARTFj9HIAyn2S9czHEsNK2Lm70q2R9BxdUKcok/" /></p>
<p>底下是 2013 年設計開的 Android 相關課程。</p>
<a name="entry"></a>
<p><b>入門課 - Android應用開發設計實務</b></p>
<blockquote>
<p>首先,我將課程內容都改以 Android 4 平台為主。在這個 Android 入門開發課程中,最重的要的是幫助入門者打好基礎,尤其是 Android 平台的架構,與在該平台上應用程式運作的基礎觀念與原理。這部分要是清楚了,日後遇到問題,要自己找資料解決,也有個方向。另外就是對 ListView 元件的運行原理,也有深入的介紹,ListView 是 Android 眾多 UI 元件中,最常用到的,也是最好用的一個。透過對 ListView 的了解,其他類似的元件如 GridView, Spinner 等由 AdapterView 所延伸的元件,自然也可觸類旁通。</p>
<p><b>課程大綱</b></p>
<ol><li>熟悉 Android 2.X開發環境與Android平台知識</li>
<li>瞭解Android 2.X程式框架</li>
<li>如何有效率的偵錯程式</li>
<li>功能選單之設計與應用</li>
<li>各式使用者介面元件之設計與應用</li>
<li>如何支援多國語言與不同的硬體設備</li>
<li>Intent 的使用</li>
<li>深入剖析 Activity 之運作行為</li>
<li>發佈應用程式與參考資料</li>
</ol>
</blockquote>
<span class="fullpost">
<a name="adv1"></a>
<p><b>進階課 I - 深入研究三大元件與桌面小工具之開發</b></p>
<blockquote>
<p>這個課程先帶領你深入研究 Android 三大重要元件 (Actiovity, Service, BroadcastReceiver) 的運作原理,與建立正確的使用觀念。其中我會用將近一天的時間來解釋與剖析 Activity & Service 的生命週期。這部分是對已入門的開發者,最最重要的一部分,卻也是最不容易全盤了解與最容易被忽視的一部分。我試玩過很多應用,也看過不少人的程式,與發問的問題,都是源自於對這部分的了解不夠透徹。BroadcastReceiver e也是最常被使用的元件,在學如何開發桌面小工具之前,如何使用這元件的正確觀念是一定要先建立的。接下來,我會介紹如何開發桌面小工具和多媒體應用。對於已熟悉 Android 應用開發,而想進一步提昇您自身應用開發實力與建立正確觀念的您,這個課程是一定要上的。</p>
<p><b>課程大綱</b></p>
<ol><li>深入研究Android生命週期</li>
<li>如何開發自訂使用者元件</li>
<li>各式繪圖功能之使用與應用</li>
<li>BroadcastReceiver之使用與應用</li>
<li>深入研究Service之使用與應用</li>
<li>如何建立桌面小工具</li>
<li>重力加速感應器的使用與應用</li>
<li>如何播放與錄製多媒體影音</li>
</ol>
</blockquote>
<a name="adv2"></a>
<p><b>進階課 II - 深入研究Android 4手機應用新架構</b></p>
<blockquote>
<p>在這個進階課程中,將介紹並帶領學員深入研究 Android 3、4 新應用架構與 APIs。首先要介紹的就是 Fragments,如果你要將你的應用同時執行在手機與平板上,Fragments 是一定要導入的設計概念。就算你只支援手機應用,新的 Fragments 也有助於將你的應用架構,整理的更模組化與達到高重用性的目的。除此之外,我也將一次介紹 Android 3/4 所加進來的各項重要新功能。</p>
<p><b>課程大綱</b></p>
<ol><li>設計平板與手機應用的最佳策略</li>
<li>- Fragments 簡介</li>
<li>- 深入研究 Fragment 生命週期</li>
<li>- new resource qualifiers</li>
<li>- 同時支援各式螢幕大小不同的設備</li>
<li>支援 Android 3/4 桌面小工具新功能</li>
<li>- 可縮放的桌面小工具</li>
<li>- StackView, ListView</li>
<li>- RemoteViewService</li>
<li>Android 3/4 新功能</li>
<li>- Action bar</li>
<li>- Status bar notifications</li>
<li>- PreferenceActivity, PreferenceFragment</li>
<li>- PopupMenu</li>
<li>- GridLayout</li>
<li>- Drag & Drop</li>
<li>- Copy & Past</li>
</ol>
</blockquote>
<a name="adv3"></a>
<p><b>進階課 III - 雲端/地圖應用開發與原碼解析</b></p>
<blockquote>
<p>在這個進階課程中,我會先介紹如何開發存取網路的 Android 應用。行動網路是智慧型手機的重要特色之一,因此開發具有網路存取功能的應用,也是大家常常會接觸的工作之一。我會在課程中提及如何在 Android 手機平台上,正確執行這項工作。智慧型手機的另項特色,就是 GPS (location-based)。</p>
<p>接下來,我會介紹如何開發地圖 (LBS, location-based) 應用,如何抓取經緯度座標,寫好地圖應用,都是這課程會教的事。</p>
<p>最後,我會花半天的時間,教大家如何讀 Android 應用的源碼,並實際拿個例子來解說。我個人覺得閱讀及追蹤 Android 的原始碼,是提昇你 Android 程式設計功力最好的方式之一。當你已具備 Android 開發基礎的情況下,想要再進一步提升你的程式設計功力,除了要想辦法讓自己多增加些程式設計經驗外,閱讀及追蹤別人寫的程式碼,更是最好的方法。不過網路上,每個人的程式功力高低不同,寫出來的程式也有好有差。讀到不良的程式,看不懂還不打緊,如果誤導你的觀念,那可就得不償失。因此,當你底子還不足以判斷好壞程式時,研讀 Android 原始碼,就是你學習 Android 程式設計時,最好的導師。</p>
<p>在這課程中,也會教授 Android 的第四大重要元件 ContentProvider 的用法,當然也會提及 SQLiteDatabase 這個主題。</p>
<p><b>課程大綱</b></p>
<ol><li>Android雲端應用開發</li>
<li>- 如何開發以網頁(WebView)為基礎的 Android 應用</li>
<li>- Android與WebView間的互相呼叫</li>
<li>- 如何開發Android端網路應用程式,及該注意的要點</li>
<li>- URL, IntentService, HttpClient, AndroidHttpClient</li>
<li>- XML 與 JSON parsers 的使用</li>
<li>Android LBS (地圖)應用開發</li>
<li>- 如何擷取各式地理座標資訊</li>
<li>- 如何開發地圖(MapView)應用</li>
<li>Android原始碼徹底研究</li>
<li>- 如何研讀Android原碼</li>
<li>- 深入研讀Android原碼實例</li>
<li>- SQLiteDatabase, ContentProvider</li>
</ol>
</blockquote>
<p>底下是 2013 年計畫開的課程:</p>
<p>
<table width=100% border=1 style="background-color:#ffffff;color:#000">
<tr style="background-color:#ff9900;color:#000"><td>日期</td><td>地點</td><td>課程名稱</td><td>難易度</td></tr>
<tr style="color:#888"><td>3/6,7<br />
星期三四</td><td>台北</td><td><a href="http://college.itri.org.tw/SeminarView1.aspx?no=23130065&msgno=310062" style="color:#888">Android 4 手機應用開發實務</a><br />
工研院</td><td><a href="#entry" style="color:#888">基礎</a></td></tr>
<tr style="color:#888"><td>3/20,21<br />
星期三四</td><td>台北</td><td><a href="http://college.itri.org.tw/SeminarView1.aspx?no=23130066&msgno=310061" style="color:#888">Android 4 手機應用開發實務</a><br />
工研院</td><td><a href="#adv1" style="color:#888">進階 I</a></td></tr>
<tr style="color:#888"><td>4/10,11<br />
星期三四</td><td>台北</td><td><a href="http://college.itri.org.tw/SeminarView1.aspx?no=23130067&msgno=310063" style="color:#888">Android 4 手機應用開發實務</a><br />
工研院</td><td><a href="#adv2" style="color:#888">進階 II</a></td></tr>
<tr style="color:#888"><td>4/24,25<br />
星期三四</td><td>台北</td><td><a href="http://college.itri.org.tw/SeminarView1.aspx?no=23130068&msgno=310060" style="color:#888">Android 4 手機應用開發實務</a><br />
工研院</td><td><a href="#adv3" style="color:#888">進階 III</a></td></tr>
</table>
</p>
</span>
Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-3402539703993479534.post-8347131326913847292012-09-30T20:17:00.000+08:002012-09-30T20:17:25.562+08:00App 2 SD 千萬下載 PARTY<p>App 2 SD 10M Downloads Party - 2012/9/27 @ Taipei GB Restaurant</p>
<p align=center><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMP2RBMI1YNczDdWjQwOb2K6RZPPYEoo5CFye7N1EKhvWLR5VjDKyoXsQgTDz0_sSXroo5Ymu1c7tWptgBn18Z9DMqdW-zGzggcvH-TbSF4z42rxKPSCiwOEq7AFWD3pQyblfZ5-RC86Q/s1600/IMG_2366.JPG" imageanchor="1" style=""><img border="0" height="191" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMP2RBMI1YNczDdWjQwOb2K6RZPPYEoo5CFye7N1EKhvWLR5VjDKyoXsQgTDz0_sSXroo5Ymu1c7tWptgBn18Z9DMqdW-zGzggcvH-TbSF4z42rxKPSCiwOEq7AFWD3pQyblfZ5-RC86Q/s320/IMG_2366.JPG" /></a></p>
<p>透過各位好朋友的幫忙,終於在 9/27 晚上辦了一場熱熱鬧鬧的 <a href="http://ysl-paradise.blogspot.tw/2012/08/app.html">App 2 SD 千萬下載</a> Party。Party 中,我們一起回顧從 2008-2012 在台灣發生的 Android 大小事,也找了相關合作夥伴及朋友來分享當時的心情。有一起走過這段路的朋友,聽到各位好友的分享,心中一定有不少感觸。</p>
<span class="fullpost">
<p>這次 Party,我邀請了開發者、UI 設計師、創投、廣告聯播平台、媒體記者、產業分析師、會計師等不同領域將近 40 位朋友來參加。相信來的朋友,從了可以和老朋友敘舊外,也可以認識不少新朋友,一起分享我的朋友資源。</p>
<p>謝謝各位好朋友一路陪我走來,一同經歷 Android 在台灣的發展。我起頭辦這第一個千萬下載 Party,也希望很快有下一位朋友接棒辦千萬下載 Party。</p>
<p>再次謝謝當天來參加的各位好朋友。</p>
<p>Google+: <a href="https://plus.google.com/u/0/110650936199389484797/posts/MKm9d9RCjrM">https://plus.google.com/u/0/110650936199389484797/posts/MKm9d9RCjrM</a></p>
<p>Facebook: <a href="https://www.facebook.com/samlu128/posts/423455074379475">https://www.facebook.com/samlu128/posts/423455074379475</a></p>
<p>PARTY 相片集: <a href="https://plus.google.com/photos/110650936199389484797/albums/5793824523755105073">https://plus.google.com/photos/110650936199389484797/albums/5793824523755105073</a></p>
</span>
Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-3402539703993479534.post-50524162516401312172012-08-22T21:01:00.001+08:002012-08-22T21:01:11.011+08:00我的第一個千萬下載 App<p align=center><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiR99zD2RUzTs4Ot2MP2JjNTe5954n-0fX9cmuPIU2Ok_wdWjZ6kR41taMDyvQbDXaF96KNCRNqDkTVaH5QJDm8nS13M7kAVqIBMBCVTCdvoq4PT7EOaBe2EfBhnTjuZXdbe1bqZnumIhg/" /></p>
<p>就在 <a href="http://en.wikipedia.org/wiki/Froyo_(operating_system)#Android_2.2.x_Froyo">Android Froyo(2.2)</a> 剛發表1個月後的2010年6月,我花了三天的時間寫了 <a href="https://play.google.com/store/apps/details?id=com.a0soft.gphone.app2sd">App 2 SD</a>。在此之後,經過780天並歷經30多次的改版後,終於在2012年8月15日寫下我第一個app破千萬下載的新紀錄。要達到1千萬下載,對某些應用類型來說,也許不是一個太困難的任務,不過對於像是 App 2 SD 這樣只花3天就可寫完的工具型小應用,千萬下載的確是我當初所料想不到的結果。</p>
<p>Android 2.2發表於2010年5月,不過當時內建2.2的手機卻不多見,因此只支援Android 2.2+的App 2 SD,並沒有顯著的高下載數,而我也一直將這個應用以免費應用型態發行著,甚至連廣告也沒有。一直到了2011年,這情況開始有了改變。因為2.2手機的陸續面市,我發覺App 2 SD的下載數有明顯的增長,也才意識到這個應用已是蠢蠢欲動、蓄勢待發,就等我點燃他的下載爆發力。</p>
<span class="fullpost">
<p><b>擠入超過30國Top 100排行榜</b></p>
<p>下圖是App 2 SD付費版的排行歷史紀錄。在工具類排行榜上,曾經在3個國家中佔據第一名的位置,也曾在超過30個不同國家中,進入前10名。在所有apps(包含遊戲,加總起來約有70萬個應用)的排行上,曾經在多達31國Top 100排行榜占有一席之地。</p>
<p align=center><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBkXZV9U-n35WTLAgATjJd7oIZ95RgWt5kjYZ4ovc9zr6Yrb8oFL27aO5X1bxWw0PAksqs8wNMe2PemPVwnxLoTdh0LNAgfq4G91fdfT4agbj1yEr46QBONl0c8AdLG1H3o9GNQe-Ci8c/" /></p>
<p><b>每天有6萬的下載數</b></p>
<p>用780天達到千萬下載,平均每天的下載數是12K。不過,最近每天的下載數比這平均值高很多,大約有60K。依照這樣的速度,應該在200天後,會達到2千萬下載的新里程碑。</p>
<p>底下是從2011/11到2012/8的每日安裝數曲線圖:</p>
<p align=center><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-xW_X256UNuGVCmFYVdvVpjJYEMh1CFK_LOL5EKlOolynKmedk4QvO8xNza4aQm50QNYKZuMXaZ7itbAFyTQ2ZV2yT9TvLtqaIzPWP0Xw4N1qQpmxzIxGrOqWvRRykjYZOaJhyphenhyphenFf0LC0/" /></p>
<p>一個熱門應用有了好的開始之後,接下來要做的事,就是持續觀察這每日安裝數曲線的變化,以及要用各種辦法維持這曲線的成長動能。</p>
<p><b>美日付費使用者佔4成</b></p>
<p align=center><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmuruWTYbLMmU63lhmbE40OmGDnStngjOR3HGfXWFBwh1GMer60JUMw7SO0YQRwbrzgYARwsUSTPQmwDCSvd3wpW_nNDRipHMEtVKRfOZ-hzO9qPbzQrChvnbWGL0TTM9KCsSZ9qvHXAs/" /></p>
<p>這是各國使用者的分布餅型圖,上圖是免費使用者的分布,而下圖代表的是付費使用者。</p>
<p>台灣在免費使用者的排行是第4,不過在付費使用者卻是名落孫山。這當然不是台灣人不願掏錢買app,而這一切的一切都得感謝 <a href="http://ysl-paradise.blogspot.tw/2011/06/app.html">台北市葉狀師</a> 的用心良苦,用了這破釜沉舟之計,斷了台灣開發者的後路,讓台灣使用者沒法買付費應用,逼得台灣開發者一定得向外賺取外匯所造成的結果。</p>
<p><b>免費應用也能有收入</b></p>
<p>App 2 SD有免費及付費兩種版本,達到千萬下載的,當然指的是免費版。付費版賺的是一次性收入,而免費版賺得的是廣告收入,這是持續性的收入,也就是說只要有人使用你的應用,你就能持續從中收取廣告收益。目前這應用每天有160萬的廣告曝光數,有6500個點擊。</p>
<p><b>支援20種語系</b></p>
<p>要達到千萬的下載,發行英文版是其中一個不可或缺的要件。而且我會建議你第一個語言的版本,一定要是英文版才行,千萬不要抱有先發行中文版再來做英文化的想法。</p>
<p>底下是各語系使用者安裝App 2 SD的百分比數:</p>
<p align=center><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2vEhDF2G23pEzF4hFMNPDJfXmoSVUQKegJVX0FCRuO4dc8l-b-YxVI3ACGD49yKURjP41Wo0EdXgnvZtS-UGqCIRX_P8FjYnu7t5WZGFkjKxHs3XzpqrXosq1EJz8kRccLKn_S1Qzzug/" /></p>
<p>等到你的應用有變身為熱門應用的潛力(下載數達10萬)時,這時你再來依照這圖表,依序為其他地區做本土化的動作。到目前,App 2 SD已經支援多達20種不同語系,這些語系包括有Arabic, Bulgarian, Chinese (Traditional), Danish, Dutch, English, French, Finnish, German, Hebrow, Italian, Japanese, Korean, Polish, Portuguese Brazilian, Romanian, Russian, Spanish, Turkish, Vietnamese。</p>
<p><b>山寨與盜版數也是熱門應用的衡量指標</b></p>
<p>一個熱門的應用,除了帶給你額外的豐厚收入之外,也順道帶來不少的困惱。首先就是山寨App 2 SD的出現(有興趣了解這事始末的,<a href="http://ysl-paradise.blogspot.tw/2011/01/android_25.html">請讀這</a>)。另外就是盜版的盛行,不相信的話,你 google 一下 <a href="https://www.google.com/#hl=zh-CN&sugexp=les%3B&gs_nf=1&cp=10&xhr=t&q=app+2+sd+pro">app 2 sd pro</a>,在第一頁上就可以找到盜版的下載連結。至於要如何保護你的應用,可以參考我在GTUG分享的 <a href="http://www.youtube.com/watch?v=6CkrPy3tOG0">淺談 Android 應用的破解與保護之道</a>。結論當然是不管你如何保護,一定都有破解之法,這保護之事,只要盡力就好。</p>
<p><b>開發熱門應用之最佳實踐</b></p>
<p>我已經在各式社群活動中,分享過無數次類似如何開發熱門應用的主題。如果你沒機會聽過我的演講,請透過瀏覽器連上 <a href="http://goo.gl/T6h5B">http://goo.gl/T6h5B</a> 申請索取「開發熱門應用之最佳實踐」講義。最近坊間有很多人講類似的主題,或是所謂的大師講app行銷的必勝術。可惜多數人講的東西,都是拿行銷學那套來講,講者不是根本沒有開發過app的實際經驗,就是寫過幾個有數萬下載的apps,就自認是app的行銷專家,跑出來誤導app的開發者。我可以很明白地和你講,那些都是垃圾,你不要聽。我講的也是自己的經驗,是大方向,你也只能當參考。真正有用的是,在戰場上應該如何見招拆招,如何對戰的經驗。我不覺得這是你看書或聽幾場演講就可以學得來的。最重要的就是,自己動手寫個實實在在的好應用。只要自己實際走過一趟,你自然會找到屬於你自己的熱門應用最佳實踐之道。</p>
<p><b>下一個千萬下載應用</b></p>
<p>在App 2 SD達成千萬下載之後,如果你問我是否還有下一個千萬下載的應用?如果沒猜錯的話,我想下一個應該是 <a href="https://play.google.com/store/apps/details?id=com.a0soft.gphone.aDataOnOff">省電超人 (2x Battery)</a>。這個應用目前的下載數已經來到350萬,每天下載數接近2萬,應該明年就會完成千萬下載的目標。這個應用的研發與行銷過程也蠻有趣的,等到省電超人達到千萬下載時,我再來與大家共同分享這應用開發期間之種種研發秘辛。</p>
</span>
Unknownnoreply@blogger.com8tag:blogger.com,1999:blog-3402539703993479534.post-31088270413189866302012-04-23T20:02:00.003+08:002012-04-23T20:04:08.638+08:00Android Day 2012大會 @ May<p>Android Day 2012大會 @ May</p>
<p align=center><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw1ViuR0w1DptNLQpuvUNjw3ANnfFQIAzhoYnsMuHOoP6FWHlu-xWBqtAAMbAz5x7X-32UEkkohLSeIu0iWo1uSvIYr84hl9QQiSI1CRNDj9FS030wwy7wv4qI3q1cjuTfRNFK-gYh1NE/s320/AndroidDay2012.jpg" /></p>
<p>今年應 <a href="http://android-day.com/">Android Day</a> 大會的邀請,準備在 <a href="http://android-day.com/%E8%AD%B0%E7%A8%8B5%E6%9C%882%E6%97%A5%E4%B8%89">5/2</a> 給大家 3 場不同層次的演講。上午是 Keynote,講題是「<a href="http://android-day.com/presentation/%E8%BF%8E%E6%8E%A5app%E6%87%89%E7%94%A8%E7%A8%8B%E5%BC%8F%E7%B6%93%E6%BF%9F%E6%99%82%E4%BB%A3">迎接APP新經濟時代</a>」,接下來是名為「Android in Taiwan:Link All Together」的座談會,這兩場主要著重於市場面,是非技術性的演講。下午則是專門探討Android開發的工作坊「<a href="http://android-day.com/presentation/best-practices-for-app-development">開發熱門應用之最佳實踐</a>」。</p>
<p>底下是關於上、下午兩場演講的簡介與大綱:</p>
<span class="fullpost">
<p><b><a href="http://android-day.com/presentation/%E8%BF%8E%E6%8E%A5app%E6%87%89%E7%94%A8%E7%A8%8B%E5%BC%8F%E7%B6%93%E6%BF%9F%E6%99%82%E4%BB%A3">2012年5月2日(三), 09:50–10:30, Keynote: 迎接App新經濟時代</a></b></p>
<p>一場手機應用產業的革命,正在全球蔓延。這個活躍的APP新經濟,即將替創業家創造數以百億美金的新財富,並且改變現有的商業模式規則與版圖。這個行動應用產值,4年成長10倍,只花3年就徹底顛覆人類建立超過10年的使用習慣,面對這樣如野火般的產業革命,你是否已準備好迎接這波新經濟浪潮?</p>
<p>大綱:<ul>
<li>手機與手機應用新經濟</li>
<li>微型應用、微型創業、微型創投</li>
<li>手機應用發展趨勢</li>
</ul></p>
<p><b><a href="http://android-day.com/presentation/%E8%BF%8E%E6%8E%A5app%E6%87%89%E7%94%A8%E7%A8%8B%E5%BC%8F%E7%B6%93%E6%BF%9F%E6%99%82%E4%BB%A3">2012年5月2日(三), 13:20–14:30, 工作坊B(I): 開發熱門應用之最佳實踐</a></b></p>
<p>要開發一個熱門應用,從一開始的應用定位,開發時的技術實現與創新,完成開發後的最佳發佈與宣傳方式,到如何獲利,甚至透過各項數字指標,來擬定後續開發與宣傳計畫之進行,都有許多值得你關注的事項與實踐經驗。2x Battery(省電超人)應用全球下載數已超過200萬,為熱門省電應用之一。在這個工作坊中,主持人將藉由開發2x Battery之實際經驗,與Android應用開發者一同分享與探討,開發熱門應用之最佳實踐方式,以及省電超人開發期間之種種研發秘辛。</p>
<p>大綱:<ul>
<li>產品定位</li>
<li>堅實技術</li>
<li>應用命名</li>
<li>獲利模式</li>
<li>行銷推廣</li>
<li>客戶服務</li>
<li>成效追蹤</li>
</ul></p>
<p>想索取「開發熱門應用之最佳實踐」最新講義,請於 2012/5/10 之前,透過瀏覽器連上 <a href="http://goo.gl/T6h5B">http://goo.gl/T6h5B</a> 申請。</p>
</span>Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-3402539703993479534.post-49386556836951997462012-02-27T10:34:00.003+08:002012-02-27T10:40:19.645+08:00How to install/uninstall app with PackageInstaller?<div style="border:solid 1px #dfdfdf;color:#686868;font:13px Arial"><div style="background-color:#fff;padding:20px;"><table cellpadding=0 cellspacing=0><tr><td style="width:578px;color:#333;font:13px Arial;vertical-align:top;"><div style="padding-bottom:10px">How to install/uninstall app with PackageInstaller?<br />
Ref<wbr>erence: <a href="http://android.amberfog.com/?p=98" class="ot-anchor">http://android.amber<wbr>fog.com/?p=98</a><br />
=======<wbr>====================<wbr>===<br />
String fileName = Environment.getExter<wbr>nalStorageDirectory(<wbr>) + "/myApp.apk";<br />
Intent intent = new Intent(Intent.ACTION<wbr>_VIEW);<br />
intent.setDat<wbr>aAndType(Uri.fromFil<wbr>e(new File(fileName)), "application/vnd.and<wbr>roid.package-archive<wbr>");<br />
startActivity(int<wbr>ent);<br />
===============<wbr>===============<br />
Uri packageURI = Uri.parse("package:c<wbr>om.android.myapp");<br />
I<wbr>ntent uninstallIntent = new Intent(Intent.ACTION<wbr>_DELETE, packageURI);<br />
startAct<wbr>ivity(uninstallInten<wbr>t);<br />
=================<wbr>=============<br />
int result = Settings.Secure.getI<wbr>nt(getContentResolve<wbr>r(), Settings.Secure.INST<wbr>ALL_NON_MARKET_APPS, 0);<br />
if (result == 0) {<br />
// show some dialog here<br />
// ...<br />
// and may be show application settings dialog manually<br />
Intent intent = new Intent();<br />
intent.setAction(Set<wbr>tings.ACTION_APPLICA<wbr>TION_SETTINGS);<br />
startActivity(intent<wbr>);<br />
}<br />
=================<wbr>=============</div></td></tr>
</table></div></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3402539703993479534.post-88918661371127617592012-02-02T11:32:00.000+08:002012-02-02T11:32:08.469+08:00Android 4.0 技術與就業研討會<p align=center><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvz8Plck2gp7c-Yz2L7rTkhds_ocza7bzGBGQ-ndbFLfK8vL5BeHKnADjuVO0hHcX1A7IBSg1_NJYK0WD_H4nz2Sb8_J3XgN5SAm5PoAX2G8rH-Ne6LEezCTTns553tXdVZ9eP3gEorYs/s1600/200X156.gif" border="0" /></p><p>3/7 日下午有個「<a href="http://www.etkb.com.tw/etkb/hurray.jsp?link=8199">Android 4.0 技術與就業研討會</a>」。我講的部分是 Fragments,這是 Android 3/4 中最重要的一個新架構。有興趣的歡迎報迎參加。</p><span class="fullpost"> <br />
<p>這個活動是由台灣知識庫主辦,時間是 3/7 1pm-5:30pm,地點應該就在台北車站附近的開封街一段32號4樓。<br />
</p></span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3402539703993479534.post-21958244612215220192012-01-20T14:31:00.024+08:002012-11-01T12:20:34.421+08:002012 Android 4 手機應用開發課程 @ 台灣<p>2012 mobile app development training courses for Android 4 @ Taiwan</p>
<p align=center><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRlZOZy9qGxrT0l_ew0N2DVqsX1u0Bat5rXT20IdxvzDbje2nPwrU4cpLYmoPdRidb3bNIMDvdm2Eb6asWuVBBt-eMEHFD7k_bec0ymARTFj9HIAyn2S9czHEsNK2Lm70q2R9BxdUKcok/" /></p>
<p>在 2012 年,除了延續 2011 的課程,並將原先的課程內容都改以 Android 4 平台為主之外,還加開了「深入研究Android 4手機應用新架構」這門進階課。</p>
<a name="entry"></a>
<p><b>入門課 - Android應用開發設計實務</b></p>
<blockquote>
<p>首先,我將課程內容都改以 Android 4 平台為主。在這個 Android 入門開發課程中,最重的要的是幫助入門者打好基礎,尤其是 Android 平台的架構,與在該平台上應用程式運作的基礎觀念與原理。這部分要是清楚了,日後遇到問題,要自己找資料解決,也有個方向。另外就是對 ListView 元件的運行原理,也有深入的介紹,ListView 是 Android 眾多 UI 元件中,最常用到的,也是最好用的一個。透過對 ListView 的了解,其他類似的元件如 GridView, Spinner 等由 AdapterView 所延伸的元件,自然也可觸類旁通。</p>
<p><b>課程大綱</b></p>
<ol><li>熟悉 Android 2.X開發環境與Android平台知識</li>
<li>瞭解Android 2.X程式框架</li>
<li>如何有效率的偵錯程式</li>
<li>功能選單之設計與應用</li>
<li>各式使用者介面元件之設計與應用</li>
<li>如何支援多國語言與不同的硬體設備</li>
<li>Intent 的使用</li>
<li>深入剖析 Activity 之運作行為</li>
<li>發佈應用程式與參考資料</li>
</ol>
</blockquote>
<a name="adv1"></a>
<p><b>進階課 I - 深入研究三大元件與桌面小工具之開發</b></p>
<blockquote>
<p>這個課程先帶領你深入研究 Android 三大重要元件 (Actiovity, Service, BroadcastReceiver) 的運作原理,與建立正確的使用觀念。其中我會用將近一天的時間來解釋與剖析 Activity & Service 的生命週期。這部分是對已入門的開發者,最最重要的一部分,卻也是最不容易全盤了解與最容易被忽視的一部分。我試玩過很多應用,也看過不少人的程式,與發問的問題,都是源自於對這部分的了解不夠透徹。BroadcastReceiver e也是最常被使用的元件,在學如何開發桌面小工具之前,如何使用這元件的正確觀念是一定要先建立的。接下來,我會介紹如何開發桌面小工具和多媒體應用。對於已熟悉 Android 應用開發,而想進一步提昇您自身應用開發實力與建立正確觀念的您,這個課程是一定要上的。</p>
<p><b>課程大綱</b></p>
<ol><li>深入研究Android生命週期</li>
<li>如何開發自訂使用者元件</li>
<li>各式繪圖功能之使用與應用</li>
<li>BroadcastReceiver之使用與應用</li>
<li>深入研究Service之使用與應用</li>
<li>如何建立桌面小工具</li>
<li>重力加速感應器的使用與應用</li>
<li>如何播放與錄製多媒體影音</li>
</ol>
</blockquote>
<a name="adv2"></a>
<p><b>進階課 II - 深入研究Android 4手機應用新架構</b></p>
<blockquote>
<p>在這個進階課程中,將介紹並帶領學員深入研究 Android 3、4 新應用架構與 APIs。首先要介紹的就是 Fragments,如果你要將你的應用同時執行在手機與平板上,Fragments 是一定要導入的設計概念。就算你只支援手機應用,新的 Fragments 也有助於將你的應用架構,整理的更模組化與達到高重用性的目的。除此之外,我也將一次介紹 Android 3/4 所加進來的各項重要新功能。</p>
<p><b>課程大綱</b></p>
<ol><li>設計平板與手機應用的最佳策略</li>
<li>- Fragments 簡介</li>
<li>- 深入研究 Fragment 生命週期</li>
<li>- new resource qualifiers</li>
<li>- 同時支援各式螢幕大小不同的設備</li>
<li>支援 Android 3/4 桌面小工具新功能</li>
<li>- 可縮放的桌面小工具</li>
<li>- StackView, ListView</li>
<li>- RemoteViewService</li>
<li>Android 3/4 新功能</li>
<li>- Action bar</li>
<li>- Status bar notifications</li>
<li>- PreferenceActivity, PreferenceFragment</li>
<li>- PopupMenu</li>
<li>- GridLayout</li>
<li>- Drag & Drop</li>
<li>- Copy & Past</li>
</ol>
</blockquote>
<a name="adv3"></a>
<p><b>進階課 III - 雲端/地圖應用開發與原碼解析</b></p>
<blockquote>
<p>在這個進階課程中,我會先介紹如何開發存取網路的 Android 應用。行動網路是智慧型手機的重要特色之一,因此開發具有網路存取功能的應用,也是大家常常會接觸的工作之一。我會在課程中提及如何在 Android 手機平台上,正確執行這項工作。智慧型手機的另項特色,就是 GPS (location-based)。</p>
<p>接下來,我會介紹如何開發地圖 (LBS, location-based) 應用,如何抓取經緯度座標,寫好地圖應用,都是這課程會教的事。</p>
<p>最後,我會花半天的時間,教大家如何讀 Android 應用的源碼,並實際拿個例子來解說。我個人覺得閱讀及追蹤 Android 的原始碼,是提昇你 Android 程式設計功力最好的方式之一。當你已具備 Android 開發基礎的情況下,想要再進一步提升你的程式設計功力,除了要想辦法讓自己多增加些程式設計經驗外,閱讀及追蹤別人寫的程式碼,更是最好的方法。不過網路上,每個人的程式功力高低不同,寫出來的程式也有好有差。讀到不良的程式,看不懂還不打緊,如果誤導你的觀念,那可就得不償失。因此,當你底子還不足以判斷好壞程式時,研讀 Android 原始碼,就是你學習 Android 程式設計時,最好的導師。</p>
<p>在這課程中,也會教授 Android 的第四大重要元件 ContentProvider 的用法,當然也會提及 SQLiteDatabase 這個主題。</p>
<p><b>課程大綱</b></p>
<ol><li>Android雲端應用開發</li>
<li>- 如何開發以網頁(WebView)為基礎的 Android 應用</li>
<li>- Android與WebView間的互相呼叫</li>
<li>- 如何開發Android端網路應用程式,及該注意的要點</li>
<li>- URL, IntentService, HttpClient, AndroidHttpClient</li>
<li>- XML 與 JSON parsers 的使用</li>
<li>Android LBS (地圖)應用開發</li>
<li>- 如何擷取各式地理座標資訊</li>
<li>- 如何開發地圖(MapView)應用</li>
<li>Android原始碼徹底研究</li>
<li>- 如何研讀Android原碼</li>
<li>- 深入研讀Android原碼實例</li>
<li>- SQLiteDatabase, ContentProvider</li>
</ol>
</blockquote>
<p>底下是 2012 年計畫開的課程:</p>
<p>
<table width=100% border=1 style="background-color:#ffffff;color:#000">
<tr style="background-color:#ff9900;color:#000"><td>日期</td><td>地點</td><td>課程名稱</td><td>難易度</td></tr>
<tr style="color:#888"><td>3/28,29<br />
星期三四</td><td>台北</td><td><a href="http://college.itri.org.tw/SeminarView1.aspx?no=23120342&msgno=308709" style="color:#888">Android 4 手機應用開發實務</a><br />
工研院</td><td><a href="#entry" style="color:#888">基礎</a></td></tr>
<tr style="color:#888"><td>4/18,19<br />
星期三四</td><td>台北</td><td><a href="http://college.itri.org.tw/SeminarView1.aspx?no=23120343&msgno=308710" style="color:#888">Android 4 手機應用開發實務</a><br />
工研院</td><td><a href="#adv1" style="color:#888">進階 I</a></td></tr>
<tr style="color:#888"><td>5/5,12<br />
星期六</td><td>新竹</td><td><a href="http://edu.tcfst.org.tw/query_coursedetail.asp?tcfst=yes&courseidori=01W317-1" style="color:#888">Android 4 手機應用開發</a><br />
自強基金會</td><td><a href="#entry" style="color:#888">基礎</a></td></tr>
<tr style="color:#888"><td>5/9,10<br />
星期三四</td><td>台北</td><td><a href="http://college.itri.org.tw/SeminarView1.aspx?no=23120344&msgno=308712" style="color:#888">Android 4 手機應用開發實務</a><br />
工研院</td><td><a href="#adv2" style="color:#888">進階 II</a></td></tr>
<tr style="color:#888"><td>5/23,23<br />
星期三四</td><td>台北</td><td><a href="http://college.itri.org.tw/SeminarView1.aspx?no=23120345&msgno=308713" style="color:#888">Android 4 手機應用開發實務</a><br />
工研院</td><td><a href="#adv3" style="color:#888">進階 III</a></td></tr>
<tr style="color:#888"><td>6/30,7/7<br />
星期六</td><td>新竹</td><td><a href="http://edu.tcfst.org.tw/query_coursedetail.asp?tcfst=yes&courseidori=01W317-2" style="color:#888">Android 4 手機應用開發</a><br />
自強基金會</td><td><a href="#adv1" style="color:#888">進階 I</a></td></tr>
</table></p>
<p><a href="http://ysl-paradise.blogspot.com/2011/02/2011-android-2x.html">2011 在台灣所開的課程</a><p>Unknownnoreply@blogger.com3