В своем приложении я хочу вести журнал состояния, когда кто-то берет трубку. Функция getState() в операторе switch должна возвращать правильное состояние вызова, но всегда возвращает ноль. Вот мой метод onRecieve():
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){
incomingFlag = false;
String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
Log.i(TAG, "call OUT:"+phoneNumber);
TelephonyManager tm =
(TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);
Log.e("log state", String.valueOf(tm.getCallState()));
switch (tm.getCallState()) {
case TelephonyManager.CALL_STATE_RINGING:
incomingFlag = true;
incoming_number = intent.getStringExtra("incoming_number");
Log.i(TAG, "RINGING :"+ incoming_number);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
if (incomingFlag){
Log.i(TAG, "incoming ACCEPT :"+ incoming_number);
}
break;
case TelephonyManager.CALL_STATE_IDLE:
if (incomingFlag){
Log.i(TAG, "incoming IDLE");
}
break;
default:
Log.e("ds","Error");
}
}
файл манифеста:
<activity android:name = ".MainActivity">
<intent-filter>
<action android:name = "android.intent.action.MAIN" />
<category android:name = "android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name = ".BroadCast" >
<intent-filter>
<action android:name = "android.intent.action.PHONE_STATE" />
</intent-filter>
<intent-filter>
<action android:name = "android.intent.action.NEW_OUTGOING_CALL"/>
</intent-filter>
</receiver>
Разрешения:
<uses-permission android:name = "android.permission.CALL_PHONE"/>
<uses-permission android:name = "android.permission.READ_PHONE_STATE"/>
<uses-permission android:name = "android.permission.PROCESS_OUTGOING_CALLS"/>
Упомянутый выше метод onCreate() находится в отдельном созданном мной классе под названием BroadCast, и я вызываю его, создавая новый экземпляр.
Пожалуйста, дайте мне знать, если потребуется дополнительная информация.
вопрос обновлен бро




Попробуйте использовать BroadcastReceiver для обработки входящего вызова. В вашем onResume настройте приемник
IntentFilter filter2 = new IntentFilter(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
filter2.setPriority(99999);
this.registerReceiver(incomingCallReceiver, filter2);
и обрабатывать его, например
BroadcastReceiver incomingCallReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final Bundle bundle = intent.getExtras();
if (bundle == null) return;
// Incoming call
// Get the state
String state = bundle.getString(TelephonyManager.EXTRA_STATE);
// Process the states
if ((state != null) && (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING))) {
// Ringing State
}
if ((state != null) && (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE))) {
// Idle State
}
if ((state != null) && (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_OFFHOOK))) {
// Offhook State
}
}
};
как я могу получить состояние? Я новичок в BroadcastReceiver.
Информация о состоянии получается через связанные данные EXTRA. Я добавил проверки для ваших исходных состояний.
как насчет разрешений?