Ответ 1
использование рефлексии для доступа к "getITelephony" не будет работать в Android 2.3 +
Ссылка:
Я хочу отключить исходящий вызов в ICS.
Моя проблема прежде всего в том, что я не получаю трансляцию в IC` в Gingerbread, она работает нормально и блокирует вызовы, но в ICS это не радиовещание.
для BroadCast Я создал службу и в том, что я получаю BroadCast из PHONE_STATE
в ICS, но когда я пытаюсь отключить вызов, я получаю ошибку
NO such method name 'getITelephony'
в вызове ICS не отключается.
Я использую следующий код для отключения вызова с помощью BroadCast...
try{
TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
Class c = Class.forName(manager.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
ITelephony telephony = (ITelephony)m.invoke(manager);
telephony.endCall();
} catch(Exception e){
Log.d("",e.getMessage());
}
PhonecallStateBroadcastReceiver.java
с именем пакета package com.android.internal.telephony;
ITelephony.aidl
interface ITelephony
{
boolean endCall();
void answerRingingCall();
void silenceRinger();
}
использование рефлексии для доступа к "getITelephony" не будет работать в Android 2.3 +
Ссылка:
1) Скачайте этот класс: ITelephony
2) Добавьте этот класс .java в свой проект в пакете: com.android.internal.telephony
3) Добавьте это разрешение в манифест:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
И этот приемник в приложении balise:
<receiver android:name=".CallReceiver" >
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
4) Создать класс CallReceiver:
@Override
public void onReceive(Context context, Intent intent) {
ITelephony telephonyService = getTeleService(context);
if(telephonyService!=null) {
try {
String numberCall = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
Log.i("TAG", "CALL NUM: " + numberCall);
if(numberCall.equals(TEST_NUMBER)) {
telephonyService.endCall();
Toast.makeText(context, "END CALL: " + numberCall, Toast.LENGTH_LONG).show();
Log.i("TAG", "END CALL");
} else {
Log.i("TAG", "ACCEPT CALL");
}
} catch (Exception e) {
e.printStackTrace();
Log.i("TAG", "CATCH CALL");
}
}
}
private ITelephony getTeleService(Context context) {
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
try {
Method m = Class.forName(tm.getClass().getName()).getDeclaredMethod("getITelephony");
m.setAccessible(true);
return (ITelephony) m.invoke(tm);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
Класс c = Class.forName( "android.telephony.TelephonyManager" ); это решит вашу проблему для Android 2.3 +