Использование диспетчера телефонии в Android для поиска номера IMEI

Я очень новичок в разработке Android. Я хочу найти номер IMEI телефона и использовать «android.telephony.TelephonyManager;».

TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.getDeviceId();

Теперь компилятор говорит. Контекст не может быть преобразован в переменную. Кто-нибудь может мне помочь? Какой шаг я пропустил? Я также включил разрешение пользователя в XML.


person Arsalan    schedule 22.09.2011    source источник


Ответы (6)


Проверьте свой импорт, вы должны импортировать: android.content.Context,

И затем используйте этот код:

TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
// get IMEI
String imei = tm.getDeviceId();
//get The Phone Number
String phone = tm.getLine1Number();

Или напрямую: используйте это:

TelephonyManager tm = (TelephonyManager) getSystemService(android.content.Context.TELEPHONY_SERVICE);

EDIT: *вы должны передать контекст вашему новому классу в конструкторе:*

public class YourClass {
    private Context context;

    //the constructor 
    public YourClass( Context _context){

        this.context = _context;
        //other initialisations .....

    }

   //here is your method to get the IMEI Number by using the Context that you passed to your class
   public String getIMEINumber(){
       //...... place your code here 
   }

}

И в своей деятельности создайте экземпляр своего класса и передайте ему контекст следующим образом:

YourClass instance = new YourClass(this);
String IMEI = instance.getIMEINumber();
person Houcine    schedule 22.09.2011
comment
сейчас все в порядке, но в следующий раз сначала внимательно прочитайте вопрос, а затем дайте правильный ответ - person Niranj Patel; 22.09.2011
comment
я внимательно прочитал вопрос, я прочитал его до того, как он был отредактирован, и вопрос был: получить номер IMEI, и это не более подробно :) - person Houcine; 22.09.2011
comment
ему задали вопрос с образцом кода, о котором сейчас идет речь, но он был не в хорошем формате, поэтому я просто добавил его вопрос... но он задал вопрос с образцом кода... и еще кое-что, брат, я не хочу с тобой драться. просто ничего другого не предлагаю.. - person Niranj Patel; 22.09.2011
comment
лол , я тоже , я не буду с тобой драться , давай !!! Я просто говорю вам, что внимательно прочитал вопрос, и спасибо за ваши предложения :) - person Houcine; 22.09.2011
comment
Спасибо всем, я не импортировал android.content.Context. - person Arsalan; 22.09.2011
comment
но теперь говорит getSystemService... Метод getSystemService(String) не определен для типа - person Arsalan; 22.09.2011
comment
Вы вызываете свой код в методе onCreate() вашей Activity? если да, попробуйте заменить getSystemService() на this.getSystemService(String) - person Houcine; 22.09.2011
comment
он отлично работает с методом onCreate. но что я делаю, так это то, что эта функция вызывается в другом классе, который я создал - person Arsalan; 22.09.2011
comment
в этом случае вы должны передать контекст своему новому классу, см. мое редактирование - person Houcine; 22.09.2011

Добавьте в этот код:

 TelephonyManager manager=(TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
 String deviceid=manager.getDeviceId();

//Device Id is IMEI number

  Log.d("msg", "Device id"+deviceid);

Манифест

   <uses-permission android:name="android.permission.READ_PHONE_STATE" />
person Sanket    schedule 26.06.2012

Попробуйте приведенный ниже фрагмент кода, который поможет вам получить номер IMEI устройства.

public String getDeviceID() { 
    String deviceId;   
    TelephonyManager mTelephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        if (mTelephony.getDeviceId() != null) {
            deviceId = mTelephony.getDeviceId(); 
        } else {
            deviceId = Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID); 
        }
    return deviceId;
}

Также дайте разрешение на чтение состояния телефона в манифесте.

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
person Ahsan Kamal    schedule 02.11.2015

просто удалите Context ключевое слово в Context.TELEPHONY_SERVICE и проверьте

TelephonyManager tManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);

String IMEI = tManager.getDeviceId();
person Niranj Patel    schedule 22.09.2011

Для ошибки компилятора «Контекст не может быть преобразован в переменную» убедитесь, что вы импортировали пакет android.content.Context.
В Eclipse для быстрых исправлений это происходит, когда вы наводите указатель мыши на строку с ошибкой в ​​коде.
И убедитесь, что вы добавили файл манифеста разрешений READ_PHONE_STATE.

person Karthik    schedule 22.09.2011

[На случай, если кто-то все еще наткнется здесь в поисках этого все еще существующего векового решения]

Насколько мне известно, TelephonyManager.getLine1Number() ненадежен из-за различных ограничений со стороны операторов. Существуют некоторые хаки на основе отражения Java, но они варьируются от устройства к устройству, что делает эти хаки бесполезными [по крайней мере, с точки зрения поддерживаемых моделей]

Но есть законная законная логика найти номер, если вам это очень нужно. Запросите все SMS по смс-провайдеру и получите номер «Кому».

Дополнительные преимущества этого трюка: 1. Вы можете получить все номера линий, если в устройстве есть мультисим.

Минусы: 1. вам потребуется разрешение SMS_READ [извините за это] 2. Вы получите все номера сим-карт, которые когда-либо использовались в устройстве. эту проблему можно минимизировать с помощью некоторой логики ограничений, например. временные рамки (смс получены или отправлены только сегодня) и т.д. Было бы интересно услышать от других о том, как улучшить это дело.

person Amit K. Saha    schedule 07.01.2015