以下是在 Androdi 1.5 Platform 實現,當初的 MotionEvent 並沒有 Multi-Touch 相關欄位,所以是拿 size(4 bytes) 欄 來替代,現在 2.x 版已經有這些欄位。
2011年11月15日 星期二
[Cupcake] Multi-touch Part1
由於 Android 1.5 還沒支援多點觸控, 對於我們這種看人臉色吃飯的系統廠, 一種方式就是坐以待斃, "要等 Google 之後的版本支援才能做, 目前辦不到"。但 touch panel 明明可以支援到兩點觸控, 所以, 秉持身為 RD 的堅持, 在稍微了解相關的程式碼後, 我們只要稍微修改一下 driver 和 package, 就讓 Android 1.5 的應用程式也可以做到 multi-touch, 底下這張圖顯示底層收到的封包隔式、driver/framework在單指以及雙指的數值表現:
AnalogClock - Matrix Rotation
旋轉
這個範例直接對 Canvas 做旋轉,然後把圖(Drawable)畫上去,就可以達到圖片旋轉的效果。##ReadMore##
廣播
AnalogClock 在類別中宣告一個 BroadcastReceiver 變數,並實作 onReceive,而 IntentFilter 的描述直接在程式碼中,非 AndroidManifest.xml。IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_TIME_TICK); filter.addAction(Intent.ACTION_TIME_CHANGED); filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); getContext().registerReceiver(mIntentReceiver, filter, null, mHandler);
參考資料
Calculate Time Consuming
Java Layer
C++ Layer (#include <utils/Timers.h>)
- Timer
- System Time (?)
- Data Class .. (Link)
C++ Layer (#include <utils/Timers.h>)
- Timer
- DurationTimer
- DurationTimer::start()
- DurationTimer::stop()
- DurationTimer::durationUsecs
[Froyo] Compatibility Test Suite
Android 是一個 Open Source Project,每個人都可以自由修改,也因此市面上有許多 Andorid Device,Google 為了確保 Android 程式可以順利在這些裝置上運行,提供 CTS 這個工具。這在 Android 2.1 版之前是無法自由取得,不過從這個版本開始,可以從這個網頁取得;另外還有簡介。##ReadMore##甚至在 Android Source Code 都可以從 source root 看到 cts/ 這個資料夾,不過我編譯後,雖然成功在 ASOP/out/host/bin 產生 cts 的腳本,但是相關的xml 與 apk 都沒有在 ASOP/out/host/linux-x86/cts 產生。另外,還要下載 SDK,因為會用到 adb 這個工具。
使用方式暫時參考底下的連結,因為還沒有裝置可以親自測試。已經在 NAZ10 上面測試,目前還在跑,我是下載 2.1 版的 sdk 與 cts,然後記得設定 SDK_ROOT,因為會用到 adb,然後執行方式,例如:
保險起見,須先確認 SDK 版本,因為就算是給 2.2 是用,r6 或者 r7 跑出來的相容性測試結果就可能不同。至於要如何判斷正確的 SDK 版本,目前想到的方式是,直接使用 Android source code 編譯出來的 CTS 與 SDK tools,然後去執行它,就會出現 SDK 版本資訊,只是說,可能需要處理一下擺放路徑所造成的錯誤訊息。
參考資料:
- 啟動CTS:./startcts
- 列舉有多少plan可以跑:ls --plan (擺在android-cts/repository/plans)
- 執行某個plan:start --plan VM (執行的對象在android-cts/repository/testcases)
保險起見,須先確認 SDK 版本,因為就算是給 2.2 是用,r6 或者 r7 跑出來的相容性測試結果就可能不同。至於要如何判斷正確的 SDK 版本,目前想到的方式是,直接使用 Android source code 編譯出來的 CTS 與 SDK tools,然後去執行它,就會出現 SDK 版本資訊,只是說,可能需要處理一下擺放路徑所造成的錯誤訊息。
參考資料:
Intent Sample
在同一個 package 中,利用 Intent 啟動另一個 Activity,並透過 Bundle 物件帶參數給他 (下面的例子是送一個字串給接收端的 TextView) ##ReadMore##
<<發送端>>
<<接收端>>
也可以不透過 Bundle,直接 intent.setString() 或 intent.setInt()。另外,在宣告 IntentFilter 時,除了在 AndroidManifest.xml 中定義;也可直接在程式碼中描述。
參考資料
<<發送端>>
Intent intent = new Intent(); intent.setClass(this, IntentReceiving.class); Bundle bundle = new Bundle(); bundle.putString("Receive", "Intent Receiving"); // (Key - Value) intent.putExtras(bundle); startActivity(intent);
<<接收端>>
CharSequence cs; Bundle bundle = this.getIntent().getExtras(); cs = bundle.getString("Receive"); textview.setText(cs);
也可以不透過 Bundle,直接 intent.setString() 或 intent.setInt()。另外,在宣告 IntentFilter 時,除了在 AndroidManifest.xml 中定義;也可直接在程式碼中描述。
參考資料
System Resource
在 framework/base/core/res 有許多已經定義好的資源可以使用,但自己寫得應用程式,通常還是在自己的 res/。##ReadMore##
假設現在我要讓 Settings->Display->Brightness 的 Preference Dialog 出現 Auto Brightness 的 checkbox 和 text。只要在 framework/base/core/res/res/values/config.xml 做修改:
這樣一來,這個 checkbox 和 text 就跑出來了。至於說,為甚麼這樣就會出現,是因為在 BrightnessPreference.java 在建構函式讀取這個變數值,來決定這個 UI 要不要秀出來。
假設現在我要讓 Settings->Display->Brightness 的 Preference Dialog 出現 Auto Brightness 的 checkbox 和 text。只要在 framework/base/core/res/res/values/config.xml 做修改:
<bool name="config_automatic_brightness_available">false</bool>
這樣一來,這個 checkbox 和 text 就跑出來了。至於說,為甚麼這樣就會出現,是因為在 BrightnessPreference.java 在建構函式讀取這個變數值,來決定這個 UI 要不要秀出來。
mAutomaticAvailable = context.getResources().getBoolean( com.android.internal.R.bool.config_automatic_brightness_available);
Thread & Handler
如果在某個 Activity/Service/Class 中使用執行緒,然後,需透過該執行緒來變更/通知某個事件,就可以使用 Handler。##ReadMore##
Message 提供三個公開變數可以傳資料:arg1、arg2 是傳整數,obj 是傳 object type 資料;還有 setData(Bundle) 可以使用,但還沒用過。
參考網址
private static final int LIGHTSENSOR_LUX = 0x101; // 自訂常數 Thread t = new Thread() { public void run() { while (true) { int getLuxValue = 0; Message msg = new Message(); msg.what = LIGHTSENSOR_LUX; msg.arg1 = getLuxValue; handler.sendMessage(msg); try { Thread.sleep(500); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } }; t.start(); private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case LIGHTSENSOR_LUX: Log.e("Test", "Lux Value = "+msg.arg1); break; } super.handleMessage(msg); }
Message 提供三個公開變數可以傳資料:arg1、arg2 是傳整數,obj 是傳 object type 資料;還有 setData(Bundle) 可以使用,但還沒用過。
參考網址
2011年11月10日 星期四
[Froyo] Airplane Mode
Airplane Mode 開啟就會斷掉所有通訊 (BT、WiFi、3G)。在 Android 上,這個功能要能夠正常運作,必須有 3G module。過程如下:
訂閱:
文章 (Atom)