《BREW進階與精通——3G移動增值業務的運營、定製與開發》連載之86——不同品牌BREW手機間的應用移植

半吊子全棧工匠發表於2010-11-02

一個應用在不同型別BREW 手機上的移植主要是處理手機之間的差異性,這裡的差異性包括硬體差異性和軟體差異性。硬體差異性是指手機自身的記憶體和儲存空間大小,螢幕尺寸和色深,鍵盤佈局以及手機中的特殊硬體的支援(如照相機,遊戲手柄等)。軟體差異性包括BREW的版本,手機軟體編譯器的版本,一些多媒體編解碼器的異同,以及對某些BREW API是否支援等等。由此可見,瞭解運營商所制定的手機相關規範對移植BREW應用是非常有益的。

            針對手機的硬體差異性,為了減少應用移植中的工作,可以在應用中採用自適應的方法。每個手機都有各自的型別標識——平臺標識,如果應用自身根據平臺標識以及相應硬體資訊動態載入相應的資源,無疑可以實現某些應用的零工作量移植。獲得手機平臺標識和相關硬體資訊的方式之一是使用ISHELL_GetDeviceInfo()ISHELL_GetDeviceInfoEx()

            ISHELL_GetDeviceInfo()可以在 AEE層中查詢有關手機效能的資訊,例如所支援的 RAM 總量、螢幕顯示等其它專案。要獲取 AEEDeviceInfo結構中的 dwNetLinger dwSleepDefer值,在呼叫此函式之前,wStructSize 必須等於sizeof(AEEDeviceInfo)。其中AEEDeviceInfo是這樣一個資料結構:

typedef struct

{

   uint16            cxScreen;         // 實際螢幕大小 (畫素)

   uint16            cyScreen;         // 實際螢幕大小 (畫素)

   uint16            cxAltScreen;      // 第二顯示螢幕的螢幕大小

   uint16            cyAltScreen;      // 第二顯示螢幕的螢幕大小

   uint16            cxScrollBar;      // 標準滾動條的寬度

   uint16            wEncoding;        // 字符集編碼 (AEE_ENC_UNICODE, ....)

   uint16            wMenuTextScroll;  // 應該用於自動滾動的毫秒

   uint16            nColorDepth;      // 色深 (1表示黑色,2表示灰色等)

   EmptyEnum         unused2;

   uint32            wMenuImageDelay;  // 應該用於影像延遲的毫秒

   uint32            dwRAM;            // 已安裝的 RAM 總量 (RAM)

   flg               bAltDisplay:1;    // 裝置具有備選顯示螢幕 (尋呼機)

   flg               bFlip:1;          // 裝置為翻蓋電話

   flg               bVibrator:1;      // 安裝了振動器

   flg               bExtSpeaker:1;    // 安裝了外部揚聲器

   flg               bVR:1;            // V支援語音識別

   flg               bPosLoc:1;        // 支援定位

   flg               bMIDI:1;          // 支援 MIDI 檔案格式

   flg               bCMX:1;           // 支援 CMX 音訊

   uint32            dwPromptProps;    // 預設提示屬性

   uint16            wKeyCloseApp;     // 關閉當前應用的按鍵

   uint16            wKeyCloseAllApps; // 關閉所有應用的按鍵 (預設為 AVK_END)

   uint32            dwLang;           // Resource Loader 使用 (見下方的 AEE_LNG_XXX)

   //

   // 注:要使用以下各欄位,必須先將結構的

   // wStructSize 填用才能將其傳送到 GetDeviceInfo呼叫

   //

   uint16            wStructSize;      // 該結構的大小1

   uint32            dwNetLinger;      // PPP 振鈴定時器 (毫秒)

   uint32            dwSleepDefer;     // 啟用的非睡眠模式 (毫秒)

   uint16            wMaxPath;         // 檔案路徑最大長度

   uint32            dwPlatformID;     // 平臺 ID

} AEEDeviceInfo;

            ISHELL_GetDeviceInfoEx()用於獲取有關裝置的特定資訊(AEEDeviceItem。此函式使用 ID 指定所需的資訊,返回時在緩衝區中包含對應的資訊。這些ID所表示的含義如表15-2所示。

ID的名稱

含義說明

AEE_DEVICEITEM_CHIP_ID

標識晶片組 ID 的字串

AEE_DEVICEITEM_MOBILE_ID

標識手持裝置的移動 ID 的一個 ASCII 字串

AEE_DEVICEITEM_AMR_VOCODER_SUPPORT

是否支援 AMR (Adaptive Multi-Rate) 聲碼器

AEE_DEVICEITEM_EVRC_VOCODER_SUPPORT

是否支援 EVRC(增強型變速率編碼)聲碼器

AEE_DEVICEITEM_IS96_VOCODER_SUPPORT

否支援 QCELP-IS96(8K)Qualcomm 碼激勵線性預測編碼)聲碼器

