【问题标题】:Android. How to get mobile internet(data network) turned on/off state?安卓。如何获得移动互联网(数据网络)的开启/关闭状态?
【发布时间】:2015-04-03 18:00:25
【问题描述】:

我正在尝试创建这样的按钮(如果移动网络打开它是绿色的,当它关闭时它是灰色的):

我正在尝试使用这种方法来识别状态:

public Boolean isDataNetworkEnabled() {

    ConnectivityManager conMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

    if ( conMgr.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED
            || conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTING) {
        return true;
    }

    if ( conMgr.getNetworkInfo(0).getState() == NetworkInfo.State.DISCONNECTED
            || conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.DISCONNECTED) {
        return false;
    }

    return false;
}

它总是返回值'false'。即使在移动网络打开后。实际上,如何识别移动网络的状态?

附言。我不是在问如何打开/关闭移动网络,而是在问状态。我已经找到了如何打开/关闭:

try {
                    Method dataMtd = ConnectivityManager.class.getDeclaredMethod("setMobileDataEnabled", boolean.class);
                    if (!isDataNetworkEnabled()) {
                        dataMtd.invoke(dataManager, true);
                        ivDataNetwork.setImageResource(R.drawable.ic_data_usage_black_48dp);
                        Toast.makeText(context, "Data network turned on", Toast.LENGTH_SHORT).show();
                    } else {
                        dataMtd.invoke(dataManager, false);
                        ivDataNetwork.setImageResource(R.drawable.ic_data_usage_grey600_48dp);
                        Toast.makeText(context, "Data network turned off", Toast.LENGTH_SHORT).show();
                    }
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                }

【问题讨论】:

  • 确保您的清单中有
  • @Ashton,我有这些权限:

标签: android networking mobile


【解决方案1】:

最佳实践是使用广播接收器

在manifest.xml中注册reciever

<receiver android:name="com.example.broadcastreciever2.NetworkChangeReciever" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
        </receiver>

同时添加

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

定义你的接收者(根据你的用途使用)

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class NetworkChangeReciever extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub

        if (checkInternet(context)) {
            Toast.makeText(context, "Network Available Do operations",
                    Toast.LENGTH_LONG).show();
        }

    }

    boolean checkInternet(Context context) {
        ServiceManager serviceManager = new ServiceManager(context);
        if (serviceManager.isNetworkAvailable()) {
            return true;
        } else {
            return false;
        }
    }

}

通过扩展 ContextWrapper 来定义 ServiceManager

import android.content.Context;
import android.content.ContextWrapper;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

public class ServiceManager extends ContextWrapper {

public ServiceManager(Context base) {
    super(base);
}

public boolean isNetworkAvailable() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = cm.getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isConnected()) {
        return true;
    }
    return false;
}

}

【讨论】:

  • 我应该使用哪种方法来识别状态:isNetworkAvailable from service 还是 checkInternet from receiver?这仅适用于移动网络吗?因为我不想和wifi结合或混淆
  • IsNetworkAvailable 不监听网络可用性。您需要在网络可用时收听。我建议使用上述方法。
  • 具体来说,使用.isConnectedOrConnecting();意味着你必须轮询(设置一个定时器,继续调用这个方法来判断网络是否可用)网络连接:使用广播接收器意味着你的应用会当网络状态改变时自动更新——这就是你想要保持按钮状态准确的原因。网络类型仅由您传递给连接管理器的参数确定。
【解决方案2】:

替换一些值...

 if ( conMgr.getNetworkInfo(TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED
            || conMgr.getNetworkInfo(TYPE_WIFI).getState() == NetworkInfo.State.CONNECTING) {
        return true;
    }

    if ( conMgr.getNetworkInfo(TYPE_MOBILE).getState() == NetworkInfo.State.DISCONNECTED
            || conMgr.getNetworkInfo(TYPE_WIFI).getState() == NetworkInfo.State.DISCONNECTED) {
        return false;
    }

因此,您实际上是在检查移动数据是否已连接,或者 wifi 是否正在连接。看来你不要wifi了,把TYPE_WIFI改成TYPE_MOBILE

实际上这样做可能会更好:

public boolean isMobileDataNetworkAccessable() {
  return conMgr.getNetworkInfo(NetworkType.TYPE_MOBILE).isConnectedOrConnecting();
}

【讨论】:

  • wifi 切换按钮工作正常,现在我正在使用移动网络
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多