6

クラス TelephonyManager に、CALL_STATE_IDLE、CALL_STATE_OFFHOOK、および CALL_STATE_RINGING があることに気付きました。着信に使用されているようです。

私が実際にやりたいことは、発信呼び出しが行われたとき、受信されたとき、またはタイムアウトになったときに通知を受けることです。どうやってするか?

4

3 に答える 3

2

時間指定された通話を検出できるかどうかはわかりませんが、通話がいつ開始されたかを区別することは可能です。

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 が呼び出されたことを判断するために使用する必要がある他のフラグがあります。

それがあなたがやろうとしていることの正しい方法であなたを助けてくれることを願っています.

于 2012-07-25T03:05:50.410 に答える
1

私が理解していることから、電話の状態がアイドルからオフフックに変わるため、発信通話が開始されたことを検出できます。ただし、そこから、その通話の状態を知ること、つまり、かけている通話が鳴っているのか、ボイスメールに転送されているのか、実際に応答されたのか、タイムアウトになったのかを知ることは、検出できないようです.

SDKで検出できないだけなのか、ネットワーク経由で通信され、ラジオ受信機自体から検出できる可能性があるのか​​ 、それともその情報が単純に送信されていないのかはわかりません.

于 2010-07-13T15:48:35.190 に答える
1

最低限必要なことは次のとおりです。

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));
        }
        }
}
于 2010-08-31T11:14:01.057 に答える