【发布时间】:2010-08-18 09:54:37
【问题描述】:
在 Android 手机上,在通话 -> 其他设置 -> 来电显示下
可以隐藏您的来电显示。我想通过我的代码以编程方式执行此操作,但无法找到执行此操作的方法。
我搜索过
android.provider android.telephony
对于 2.1 版本,找不到它。
有人成功解决了这个问题吗?
提前致谢。最好的问候。
【问题讨论】:
标签: android
在 Android 手机上,在通话 -> 其他设置 -> 来电显示下
可以隐藏您的来电显示。我想通过我的代码以编程方式执行此操作,但无法找到执行此操作的方法。
我搜索过
android.provider android.telephony
对于 2.1 版本,找不到它。
有人成功解决了这个问题吗?
提前致谢。最好的问候。
【问题讨论】:
标签: android
在这里,我将描述我尝试过的两种方法。
1.) 可以从您的应用程序显示附加呼叫设置屏幕。尽管它看起来像是设置应用程序的一部分,但事实并非如此。此 Activity 是本机电话应用程序的一部分,可以通过以下意图进行处理:
Intent additionalCallSettingsIntent = new Intent("android.intent.action.MAIN");
ComponentName distantActivity = new ComponentName("com.android.phone", "com.android.phone.GsmUmtsAdditionalCallOptions");
additionalCallSettingsIntent.setComponent(distantActivity);
startActivity(additionalCallSettingsIntent);
然后用户必须手动按下 CallerID 首选项并获得带有 3 个选项的单选按钮。
当我问这个问题时,这实际上并不是我想要实现的。我想避免用户必须选择任何其他选项的步骤。
2.) 当在本地电话应用程序中执行 1.) 中描述的方法时,已使用来自 com.android.internal.telephony.Phone 的函数 setOutgoingCallerIdDisplay()。
这是下一种方法的基础:在此类上使用 Java 反射并尝试使用适当的参数调用函数:
try
{
Class <?> phoneFactoryClass = Class.forName("com.android.internal.telephony.PhoneFactory");
try
{
Method getDefaultPhoneMethod = phoneFactoryClass.getDeclaredMethod("getDefaultPhone");
Method makeDefaultPhoneMethod = phoneFactoryClass.getMethod("makeDefaultPhone" , Context.class);
try
{
makeDefaultPhoneMethod.invoke(null, this);
Object defaultPhone = getDefaultPhoneMethod.invoke(null);
Class <?> phoneInterface = Class.forName("com.android.internal.telephony.Phone");
Method getPhoneServiceMethod = phoneInterface.getMethod("setOutgoingCallerIdDisplay", int.class, Message.class);
getPhoneServiceMethod.invoke(defaultPhone, 1, null);
}
catch (InvocationTargetException ex)
{
ex.printStackTrace();
}
catch (IllegalAccessException ex)
{
ex.printStackTrace();
}
}
catch (NoSuchMethodException ex)
{
ex.printStackTrace();
}
}
catch (ClassNotFoundException ex)
{
ex.printStackTrace();
}
首先我尝试使用 getDefaultPhone(),但我得到了 RuntimeException
“必须从 Looper 线程调用PhoneFactory.getDefaultPhone”
显然,问题在于我试图从不是本机电话应用程序的消息循环中调用此方法。
试图通过制作自己的默认手机来避免这种情况,但这是违反安全规定的:
ERROR/AndroidRuntime(2338): java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.provider.Telephony.SPN_STRINGS_UPDATED from pid=2338, uid=10048
克服(两者)这两种情况的唯一方法是使用与核心系统应用相同的密钥对您的应用进行签名,如下所述
【讨论】:
我不确定这是否是一项全球功能,但澳大利亚手机可以通过在来电者号码前加上 #31# 或 1831 来隐藏他们的号码。这可能不是完美的解决方案,但像这样的前缀可能会在编码过程中满足您的要求。
【讨论】: