4

Кто-нибудь знает, как получить статус телефонной службы (IN_SERVICE, OUT_OF_SERVICE, EMERGENCY_ONLY, POWER_OFF) в Android.Broadcastreceiver для получения информации ServiceState

Я надеялся, что будет обнаружен переводчик, чтобы определить изменения, но я ничего не могу найти. Я знаю, что есть слушатель, но я не уверен, как использовать его в своем приложении, поскольку он работает как служба, используя WakefulIntentService (bycommonsguy).

С чем-то вроде уровня заряда батареи (например, BATTERY_LOW, BATTERY_OKAY) это довольно просто, но я просто не могу схожую работу с изменениями в телефонном сервисе.

ответ

0

Вы можете написать собственный BroadcastReceiver. Ваш приемник будет получать изменения подключения и сообщите нужный экземпляр об изменении (например, собственный CommunicationManager):

public class ConnectivityReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    Log.i(getClass().getName(), "A change in network connectivity has occurred. Notifying communication manager for further action."); 
    NetworkInfo info = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); 
    if(info != null) { 
     Log.v(getClass().getName(), "Reported connectivity status is " + info.getState() + "."); 
    } 
    CommunicationManager.updateConnectivityState(); // Notify connection manager 
} 

} 

Например вот ваш экземпляр CommunicationManager, который будет получать уведомления об изменениях подключения:

protected static void updateConnectivityState() 
{ 
    boolean isConnected = false; 
    if (_connec != null && (_connec.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTED) ||(_connec.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED)){ 
     isConnected = true; 
     Log.i(CommunicationManager.class.getName(), "Device is connected to the network. Online mode is available."); 
    }else if (_connec.getNetworkInfo(0).getState() == NetworkInfo.State.DISCONNECTED || _connec.getNetworkInfo(1).getState() == NetworkInfo.State.DISCONNECTED) {    
     isConnected = false; 
     Log.w(CommunicationManager.class.getName(), "Device is NOT connected to the network. Offline mode."); 
    } 
    _isConnected = isConnected; 
} 

Ознакомьтесь с классом NetworkInfo для получения дополнительной информации о наличии возможности подключения.

Не забудьте зарегистрировать ACCESS_NETWORK_STATE в вашем согласия автора манифеста:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 

Я надеюсь, что это помогает. Отношения

+0

почему было ли это вниз? Есть идеи? – cbrulak

+1

Возможно, потому что ServiceState не является NetworkState. ServiceState - это состояние радиотелефонии, в то время как NetworkState предоставит вам состояние соединения данных (которое может быть wifi, wimax ... т.е. НЕ телефонной сетью) –

2

Зарегистрируйте приемник для

public static final String ACTION_SERVICE_STATE_CHANGED = "android.intent.action.SERVICE_STATE"; 

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

public void onReceive(Context context, Intent intent) { 
    int state = intent.getExtras().getInt("state"); 
    if(state == ServiceState.STATE_IN_SERVICE) 
    { 
     //Do whatever you want 
    } 
    } 

проверки источника обслуживания государственного класса http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/telephony/ServiceState.java#ServiceState.setFromNotifierBundle%28android.os.Bundle%29

+2

, что часть кода не работает с API> = 4.3, поскольку это дополнительное больше не используется. Если вы посмотрите http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r1/android/telephony/ServiceState.java#ServiceState.0mVoiceRegState, вы выиграли ' t найти любую переменную, инициализированную из «состояния» дополнительно. Старые версии делают это. –

+2

Похоже, что для 4.3 они разделили ключ 'state' на' voiceRegState' и 'dataRegState'. При обслуживании оба значения равны 0 ['STATE_IN_SERVICE'] и в режиме самолета оба значения равны 3 [' STATE_POWER_OFF']. – Chris

+0

Не могли бы вы рассказать мне, как вы нашли имя этого действия? Что вы искали в Google или где вы смотрели? – pomber