提问人:zzz 提问时间:10/19/2018 最后编辑:halferzzz 更新时间:11/18/2023 访问量:1461
无法在 Espresso 中切换飞行模式 [重复]
Unable to toggle airplane mode in Espresso [duplicate]
问:
我正在尝试在有根模拟器上的 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 脚本,以便打开和关闭飞行模式?
答:
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 上为他们的答案投赞成票
评论
date...
adb shell settings...
adb shell -c