代码之家  ›  专栏  ›  技术社区  ›  Zelimir

如何在Android上编程隐藏来电显示

  •  6
  • Zelimir  · 技术社区  · 15 年前

    有可能隐藏您的来电显示。我想从我的代码编程,但无法找到一种方法来做到这一点。

    我找遍了

    android.telephony

    无法找到它。

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

    提前谢谢。致以最诚挚的问候。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

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

    1.)可以从应用程序中显示其他呼叫设置屏幕。虽然它看起来像是设置应用程序的一部分,但事实并非如此。此活动是本机电话应用程序的一部分,可能出于以下目的:

    Intent additionalCallSettingsIntent = new Intent("android.intent.action.MAIN");
    ComponentName distantActivity = new ComponentName("com.android.phone", "com.android.phone.GsmUmtsAdditionalCallOptions");
    additionalCallSettingsIntent.setComponent(distantActivity);
    startActivity(additionalCallSettingsIntent);
    

    当我问这个问题的时候,这并不是我想要达到的目标。我想避免用户必须选择更多选项的步骤。

    setOutgoingCallerIdDisplay() com.android.internal.telephony.Phone 已使用。 这是下一种方法的基础:在此类上使用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

    "PhoneFactory.getDefaultPhone 必须从循环线程调用“

    显然,问题在于我试图从消息循环调用这个方法,而这个消息循环不是本机电话App one。

    试图通过设置自己的默认电话来避免这种情况,但这违反了安全规定:

    错误/AndroidRuntime(2338):java.lang.SecurityException:权限拒绝:不允许发送广播android.provider.Telephony.SPN_STRINGS_UPDATED 从pid=2338,uid=10048

    Run secure API calls as root, android

        2
  •  0
  •   Rhys    15 年前

    我不确定这是否是一个全球性的功能,但澳大利亚的手机可以隐藏自己的号码,通过前缀来电者的号码 #31# 1831