首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

J2ME 獲取手機 IMEI 與 Cell ID 完全指南:廠商差異與實戰代碼

     編輯:Java 相關知識

在 J2ME 開發中,獲取裝置唯一識別碼(IMEI)與基站標識(Cell ID)是實現裝置綁定、LBS 服務的關鍵。但由於缺乏統一標準,各大手機廠商(Nokia、Sony Ericsson、Motorola、Samsung、Siemens 等)均採用專屬的 System Property 鍵值。本文彙整主流廠商的獲取方式,提供可直接部署的跨平台代碼,並附上測試建議。

核心原理:System.getProperty(key)

J2ME 中無標準 API 獲取 IMEI/Cell ID,唯一途徑是讀取廠商預置的系統屬性。鍵值命名各異,需針對廠商/平台分支處理。

主流廠商鍵值對照表

廠商/平台IMEI 鍵值Cell ID 鍵值LAC 鍵值
Sony Ericssoncom.sonyericsson.imeicom.sonyericsson.net.cellidcom.sonyericsson.net.lac
Nokia (Series 60)phone.imei / com.nokia.IMEI / com.nokia.mid.imeicom.nokia.mid.cellid-
Nokia (Series 40)同上Cell-ID-
Motorolacom.motorola.IMEICellID-
Siemenscom.siemens.imei--
Samsungcom.samsung.imei--
通用備選IMEI--

完整跨平台實現代碼

利用 J2ME Polish 的前置處理指令(#if)實現編譯期分支,生成針對不同廠商的 JAR 包:

public class GetIMEIAndCellId extends MIDlet implements CommandListener {
    // ... 介面初始化代碼省略 ...

    protected void startApp() {
        String imei = "", cellid = "", lac = "";
        String platform = System.getProperty("microedition.platform");

        //#if polish.vendor==Sony-Ericsson
        imei = System.getProperty("com.sonyericsson.imei");
        cellid = System.getProperty("com.sonyericsson.net.cellid");
        lac = System.getProperty("com.sonyericsson.net.lac");
        //#elif polish.vendor==Nokia
        imei = System.getProperty("phone.imei");
        if (empty(imei)) imei = System.getProperty("com.nokia.IMEI");
        if (empty(imei)) imei = System.getProperty("com.nokia.mid.imei");
        //#if polish.group==Series60
        cellid = System.getProperty("com.nokia.mid.cellid");
        //#elif polish.group==Series40
        cellid = System.getProperty("Cell-ID");
        //#endif
        //#elif polish.vendor==Motorola
        imei = System.getProperty("com.motorola.IMEI");
        cellid = System.getProperty("CellID");
        //#elif polish.vendor==Siemens
        imei = System.getProperty("com.siemens.imei");
        //#elif polish.vendor==Samsung
        imei = System.getProperty("com.samsung.imei");
        //#endif

        if (empty(imei)) imei = System.getProperty("IMEI"); // 通用備選

        // 顯示結果
        form.append("Platform: " + platform);
        form.append("IMEI: " + imei);
        form.append("CellID: " + cellid);
        // ...
    }

    private boolean empty(String s) { return s == null || s.trim().isEmpty(); }
    // ... CommandListener 實現省略 ...
}

關鍵注意事項

  1. 簽名權限:部份廠商要求 MIDlet 簽名(Trusted/Manufacturer 域)才能讀取敏感屬性。
  2. null **與空字串**;務必同時檢查,避免顯示 "null" 字串。
  3. 測試設備碎片化:同廠商不同機型鍵值可能不同,必須在實機測試,模擬器通常不支持。
  4. 隱私合規:IMEI 屬個人敏感資訊,現代應用建議改用 UUID 或 Android ID / iOS IDFV 等平台標準識別碼。

擴展資源

隨著 Java ME 退出歷史舞台,本文主要作為維護舊專案或嵌入式系統的參考。新專案請優先採用 Android/iOS 原生平台 API。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved