怎么办如果“WiFi断开然后蓝牙开启”功能?

时间:2013-11-27 23:57:53

标签: android eclipse methods bluetooth wifi

我一直在寻找无穷无尽的答案。我想创建一个Android应用程序,当WiFi断开连接时打开蓝牙。我开始认为我无法完成。

我认为它会像IF WiFi=Inactive THEN Bluetooth=On< - 理论上 但无处可见。如果有帮助,我将在eclipse中工作并编译最新的4.4。

任何人都可以指出我正确的方向。告诉我我想用什么方法或者怎么做?

其他任何事都让我知道。

2 个答案:

答案 0 :(得分:1)

  

怎么做如果“WiFi断开然后蓝牙开启”功能?

所以这就是我的解决方案:

首先,您需要创建侦听Wi-Fi网络连接更改的机制。是的,我正在谈论具有适当意图过滤器的BrodcastReceiver。因此,首先我们需要定义将监听网络变化的接收器。

我提到了意图过滤器。一目了然的意图过滤器->,您可以将它们想象为“事件”,其中每个接收器可以注册一个或多个事件,当事件被触发并且接收器能够监听它(已分配该事件)将立即被调用

特别是在您的情况下,您需要此事件(通常称为操作)来侦听Wi-Fi连接更改:

<action android:name="android.net.wifi.STATE_CHANGE" />

您可以通过源代码检索相同的操作:

WifiManager.NETWORK_STATE_CHANGED_ACTION

然后你几乎拥有你需要的所有东西。但现在您需要在我们的接收器中检索Wi-Fi连接的实际状态。

答案是使用包含网络信息的 NetworkInfo 类。您可以从上面的操作获得此对象(请参阅答案结尾处的最终源代码)。

这里非常简单,当Wi-Fi状态断开时,您只需启用蓝牙。

以下是最终源代码:

public class NetworkReceiver extends BroadcastReceiver {

   @Override
   public void onReceive(Context context, Intent intent) {

       // action when network connectivity changed
       if (intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {

          // gets network info from intent action
          NetworkInfo ni = intent.getParcelableExtra(
                                          WifiManager.EXTRA_NETWORK_INFO);

           // if network state is disconnecting or disconnected
           if (ni.getDetailedState().equals(DetailedState.DISCONNECTING) 
                    || ni.getDetailedState().equals(DetailedState.DISCONNECTED)) {

              // turns Bluetooth on
           }
       }
   }
}

说明:

1。我已经完成了一些测试,现在我知道在Android中,您只能使用getState()和getDetailedState()来检测网络的这些状态:

CONNECTED CONNECTING DISCONNECTED OBTAINING_IPADDRCAPTIVE_PORTAL_CHECK所有其他州无法正常工作或仅使用某些不太好但我们无法做到的设备什么都没有(谷歌团队除外)。

2。不要忘记为manifest.xml添加适当的权限,以便能够读取网络的当前状态等。

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

3。我建议您查看BroadcastReceiversIntents and Intent Filters以及与Wi-Fi相关的内容。

希望它对你有所帮助。

答案 1 :(得分:0)

确定网络连接何时消失非常容易。所以你在那里一半

代码:

public class NetworkStateReceiver extends BroadcastReceiver {

    private static Set<NetworkStateListener> listeners = new HashSet<NetworkStateListener>();

    public static void clearListeners() {
        listeners.clear();
    }
    public static void addListener(NetworkStateListener listener) {
        listeners.add(listener);
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle extras = intent.getExtras();
        if (extras != null) {
            NetworkInfo ni = (NetworkInfo) extras.get(ConnectivityManager.EXTRA_NETWORK_INFO);
            if (ni != null) {
                for (NetworkStateListener listener : listeners) {
                    listener.stateChanged(ni);
                }
            }
        }
    }

    public interface NetworkStateListener {
        public void stateChanged(NetworkInfo networkInfo);
    }
}

在你的清单中:

<receiver android:name="<your package>.NetworkStateReceiver">
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
        <action android:name="android.intent.action.PACKAGE_RESTARTED"/>
    </intent-filter>
</receiver>