2009-11-23 2 views
60

안드로이드에서 전화 네트워크가 꺼질 때를 확인하고 싶습니다. 그 사건을 포착 할 수 있습니까?네트워크 수신기 안드로이드

올바른 API 또는 동일한 설명을하는 예제가 없습니다. 누군가가했거나 예제 링크가 도움이된다면.

답변

144

새로운 자바 클래스 다음 "매니페스트"요소 아래에 당신의 AndroidManifest.xml에서

public class ConnectionChangeReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); 
    NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo( ConnectivityManager.TYPE_MOBILE); 
    if (activeNetInfo != null) 
    { 
     Toast.makeText(context, "Active Network Type : " + activeNetInfo.getTypeName(), Toast.LENGTH_SHORT).show(); 
    } 
    if(mobNetInfo != null) 
    { 
     Toast.makeText(context, "Mobile Network Type : " + mobNetInfo.getTypeName(), Toast.LENGTH_SHORT).show(); 
    } 
    } 
} 

새로운 XML :

<!-- Needed to check when the network connection changes --> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
"응용 프로그램"요소 아래에 당신의 AndroidManifest.xml에서

새로운 XML :

<receiver android:name="com.blackboard.androidtest.receiver.ConnectionChangeReceiver" 
      android:label="NetworkConnection"> 
    <intent-filter> 
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 
    </intent-filter> 
</receiver> 
+0

안녕하십니까. @noillusioin이 말한대로 – Sam97305421562

+0

님께 감사 드리며, activeNetInfo는 null 일 수 있습니다. 이는 이전에 연결되었다는 것을 (상태 저장) 알면 네트워크 연결이 단지 단절되었음을 나타냅니다. – larham1

+0

또한 NetworkInfo.isConnected를 확인해야합니다. – shuriquen

7

위의 대답은 모바일 패킷 데이터가 활성화 된 경우에만 작동합니다. 그렇지 않으면 ConnectivityManager가 null이되어 더 이상 NetworkInfo를 검색 할 수 없습니다. 대신 PhoneStateListener 또는 TelephonyManager를 사용하는 것이 좋습니다.

16

저는 작은 설정을 사용하여 이미지와 같은 사물의 크기를 조정하는 방법을 결정하기 위해 대역폭을 확인했습니다. AndroidManifest를의 활동에서

:

boolean network; 
int bandwidth; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    ... 
    network = isDataConnected(); 
    bandwidth = isHighBandwidth(); 
    registerReceiver(new BroadcastReceiver() { 
     public void onReceive(Context context, Intent intent) { 
      network = isDataConnected(); 
      bandwidth = isHighBandwidth(); 
     } 
    }, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE")); 
    ... 
} 
... 
private boolean isDataConnected() { 
    try { 
     ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     return cm.getActiveNetworkInfo().isConnectedOrConnecting(); 
    } catch (Exception e) { 
     return false; 
    } 
} 

private int isHighBandwidth() { 
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo info = cm.getActiveNetworkInfo(); 
    if (info.getType() == ConnectivityManager.TYPE_WIFI) { 
     WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
     return wm.getConnectionInfo().getLinkSpeed(); 
    } else if (info.getType() == ConnectivityManager.TYPE_MOBILE) { 
     TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
     return tm.getNetworkType(); 
    } 
    return 0; 
} 

사용 예는 다음과 같습니다 :

if (network) { 
    if (bandwidth > 16) { 
     // Code for large items 
    } else if (bandwidth <= 16 && bandwidth > 8) { 
     // Code for medium items 
    } else { 
     //Code for small items 
    } 
} else { 
    //Code for disconnected 
} 

그것은의 검사가 수행되고있는 활동에

<intent-filter> 
... 
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 
</intent-filter> 

가장 예쁜 것은 아니지만 충분한 유연성을 제공하여 항목 de 대역폭 컷오프를 변경할 수 있습니다. 그들이하는 일과 그들에 대한 나의 요구 사항에 대해 계류 중이다.

+0

발견이 매우 유용, 고마워 :) – Skynet

9

Android Annotations를 사용하여 당신은 당신의 활동이 시도에 대한 옵션이있는 경우 - 그 나머지는 생성, 전부가 :

@Receiver(actions = ConnectivityManager.CONNECTIVITY_ACTION, 
     registerAt = Receiver.RegisterAt.OnResumeOnPause) 
void onConnectivityChange() { 
    //react 
} 

사용이 만 이미 AndroidAnnotations 사용하는 경우 -에만 프로젝트 내에서이 종속성 퍼팅을 이 코드 조각은 과도 할 것입니다.

+0

이 답변에 대한 자세한 설명을 해주실 수 있습니까? 나는 뭔가를 찾으려고 노력했지만 나는 할 수 없었다. Google 어노테이션 라이브러리에는 @Receiver 주석이 없습니다. 감사! – Sniper

+0

안녕하세요, 제 3 자 라이브러리 AndroidAnnotations를 참조합니다. 내 대답을 업데이트합니다. –

+0

네, 맞습니다.이 라이브러리로 가능하며 또한이 https://github.com/jd-alexander/flender가 나쁘지는 않은지 확인했지만 gradle 빌드 1에서만 사용할 수 있습니다.3, 새로운 빌드 gradle 플러그인이 작동하지 않습니다 – Sniper

관련 문제