Android: CellID доступен не на всех носителях? - PullRequest
3 голосов
/ 21 марта 2012

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

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

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

cellID = location.getCid();

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

Ответы [ 5 ]

18 голосов
/ 19 октября 2012

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

НЕПРАВИЛЬНО

new_cid = cellLocation.getCid() % 0xffff;

ПРАВО

new_cid = cellLocation.getCid() & 0xffff;
2 голосов
/ 02 апреля 2012

Попробуйте использовать 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);

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

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
0 голосов
/ 31 января 2014

Вам необходимо использовать 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();

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

 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
0 голосов
/ 30 марта 2012

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

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

    new_cid = cellLocation.getCid() % 0xffff;
    new_lac = cellLocation.getLac() % 0xffff;
0 голосов
/ 21 марта 2012

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

...