如何在Android手机上检测移动数据会话的结束

时间:2015-04-07 09:53:05

标签: android session packet telephonymanager phone-state-listener

我希望在给定的时间内记录3G或2G上Android手机的分组数据会话数。

我希望 PhoneStateListeners 中的 TelephonyManager.DATA_DISCONNECTED 事件对应于数据sesion的结束,但它没有,因为我的运营商向我收取会话费用(多次DATA_DISCONNECTED事件后,数据使用后的popUp消息)。

1 个答案:

答案 0 :(得分:0)

您需要使用BroadcastReceiver来监听数据断开事件或数据连接事件。 首先,您需要在AndroidManifest.xml中添加接收器。

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

接下来,您需要创建一个扩展BroadcastReceiver的类,在连接/断开数据时将调用此类。

public class Networkconncted extends BroadcastReceiver {
    public static final String key = "networkInfo";
    public static final String disconnected = "DISCONNECTED";
    public static final String MOB_INT = "mobile";

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle extras = intent.getExtras();
        if (extras != null) {
            String value = extras.get(key).toString();
            Log.v("netappcheck", value);
            String temp[] = value.split(",");
            if (temp[0].toLowerCase().contains(MOB_INT)) //check if mobile n/w
                if (temp[1].contains(disconnected)) {
                    Toast.makeText(context,"data disconnected",Toast.LENGTH_SHORT).show();
                    //do something when data is disconnected
                } else {
                    Toast.makeText(context,"data connected",Toast.LENGTH_SHORT).show();
                    //do something when data is connected
                }
        }
    }
}

当调用broadcastreceiver时,intent.getExtras().get(key)将返回以下值:

[type: MOBILE[EDGE], state: DISCONNECTED/DISCONNECTED, 
reason: (unspecified), extra: airtelgprs.com, roaming: false, 
failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false]

类型字段提到网络类型已连接,当连接/ disconected时,wifi类型将返回WIFI[],当连接到移动网络(3G,EDGE等)时,类型字段将返回MOBILE[]

状态字段提到连接状态。

变量temp []将类型置于第0位,状态位于第1位。我们需要检查其MOBILE是否位于第0位,因为我们只需跟踪移动网络连接。然后检查第1位的状态。

我在Android 5.0.1和Android 4.0.4中测试过它运行正常。 更多信息here