问题描述: 在Android仪表化测试中,模拟位置不起作用,即使已经设置了testLocation,返回的结果仍为空(null)。
解决方法:
确保已经添加了模拟位置的权限: 在AndroidManifest.xml文件中,添加以下权限:
确保已经设置了模拟位置的Provider: 在AndroidManifest.xml文件中,添加以下代码:
在测试代码中,确保已经启用了模拟位置:
// 启用模拟位置
InstrumentationRegistry.getInstrumentation().getUiAutomation()
.executeShellCommand("settings put secure mock_location 1");
// 设置模拟位置
Location location = new Location("MockProvider");
location.setLatitude(latitude);
location.setLongitude(longitude);
location.setAccuracy(1.0f);
location.setTime(System.currentTimeMillis());
location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
// 发送模拟位置
InstrumentationRegistry.getInstrumentation().getUiAutomation()
.executeShellCommand("service call location 42 i32 0 i32 0 f64 " +
location.getLatitude() + " f64 " + location.getLongitude() + " f32 " +
location.getAccuracy() + " i64 " + location.getTime() + " i64 " +
location.getElapsedRealtimeNanos());
确保应用程序在测试期间已经启动: 在测试代码中,确保已经启动了应用程序:
// 启动应用程序
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
Intent intent = appContext.getPackageManager().getLaunchIntentForPackage(appContext.getPackageName());
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
appContext.startActivity(intent);
确保测试设备已经设置了开发者选项中的"允许模拟位置"选项: 在设备的设置中,找到开发者选项,确保"允许模拟位置"选项已经启用。
通过以上步骤,您应该能够解决Android仪表化测试中模拟位置不起作用的问题,并获取正确的位置信息。