2013-03-22 76 views
3

如何確定該設備確實具有GSM,CDMA或其他蜂窩網絡設備(不僅僅是WiFi)? 我不想檢查當前連接的網絡狀態,因爲設備現在可以脫機。 我不想通過((TelephonyManager)act.getSystemService(Context.TELEPHONY_SERVICE))。getDeviceId()來檢查設備ID,因爲某些設備只會給你多態或僞設備ID。如何查看android設備是否有蜂窩無線電模塊?

實際上,我需要檢查單元設備是否準確跳過TelephonyManager.getDeviceId並在沒有蜂窩無線電的設備上執行Settings.Secure.ANDROID_ID檢查。我至少有一個平板電腦(存儲選項滾動Excel 7「),它會返回不同的IMEI每次你問,但它應該返回null,因爲它沒有單元無線電(這裏的情況相同:Android: getDeviceId() returns an IMEI, adb shell dumpsys iphonesubinfo returns Device ID=NULL)。但我需要有可靠的設備的ID每次我問時間相同。

我很樂意聽聽您的想法!

+0

請重新閱讀此問題。我需要過濾虛擬值,看起來像真的假冒 – Tertium 2013-03-23 21:56:33

回答

1

以防萬一som ebody需要此完整解決方案: 使用反射是因爲某些固件版本上可能不存在某些內容。 MainContext - 主要活動上下文。

static public int getSDKVersion() 
{ 
    Class<?> build_versionClass = null; 

    try 
    { 
     build_versionClass = android.os.Build.VERSION.class; 
    } 
    catch (Exception e) 
    { 
    } 

    int retval = -1; 
    try 
    { 
     retval = (Integer) build_versionClass.getField("SDK_INT").get(build_versionClass); 
    } 
    catch (Exception e) 
    { 
    } 

    if (retval == -1) 
     retval = 3; //default 1.5 

    return retval; 
} 

static public boolean hasTelephony() 
{ 
    TelephonyManager tm = (TelephonyManager) Hub.MainContext.getSystemService(Context.TELEPHONY_SERVICE); 
    if (tm == null) 
     return false; 

    //devices below are phones only 
    if (Utils.getSDKVersion() < 5) 
     return true; 

    PackageManager pm = MainContext.getPackageManager(); 

    if (pm == null) 
     return false; 

    boolean retval = false; 
    try 
    { 
     Class<?> [] parameters = new Class[1]; 
     parameters[0] = String.class; 
     Method method = pm.getClass().getMethod("hasSystemFeature", parameters); 
     Object [] parm = new Object[1]; 
     parm[0] = "android.hardware.telephony"; 
     Object retValue = method.invoke(pm, parm); 
     if (retValue instanceof Boolean) 
      retval = ((Boolean) retValue).booleanValue(); 
     else 
      retval = false; 
    } 
    catch (Exception e) 
    { 
     retval = false; 
    } 

    return retval; 
} 
+0

注意:這似乎只適用於可以撥打實際電話的設備,但大多數3g/4g平板電腦僅具有3g/4g的功能,無法撥打電話。 – 2013-05-10 19:05:27

+0

這就是我需要知道的。因爲沒有收音機的設備往往有假的IMEI,有時候每次詢問 – Tertium 2013-05-15 10:26:53

+0

時都給出不同的imei你好,我現在一直在這個問題上停留4-5天,仍然很困惑。我問[this](http://stackoverflow.com/questions/34223393/will-this-app-show-up-in-the-play-store/34223885?noredirect=1#comment56192462_34223885),答案正是與你的一樣。我仍然不確定try中的代碼的作用。你介意解釋嗎?謝謝! – 2015-12-11 13:21:41

1

如果你在商店發佈,並要限制你的應用程序只可見實際手機,你可以添加一個<uses-feature>到您的清單,要求android.hardware.telephony。看看它是否適用於你documentation

+3

如果你只是想在運行時找到它,而不是過濾它,'PackageManager'和'hasSystemFeature(「android.hardware.telephony」)'會告訴你是否以某種形式提供電話服務。 – CommonsWare 2013-03-22 22:21:58

+0

@jlindenbaum我想支持所有設備。 commonsware,謝謝我會檢查出 – Tertium 2013-03-23 21:59:31

相關問題