2010-08-18 1 views
6

на телефонах Android, под Call -> Дополнительные настройки -> Идентификатор вызывающего абонентаКак программно скрыть идентификатор вызывающего абонента на Android

можно скрыть свой идентификатор вызывающего абонента. Я хочу сделать это программно из своего кода, но не смог найти способ сделать это.

Я искал через

android.provider android.telephony

2,1 выпуска и не смог его найти.

Неужели кто-нибудь успешно решил эту проблему?

Заранее спасибо. С наилучшими пожеланиями.

ответ

1

Здесь я опишу два подхода, которые я пробовал.

1.) Из приложения можно отобразить экран дополнительных вызовов. Хотя похоже, что это часть приложения «Настройки», это неверно. Эта деятельность является частью Native Phone Application, и можно подойти со следующим намерением:

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

«PhoneFactory.getDefaultPhone должен быть вызван из Looper thread»

Очевидно, проблема заключается в том, что я попытался вызвать этот метод из цикла сообщений, который не был одним из приложений для мобильного телефона.

пытался избежать этого, сделав собственный телефон по умолчанию, но это было нарушение безопасности:

ERROR/AndroidRuntime (2338): java.lang.SecurityException: Разрешение отказ: не разрешено отправлять широковещательный android.provider. Телефония.SPN_STRINGS_UPDATED с PID = 2338, UID = 10048

Единственный способ преодолеть (оба) это было бы подписать приложение с тем же ключом, как приложение основных систем, как описано в разделе

Run secure API calls as root, android

+0

Как получить тот же ключ, что и основное системное приложение, и как подписать мое приложение? – pengwang

+0

Пожалуйста, обратитесь к ссылке внизу моего ответа. Там вы найдете более подробное обсуждение. Но, вообще говоря, из-за соображений безопасности его невозможно получить, если вы не «готовите» свою собственную систему Android. – Zelimir

+0

@ Zelimir вы можете мне помочь [здесь] (http://stackoverflow.com/questions/22908750/how-to-know-whether-hiding-caller-id-is-enabled-or-not-in-android) ... – RuntimeException

0

Я не уверен, если это глобальная функция, но австралийские телефоны могут скрыть свой номер предваряя номер вызывающего абонента с # 31 # или . Это может быть не идеальное решение, но такой префикс может работать для ваших требований во время кодирования.

+0

Да, я знаю об этом, но я искал способ сделать это через Android-систему и быть независимым от сети. Во всяком случае, спасибо за подсказку. – Zelimir

Смежные вопросы