Как получить состояние исходящего звонка в телефоне Android? - PullRequest
6 голосов
/ 20 мая 2010

Я заметил, что в классе TelephonyManager есть CALL_STATE_IDLE, CALL_STATE_OFFHOOK и CALL_STATE_RINGING. Кажется, они используются для входящих звонков.

Что я на самом деле хочу сделать, так это получать уведомления, когда исходящий вызов сделан, получен или истек тайм-аут. Как это сделать?

Ответы [ 3 ]

1 голос
/ 31 августа 2010

Минимум, который необходимо сделать:

public class CallCounter extends PhoneStateListener {

    public void onCallStateChanged(int state, String incomingNumber) {
        switch(state) {
            case TelephonyManager.CALL_STATE_IDLE:
                    Log.d("Tony","Outgoing Call finished");
                    // Call Finished -> stop counter and store it.
                    callStop=new Date().getTime();
                    context.stopService(new Intent(context,ListenerContainer.class));

                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                    Log.d("Tony","Outgoing Call Starting");
                    // Call Started -> start counter.
                    // This is not precise, because it starts when calling,
                    // we can correct it later reading from call log
                    callStart=new Date().getTime();
                break;
        }
    }


public class ListenerContainer extends Service {
    public class LocalBinder extends Binder {
        ListenerContainer getService() {
            return ListenerContainer.this;
        }
    }
    @Override
    public void onStart(Intent intent, int startId) {
        TelephonyManager tManager =(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
        CallCounter callCounter=new CallCounter(this);
        tManager.listen(callCounter,PhoneStateListener.LISTEN_CALL_STATE);
        Log.d("Tony","Call COUNTER Registered");
    }
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
    // This is the object that receives interactions from clients.  See
    // RemoteService for a more complete example.
    private final IBinder mBinder = new LocalBinder();

}

public class myReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
            context.startService(new Intent(context,ListenerContainer.class));
        }
        }
}
1 голос
/ 25 июля 2012

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

Вы можете сделать это следующим образом, в CALL_STATE_IDLE:

Uri allCalls = Uri.parse("content://call_log/calls");
String lastMinute = String.valueOf(new Date().getTime() - DAY_IN_MILISECONDS); 
//before the call started
Cursor c = app.getContentResolver().query(allCalls, null, Calls.DATE + " > " 
           + lastMinute, null, Calls.DATE + " desc");
c.moveToFirst();

if (c.getCount() > 0) {
    int duration = Integer.parseInt(c.getString(c.getColumnIndex(Calls.DURATION)));
}

если длительность> 0, то на этот вызов получен ответ.

Очевидно, что есть другие флаги, которые вы должны использовать, чтобы определить, что CALL_STATE_IDLE вызывается после того, как был сделан вызов.поставил вас в тупик за то, что вы пытаетесь сделать.

1 голос
/ 13 июля 2010

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

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

...