我有自动化的 UI android 仪器测试,需要为特定的测试用例打开/关闭 Wifi。我认为这将是小菜一碟,但我遇到了一些麻烦。我需要在我的测试代码的清单 APK 中拥有打开/关闭系统服务的权限。我不想修改我正在测试的应用程序的清单。
这是我的测试代码的 AndroidManifest.xml:
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application android:label="UI Tests">
<uses-library android:name="android.test.runner"/>
</application>
<instrumentation android:name="com.mycompany.test.InstrumentationTestRunner"
android:targetPackage="com.mycompany"
android:label="UI Tests"/>
当我看到安装的测试 apk 时,它肯定在实际设备上拥有所有这些权限。
现在这是我尝试设置 Wifi 状态的代码...
WifiManager wifi = (WifiManager) getInstrumentation().getContext().getSystemService(Context.WIFI_SERVICE);
if ((!wifiEnabled) && (wifi.getWifiState() != WifiManager.WIFI_STATE_DISABLED)){
mTestLogger.logMsg("Turning off wifi");
wifi.setWifiEnabled(false);
sleep(3000);
}
我认为这段代码是正确的。getInstrumentation().getContext() 是测试代码的 apk 的上下文。但是,当它遇到 wifi.setWifiEnabled(false) 时,它会引发异常:
java.lang.SecurityException:WifiService:用户 10145 和当前进程都没有 android.permission.CHANGE_WIFI_STATE。
知道我做错了什么吗?清单显然有 CHANGE_WIFI_STATE 并且我在设备上确认权限设置正确。
我必须有错误的上下文。getInstrumentation().getContext().getApplicationInfo() 为我的测试 apk 提供了正确的信息。所以它看起来对我来说是正确的。