2012-03-21 3 views
3

Когда я запрашиваю информацию о ячейке и LAC, на некоторых устройствах я не могу их восстановить.Android: CellID недоступен на всех носителях?

Я использую этот код:

TelephonyManager tm =(TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
location = (GsmCellLocation) tm.getCellLocation(); 

cellID = location.getCid(); 

lac = location.getLac(); 
  1. Кто-нибудь знает, почему некоторые операторы GSM не обеспечивают их?
  2. Нужны ли мне разрешения для этого?
  3. Что еще нужно знать о возврате CellID и LAC?

ответ

-2

Итак, вы можете попробовать что-то вроде. У меня есть идентификатор ячейки и код области местоположения для GSM. Но для UMTS getCid() возвращает большое число для exple 33 166 248. Поэтому я добавляю оператор modulo (exple xXx.getCid()% 0xffff).

GsmCellLocation cellLocation = (GsmCellLocation)telm.getCellLocation(); 

    new_cid = cellLocation.getCid() % 0xffff; 
    new_lac = cellLocation.getLac() % 0xffff; 
+2

Это неверно. Ответ @ nkout - правильный ответ. –

0

Я думаю, что это связано с тем, как производители внедрили базовый код ядра на устройстве, не позволяя вам получить доступ к определенной информации.

2

Попробуйте использовать PhoneStateListener следующим образом:

Во-первых, создать слушателя.

public PhoneStateListener phoneStateListener = new PhoneStateListener() { 
    @Override 
    public void onCellLocationChanged (CellLocation location) { 
     StringBuffer str = new StringBuffer(); 
     // GSM 
     if (location instanceof GsmCellLocation) { 
      GsmCellLocation loc = (GsmCellLocation) location; 
      str.append("gsm "); 
      str.append(loc.getCid()); 
      str.append(" "); 
      str.append(loc.getLac()); 
      Log.d(TAG, str.toString()); 
      } 
    } 
}; 

А затем зарегистрировать, на OnCreate(), слушатель следующим образом:

telephonyManager = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE); 
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CELL_LOCATION); 

Как указано на documentation, то LISTEN_CELL_LOCATION требует, чтобы добавить следующее разрешение:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
+0

Что такое решение для CDMA? Работает ли он, когда служба определения местоположения отключена? –

+0

@guidomocha, решение аналогично, но система CDMA не содержит LAC, CID, у вас вместо этого есть идентификатор сети и идентификатор системы. Проверьте документацию http://developer.android.com/reference/android/telephony/cdma/CdmaCellLocation.html – Eduardo

17

Чтобы найти CellId, вы должны использовать 0xffff в качестве битовой маски, а не моды.

НЕПРАВИЛЬНО

new_cid = cellLocation.getCid() % 0xffff; 

RIGHT

new_cid = cellLocation.getCid() & 0xffff; 
+1

Правильно. Это должно быть отмечено как ответ. – CodeWarrior

+0

Другими словами, cellLocation.getCid()% 65536 также должен работать. –

0

Вы должны использовать TelephonyManager

TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
    GsmCellLocation cellLocation = (GsmCellLocation) telephonyManager 
      .getCellLocation(); 

    // Cell Id, LAC 
    int cellid = cellLocation.getCid(); 
    int lac = cellLocation.getLac(); 

    // MCC 
    String MCC = telephonyManager.getNetworkOperator(); 
    int mcc = Integer.parseInt(MCC.substring(0, 3)); 

    // Operator name 
    String operatoprName = telephonyManager.getNetworkOperatorName(); 

Для получения разрешения необходимо добавить followin в Manifest.xml файл

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
+0

Что такое решение для CDMA? Работает ли он, когда служба определения местоположения отключена? –

Смежные вопросы