Pages

2011年11月15日 星期二

[Cupcake] Multi-touch Part2

以下是在 Androdi 1.5 Platform 實現,當初的 MotionEvent 並沒有 Multi-Touch 相關欄位,所以是拿 size(4 bytes) 欄 來替代,現在 2.x 版已經有這些欄位。

[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
  • Timer
    • System.nanoTime .. (Link)
    • SystemClock.uptimeMillis .. (Link)
    • SystemClock.elapsedRealtime .. (Link)
  • System Time (?)
    • Data Class .. (Link
##ReadMore##
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,然後執行方式,例如:
  1. 啟動CTS:./startcts
  2. 列舉有多少plan可以跑:ls --plan (擺在android-cts/repository/plans)
  3. 執行某個plan:start --plan VM   (執行的對象在android-cts/repository/testcases)
        其他用法,就參考底下連結吧!執行後的結果會放在 android-cts/repository/results,但我沒去研究 result 都寫些甚麼。

        保險起見,須先確認 SDK 版本,因為就算是給 2.2 是用,r6 或者 r7 跑出來的相容性測試結果就可能不同。至於要如何判斷正確的 SDK 版本,目前想到的方式是,直接使用 Android source code 編譯出來的 CTS 與 SDK tools,然後去執行它,就會出現 SDK 版本資訊,只是說,可能需要處理一下擺放路徑所造成的錯誤訊息。

參考資料:

Intent Sample

        在同一個 package 中,利用 Intent 啟動另一個 Activity,並透過 Bundle 物件帶參數給他 (下面的例子是送一個字串給接收端的 TextView) ##ReadMore##

<<發送端>>
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 做修改:
<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##
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) 可以使用,但還沒用過。

參考網址

  • 利用 Handler 來更新 Android UI .. (Link)
  • Andorid Developer Messge .. (Link)
  • Andorid Developer Handler .. (Link)
  • Why isn't the thread stopping .. (Link)
  • 背景執行服務(Service) .. (Link)

2011年11月10日 星期四

[Froyo] Airplane Mode

        Airplane Mode 開啟就會斷掉所有通訊 (BT、WiFi、3G)。在 Android 上,這個功能要能夠正常運作,必須有 3G module。過程如下:

 
Blogger Templates