AEE_DEVICEITEM_IS96A_VOCODER_SUPPORT

否支援 QCELP-IS96A(8K)Qualcomm 碼激勵線性預測編碼)聲碼器

AEE_DEVICEITEM_IS733_VOCODER_SUPPORT

是否支援 QCELP-IS733Qualcomm 碼激勵線性預測編碼)聲碼器

AEE_DEVICEITEM_SMV_VOCODER_SUPPORT

是否支援可選擇模式的聲碼器

AEE_DEVICEITEM_SYS_COLORS_DISP1 AEE_DEVICEITEM_SYS_COLORS_DISP2 AEE_DEVICEITEM_SYS_COLORS_DISP3 AEE_DEVICEITEM_SYS_COLORS_DISP4

返回與特定顯示螢幕關聯的系統顏色列表

AEE_DEVICEITEM_DISPINFO1 AEE_DEVICEITEM_DISPINFO2 AEE_DEVICEITEM_DISPINFO3 AEE_DEVICEITEM_DISPINFO4

返回特定顯示螢幕的相關資訊

AEE_DEVICEITEM_CARRIER_ID

標識手持裝置的運營商 ID 的一個 uint32

AEE_DEVICEITEM_SIDHASH

返回手持裝置的支付帳戶的一個雜湊。 可用於確定是否已更換了支付帳戶,例如在調換了 RUIM 卡時。 請注意,不會返回具體的帳號,而只是返回一個帳戶字串的雜湊。

AEE_DEVICESTATE_KEYS_PRESSED

返回處於按下狀態的按鍵的值

AEE_DEVICESTATE_FLIP_OPEN

在裝置翻蓋處於開啟狀態時返回 TRUE,否則返回 FALSE

AEE_DEVICESTATE_HEADPHONE_ON

如果裝置耳機是開啟的,返回 TRUE,否則返回 FALSE

AEE_DEVICESTATE_KEYGUARD_ON

如果裝置的鍵盤是開啟,將返回 TRUE,否則返回 FALSE

AEE_DEVICESTATE_SPEAKER_ON

如果裝置的揚聲器為開啟則返回 TRUE,否則返回 FALSE

AEE_DEVICEITEM_USER

OEM 定義專案的起始點

15-2:可以用ISHELL_GetDeviceInfoEx()獲取的有關裝置的特定資訊

根據AEEDeviceInfoAEEDeviceItem中的資訊,應用可以做到動態載入資原始檔。當然這些資源資訊也可以儲存在伺服器上,應用程式通過網路通訊的方式獲得這些資源資料,從而完成一個應用在不同手機上的適配。

如果某些手機不支援某些介面,應用程式可以通過判斷該介面是否建立成功獲得該資訊。例如在記憶體沒有問題的情況下,建立IPosDet介面失敗,很可能是由於該手機不支援定位功能造成的。這時,應用程式就應該不提供定位功能,從而成為只具備瀏覽查詢功能的一個LBS應用。

如果是兩臺手機對同一介面的功能存在差異(一般出現在IRingerMgr或者IAddrBook),這時需要應用程式多做一些工作。例如採用一個配置檔案來定義地址簿或者鈴聲目錄中的域,應用程式在啟動時根據手機資訊來讀取配置檔案,這樣就能夠進一步彌補手機間的差異進而很好的實現移植了。

相關文章