2015-06-09 2 views
2

Я искал и нашел this post полезный при получении номера телефона на моем устройстве. В моем основном файле службы у меня есть общедоступная статическая переменная, которая установлена ​​на номер телефона, найденный с использованием метода в вышеупомянутом сообщении.Получение IMEI и номера телефона без контекста приложения

class MyService extends Service implements... { 
    //Phone number of the device 
    public static String phoneNumber; 

    public void onCreate() { 
     //Grab phone number of device 
     TelephonyManager tMgr = (TelephonyManager)getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE); 
     String mPhoneNumber = tMgr.getLine1Number(); 

     phoneNumber=mPhoneNumber; 
    } 
} 

Я ни в коем случае продвинутый разработчик программного обеспечения, но я знаю, что с использованием открытого статической переменной не является лучшим решением, так как оно может быть изменено вне класса. Этот открытый статический номер телефона обращается в другом классе, который отправляет его на сервер. И доступ к нему осуществляется следующим образом:

String devicePhoneNumber; 
devicePhoneNumber = MyService.phoneNumber; 

Я не придется беспокоиться об этой проблеме, если есть способ, чтобы получить номер телефона и IMEI без использования TelephonyManager, или более конкретно, без необходимости контекста приложения. Если это невозможно, возможно, существует обход для использования публичной статической переменной?

Спасибо за помощь

+1

Тот факт, что вы используете 'MyService.phoneNumber(); 'подразумевает, что у вас есть метод getter. Так почему бы не сделать 'phoneNumber' частным, если он никогда не доступен непосредственно за пределами' MyService'? Кстати, наличие локальной переменной с именем 'mPhoneNumber' выглядит немного странно. Как правило, префикс 'm' используется (если вообще) для полей непубличного класса. – Michael

+2

Короткий ответ - нет, вам нужен объект контекста. Я думаю, что вопрос, который вы должны задать, заключается в следующем: «Как мне получить объект Context, где мне нужно использовать IMEI/номер телефона?» –

+0

@ Майкл Я хотел набрать MyService.phoneNumber; так как это поле. Я исправлю это в редактировании. –

ответ

1

Существует не обходной путь для получения номера телефонов без контекста, поскольку контекст вашего шлюза в телефон пользователя. Это дает вам доступ к хранилищу, местоположение, отображение, почти все.

Если вы используете phonenumber много, я думаю, вы должны сделать геттер для него в mainActivity, вот откуда вы его получите. В вашем методе mainActivity OnCreate() инициализирует

private String phoneNumber; 

быть номер телефона, и в вашем mainActivity сделать

public String getPhoneNumber() 

Чтобы получить доступ к нему из вашей службы, а также в других частях приложения вы можете позвонить

((MainActivityNameHere) getApplicationContext()).getPhoneNumber() 

, если только вы не работаете в статическом методе. Тем не менее, вам все равно нужен доступ к MainActivity. Я обычно делаю это в mainActivity:

private static MainActivity context; 
public void onCreate() { 
    context = this; 
} 

public static getContext() { return context; } 

надеюсь, что синтаксис является правильным, попробуйте сливаясь выше в ваш mainActivity и называя его от службы с

MainActivity.getContext().getPhoneNumber() 
+0

Как бы вы могли получить доступ к getPhoneNumber() из другого класса? getPhoneNumber - это метод экземпляра, и мне кажется странным иметь несколько сервисов MyService? –

+0

это метод экземпляра вашей деятельности, который является дочерним элементом контекста. Каждая часть вашего приложения может получить тот же самый уровень вашей активности, вызвав getApplicationContext() – nchinda2