Здесь я опишу два подхода, которые я пробовал.
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
Как получить тот же ключ, что и основное системное приложение, и как подписать мое приложение? – pengwang
Пожалуйста, обратитесь к ссылке внизу моего ответа. Там вы найдете более подробное обсуждение. Но, вообще говоря, из-за соображений безопасности его невозможно получить, если вы не «готовите» свою собственную систему Android. – Zelimir
@ Zelimir вы можете мне помочь [здесь] (http://stackoverflow.com/questions/22908750/how-to-know-whether-hiding-caller-id-is-enabled-or-not-in-android) ... – RuntimeException