【问题标题】:How to do If "WiFi disconnects then Bluetooth turns on" function?如果“WiFi断开然后蓝牙打开”功能怎么办?
【发布时间】:2013-12-13 20:37:20
【问题描述】:

我一直在无休止地寻找答案。我想创建一个在 WiFi 断开连接时打开蓝牙的 Android 应用程序。我开始觉得我做不到了。

我认为它会类似于IF WiFi=Inactive THEN Bluetooth=On

谁能指出我正确的方向。告诉我我应该使用什么方法或如何完成?

还有什么要告诉我的。

【问题讨论】:

  • 我认为你可以设置一个广播接收器来监听网络连接的变化。在传入意图中,您可以检查网络状况并在那时进行切换。
  • 啊谢谢我明白了,我现在开始看照片了。我找到了一些广播接收器的信息,我将在今天晚些时候发回更新,非常感谢

标签: android eclipse methods bluetooth wifi


【解决方案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 所有其他状态都不能正常工作或只能工作一些不是很好但我们无能为力的设备(Google 团队除外)。

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相关的东西。

希望对你有帮助。

【讨论】:

  • 嗨,是的,非常感谢,它确实有帮助。我添加了一个 Toast,以便它在收到广播时显示给我。它完美地工作。但是现在一旦收到我的广播,我该如何打开蓝牙。只剩下一部分。感谢先进
  • 这是我尝试的第一件事。它不起作用。它在“REQUEST_ENABLE_BT”上显示Create variableCreate field,还需要在OurReceiver.JavaMainAcitvity.Java 上。感谢您的帮助
  • 好的,我从你给我的代码重新开始。但是if (ni.getDetailedState.equals(DetailedState.DISCONNECTING) 有一个错误提示getDetailedState cannot be resolved or is not a field
  • 请检查您的导入。
【解决方案2】:

确定网络连接何时断开非常容易。所以你已经成功了一半

代码:

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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 2023-03-23
    • 1970-01-01
    • 2021-05-13
    相关资源
    最近更新 更多