3

我有自动化的 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 提供了正确的信息。所以它看起来对我来说是正确的。

4

1 回答 1

2

这是有道理的。AContext带有一组权限。根据您的解释,getInstrumentation().getContext()返回正在测试的应用程序的上下文以及该应用程序的权限。如果您使用该上下文来操作 wifi 并且应用程序没有适当的权限,则无论您自己的权限如何,操作都会失败。

于 2014-07-12T20:12:03.200 回答