我正在尝试使用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”权限,我想知道这只是一个模拟器问题,还是我的设备上工作的事实只是一些奇怪的巧合?
答案 0 :(得分:1)
这是一个安全设置,您需要是具有系统权限的应用程序才能设置此值。为此,您需要使用供应商发布密钥签署您的应用程序,考虑到您拥有如此多的Android版本供应商版本,我不确定它是否是可扩展的解决方案。
相反,您可以尝试提示用户启动该屏幕并设置值。