3

我正在研究一个使用 Robotium 框架自动验证 AUT 的活动检测测试用例。我想自动化几个语言测试。我试图通过 Robotium 更改语言,方法是从 AUT 中提取资源并将本地语言环境配置强制为不同的语言,但无济于事:

    Locale locale = new Locale(lang);
    Locale.setDefault(locale);
    Configuration config = res.getConfiguration();      
    config.locale = locale;
    res.updateConfiguration(config, res.getDisplayMetrics());

我还听说过去可以使用活动管理器使用 ADB 更改语言,但我一直无法找到适用于 V4.2.2 的有效解决方案。除了在应用程序本身中嵌入代码或使设备生根之外,有没有办法通过 Robotium 或其他方式远程更改语言环境?

提前致谢

4

2 回答 2

2

前段时间我遇到了类似的问题,并得出以下解决方案:

private void changeActivityLocale(final Activity a, String locale ){
    Resources res = a.getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    Configuration conf = res.getConfiguration();
    conf.locale = new Locale(locale);
    res.updateConfiguration(conf, dm);
    a.getResources().updateConfiguration(conf, dm);

    getInstrumentation().runOnMainSync(new Runnable() {
        public void run() {
            a.recreate();
        }
    });
}

在开始一些特定于语言环境的测试之前,我在我的测试用例中调用了这个方法。希望它可以帮助你。

此致,

彼得

于 2013-09-18T21:05:23.650 回答
1
protected void changeLocale(Locale locale)
        throws ClassNotFoundException, SecurityException,
        NoSuchMethodException, IllegalArgumentException,
        IllegalAccessException, InvocationTargetException,
        NoSuchFieldException {       
    @SuppressWarnings("rawtypes")
    Class amnClass = Class.forName("android.app.ActivityManagerNative");
    Object amn = null;
    Configuration config = null;

    // amn = ActivityManagerNative.getDefault();
    Method methodGetDefault = amnClass.getMethod("getDefault");
    methodGetDefault.setAccessible(true);
    amn = methodGetDefault.invoke(amnClass);

    // config = amn.getConfiguration();
    Method methodGetConfiguration = amnClass.getMethod("getConfiguration");
    methodGetConfiguration.setAccessible(true);
    config = (Configuration) methodGetConfiguration.invoke(amn);

    // config.userSetLocale = true;
    @SuppressWarnings("rawtypes")
    Class configClass = config.getClass();
    Field f = configClass.getField("userSetLocale");
    f.setBoolean(config, true);

    // set the locale to the new value
    config.locale = locale;

    // amn.updateConfiguration(config);
    Method methodUpdateConfiguration = amnClass.getMethod(
            "updateConfiguration", Configuration.class);
    methodUpdateConfiguration.setAccessible(true);
    methodUpdateConfiguration.invoke(amn, config);
}

您将需要在您的应用程序中获得许可:

android.permission.CHANGE_CONFIGURATION

对于 api 级别 >= 17,您必须通过 adb 授予它:

adb shell pm grant application_package android.permission.CHANGE_CONFIGURATION
于 2013-09-18T21:18:16.850 回答