【问题标题】:How to programatically hide Caller ID on Android如何以编程方式在 Android 上隐藏来电显示
【发布时间】:2010-08-18 09:54:37
【问题描述】:

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

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

我搜索过

android.provider android.telephony

对于 2.1 版本,找不到它。

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

提前致谢。最好的问候。

【问题讨论】:

    标签: android


    【解决方案1】:

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

    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

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

    Run secure API calls as root, android

    【讨论】:

    • 如何获得与核心系统应用相同的密钥以及如何签署我的应用?
    • 请参考我答案底部的链接。你会在那里找到更详细的讨论。但一般来说,出于安全原因,应该是无法获取它的,除非你正在“烹饪”自己的 Android 系统构建。
    • @Zelimir 你能帮我吗here...
    【解决方案2】:

    我不确定这是否是一项全球功能,但澳大利亚手机可以通过在来电者号码前加上 #31#1831 来隐藏他们的号码。这可能不是完美的解决方案,但像这样的前缀可能会在编码过程中满足您的要求。

    【讨论】:

    • 是的,我知道这一点,但我正在寻找某种方法来通过 Android 系统实现这一点并独立于网络提供商。无论如何,谢谢你的提示。
    猜你喜欢
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    相关资源
    最近更新 更多