无法在 Espresso 中切换飞行模式 [重复]

Unable to toggle airplane mode in Espresso [duplicate]

提问人:zzz 提问时间:10/19/2018 最后编辑:halferzzz 更新时间:11/18/2023 访问量:1461

问:

我正在尝试在有根模拟器上的 Kitkat 版本上切换飞行模式。我正在使用 Espresso 进行自动化,并且我遇到了必须打开飞行模式并在应用程序中执行某种步骤的情况。

我使用以下方法修改了时间:

public static void amTime() {

        try {
            Process su = Runtime.getRuntime().exec("su");
            DataOutputStream outputStream = new DataOutputStream(su.getOutputStream());

            outputStream.writeBytes("date -s 20181015.070000");
            outputStream.flush();

            outputStream.writeBytes("exit\n");
            outputStream.flush();
            su.wait(2000);
        } catch (Exception e){
            Log.e("Set Time", e.getMessage());
        }
    }

但是我无法切换到飞行模式,我尝试了不同的模式......使用上述方法并使用 adb 命令修改以下行

outputStream.writeBytes("mode airplane_mode_on 1");

outputStream.writeBytes("adb shell -c settings put global airplane_mode_on 1");

outputStream.writeBytes("adb shell -c settings put global airplane_mode_on 0");

如何修改代码或 adb 脚本,以便打开和关闭飞行模式?

Android 自动化 adb android-espresso

评论

0赞 TDG 10/19/2018
最后两个命令对我来说似乎没问题,但是为什么您设置时间使用并尝试设置飞行模式?您是否尝试从 outputStream 中的字符串中删除?date...adb shell settings...adb shell -c
0赞 zzz 10/19/2018
是的,尝试过 outputStream.writeBytes(“settings put global airplane_mode_on 1”);...它仍然没有更改为飞行模式。
0赞 TDG 10/20/2018
我用物理设备尝试过 - 设备的图标没有改变,但设备本身进入了飞行模式。再试一次,然后尝试打开移动数据。就我而言,我收到一条消息,说在飞行模式下无法打开移动数据。
0赞 zzz 10/20/2018
它不起作用
2赞 halfer 11/18/2023
这看起来像是以下代码的副本:在模拟器上使用 Espresso 在 Android Studios 中测试互联网连接错误处理。下面给出了最近的答案(以及类似的相关问题),向我表明我们应该关闭几个问题,以支持此处提议的重复。

答:

1赞 zzz 11/21/2018 #1

只需按如下方式创建方法,并在需要时调用:

public static void setMobileDataEnabled(Context context, boolean enabled) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        final ConnectivityManager conman = (ConnectivityManager)  context.getSystemService(Context.CONNECTIVITY_SERVICE);
        final Class conmanClass = Class.forName(conman.getClass().getName());
        final Field connectivityManagerField = conmanClass.getDeclaredField("mService");
        connectivityManagerField.setAccessible(true);
        final Object connectivityManager = connectivityManagerField.get(conman);
        final Class connectivityManagerClass =  Class.forName(connectivityManager.getClass().getName());
        final Method setMobileDataEnabledMethod = connectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
        setMobileDataEnabledMethod.setAccessible(true);

        setMobileDataEnabledMethod.invoke(connectivityManager, enabled);
    }

调用方法:

try {
    CommonUtil.setMobileDataEnabled(mActivityTestRule.getActivity().getApplicationContext(),true);
} catch (ClassNotFoundException e) {
    e.printStackTrace();
} catch (NoSuchFieldException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (NoSuchMethodException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    e.printStackTrace();
}

请注意,这将设置启用数据 = 关闭。这是我的要求。

-1赞 Adam Burley 8/7/2023 #2

我从@Illyct中找到了另一种解决方案:

InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("svc data disable")

请在 https://stackoverflow.com/a/64765567/191761 上为他们的答案投赞成票