setMobileDataEnabled在模拟器上不起作用?

时间:2011-04-18 09:13:03

标签: android android-emulator

我正在尝试使用ConnectivityManager的setMobileDataEnabled方法,出于某种原因,我在我的模拟器和实际设备上得到了不同的结果。 在我的设备(Nexus One,运行CyanogenMod 7.0)上,当调用此函数并正确设置移动数据设置(使用反射获得此功能后)时,它可以正常工作:

ConnectivityManager connService = (ConnectivityManager) p_context.getSystemService(Context.CONNECTIVITY_SERVICE);

if (null != connService)
{
    try
    {
        Method setMobileDataEnabledMethod = connService.getClass().getDeclaredMethod("setMobileDataEnabled", boolean.class);

        if (null != setMobileDataEnabledMethod)
        {
            setMobileDataEnabledMethod.invoke(connService, true);
        }
    }
    catch (Exception ex)
    {
        // Error
    }
}

问题是,当我在模拟器上使用相同的代码时,我遇到以下异常:

java.lang.reflect.InvocationTargetException
    at android.net.ConnectivityManager.setMobileDataEnabled(ConnectivityManager.java:379)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
Caused by: java.lang.SecurityException: Permission denial: writing to secure settings requires android.permission.WRITE_SECURE_SETTINGS
    at android.os.Parcel.readException(Parcel.java:1247)
    at android.os.Parcel.readException(Parcel.java:1235)
    at android.net.IConnectivityManager$Stub$Proxy.setMobileDataEnabled(IConnectivityManager.java:540)

在文档中没有任何地方(我可以找到...)它声明此功能需要“WRITE_SECURE_SETTINGS”权限,我想知道这只是一个模拟器问题,还是我的设备上工作的事实只是一些奇怪的巧合?

1 个答案:

答案 0 :(得分:1)

这是一个安全设置,您需要是具有系统权限的应用程序才能设置此值。为此,您需要使用供应商发布密钥签署您的应用程序,考虑到您拥有如此多的Android版本供应商版本,我不确定它是否是可扩展的解决方案。

相反,您可以尝试提示用户启动该屏幕并设置值。