4

안드로이드에서 전화 서비스 상태 (IN_SERVICE, OUT_OF_SERVICE, EMERGENCY_ONLY, POWER_OFF)를 얻는 방법을 알고있는 사람이 있습니까?브로드 캐스트 수신자가 ServiceState 정보를 얻습니다.

변경 사항을 확인하는 방송사가 있기를 기대했지만 아무 것도 찾을 수 없습니다. 청취자가 있다는 것을 알고 있지만 WakefulIntentService (thecommonsguy에 의한)를 사용하는 서비스로 실행될 때 내 앱에서 어떻게 사용할지 확신하지 못합니다.

배터리 수준 (예 : BATTERY_LOW, BATTERY_OKAY)과 같이 매우 간단하지만 전화 서비스 변경시 유사한 작업을 수행 할 수 없습니다.

답변

0

독자적인 BroadcastReceiver를 작성할 수 있습니다. (자신의 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; 
} 
: 연결 변경에 대한 알림을

여기에 예를 들어 당신의 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 
} 

} 

,

연결 가능성에 대한 자세한 내용은 NetworkInfo 클래스를 확인하십시오.

는 매니페스트에 ACCESS_NETWORK_STATE의 permisson를 등록하는 것을 잊지 마세요 :

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

도움이 되었기를 바랍니다. 그냥 안드로이드 소스에서 약간의 해킹 아래 서비스 상태 클래스의

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

체크 소스를 사용하여 수신기에 의도를 얻을 때 감사

+0

이유 이거 downvoted? 어떤 아이디어? – cbrulak

+1

아마도 ServiceState가 NetworkState가 아니기 때문일 수 있습니다. ServiceState는 전화 통신 라디오의 상태입니다. 반면 NetworkState는 데이터 연결 상태 (Wi-Fi, WiMAX ... 전화 통신 네트워크가 아님) –

2

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

에 대한 수신기를 등록 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를 확인한 경우 ' "상태"에서 초기화되는 변수를 찾으십시오. 이전 버전이 그렇게합니다. –

+2

4.3과 같이 보입니다. 그들은'state' 키를'voiceRegState'와'dataRegState'로 나눕니다. 운항 중일 때, 두 값 모두 0 ['STATE_IN_SERVICE']이고 비행기 모드에서는 두 값 모두 3 ['STATE_POWER_OFF']입니다. – Chris

+0

그 행동의 이름을 어떻게 알았습니까? 당신은 무엇을 했습니까? 어디에서 보았습니까? – pomber

관련 문제