【问题标题】:Create android AVD without 3G connection创建没有 3G 连接的 android AVD
【发布时间】:2013-03-07 11:20:47
【问题描述】:

我的应用程序中的一个功能通过互联网发送数据。在尝试发送数据之前,我检查是否存在连接:

private boolean isConnected() {
    ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo.State val1 = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();
    NetworkInfo.State val2 = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
    return NetworkInfo.State.CONNECTED.equals(val1) || NetworkInfo.State.CONNECTED.equals(val2);
}

这在模拟器和我测试过的几个真实设备上运行良好。然后我收到了来自客户的错误报告,经调查发现是getState 线上TYPE_MOBILENullPointerException

显然,connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) 在没有 3G 的设备(仅支持 WiFi 的平板电脑)上返回了 null。虽然我在 Nexus 7 模拟器上进行了测试,但没有收到此错误。

因此,我感兴趣的是创建一个明确没有 3G 的 AVD(即仅用于 WiFi 设备的 AVD),以便我可以调查/测试此类场景。我在模拟器选项中没有找到任何东西,但也许我只是在找错地方。这甚至可能吗?

【问题讨论】:

    标签: android android-emulator emulation android-wifi


    【解决方案1】:

    您应该能够更改 AVD 的硬件设置以移除调制解调器。该选项标记为hw.gsmModem,但我相信它会禁用所有“手机数据”连接,而不仅仅是GSM。

    如果您想在不使用 AVD 管理器的情况下更改硬件选项,请编辑 avd 文件夹中的 config.ini 文件。默认情况下,该文件夹位于:

    • Linux/Mac: ~/.android/avd/yourAvdName

    • Windows Vista/7/(8?): C:\Users\.android\yourAvdName

    • Windows XP: C:\Documents and Settings\.android\yourAvdName

    只需添加一行内容:

    hw.gsmModem=no
    

    请参阅herehere 了解更多详情。


    但是,您可以通过在模拟器中按 F8 来关闭 3G 来测试它。我不知道这是否会模拟您正在寻找的 null,但值得一试。

    更多快捷方式请参见here

    【讨论】:

    • 我尝试关闭 3G 数据 - 这模拟关闭手机中的 3G 数据 - 连接信息不为空,而是它的 getState 返回 DISCONNECTED。显然这不是我所追求的。
    • 我什至找不到删除 hw.gsmModem 的位置。最新版本的 ADV 管理器没有给我这些选项。我想,我可以寻找 avd 的 xml,但禁用所有单元格数据对我来说不是一个选项。我想我只会添加对空值的检查。
    • 我暂时没有更新我的 AVD 管理器,但您不需要它来更改选项。已根据说明进行编辑。
    【解决方案2】:

    我不相信有一个简单的解决方案。同时,我采用了如下代码:

    private boolean isConnected(Context context) {
        ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info1 = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        NetworkInfo info2 = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        NetworkInfo.State val1 = (info1 == null ? null : info1.getState());
        NetworkInfo.State val2 = (info2 == null ? null : info2.getState());
        return (info1 != null && NetworkInfo.State.CONNECTED.equals(val1)) || (info2 != null && NetworkInfo.State.CONNECTED.equals(val2));
    }
    

    当接口不存在时,这会处理 null 值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多