如何以编程方式隐藏Android上的来电显示

时间:2010-08-18 09:54:38

标签: android

在Android手机上,在“通话”下 - >其他设置 - >来电显示

可以隐藏您的来电显示。我想从我的代码中以编程方式执行此操作,但无法找到方法来执行此操作。

我搜索了

android.provider android.telephony

2.1发布,但无法找到它。

有人成功解决了这个问题吗?

提前致谢。最好的问候。

2 个答案:

答案 0 :(得分:1)

这里我将描述我尝试过的两种方法。

1。)可以从应用程序中显示“附加呼叫设置”屏幕。虽然它看起来像是Settings应用程序的一部分,但事实并非如此。此活动是本机电话应用程序的一部分,可以按照以下意图进行处理:

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.)中描述的方法时,使用了来自setOutgoingCallerIdDisplay()的函数com.android.internal.telephony.Phone。 这是下一种方法的基础:在此类上使用Java Reflection并尝试使用适当的参数调用该函数:

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”

显然,问题在于我试图从Message Loop中调用此方法而不是Native Phone App。

试图通过制作自己的默认手机来避免这种情况,但这是违反安全规定的行为:

ERROR / AndroidRuntime(2338):java.lang.SecurityException:Permission Denial:不允许从pid = 2338发送广播android.provider.Telephony.SPN_STRINGS_UPDATED,uid = 10048

克服这两种情况的唯一方法是使用与核心系统应用相同的密钥对您的应用进行签名,如

所述

Run secure API calls as root, android

答案 1 :(得分:0)

我不确定这是否是一项全局功能,但澳大利亚手机可以通过在#31# 1831 前面加上来电号码来隐藏其号码。这可能不是一个完美的解决方案,但这样的前缀可能适合您在编码期间的要求。