2011-09-18 7 views
3

可能性の重複:
It's possible to get outgoing call duration during call?発信時間をリアルタイムで取得するにはどうすればよいですか?

私はリアルタイムの発信通話時間を表示する必要があります。

しかし、タイマーをいつ開始するべきかわかりません。

相手側から回答が得られると開始する必要があります。 私はTelephonyManager.EXTRA_STATE_OFFHOOKを試しましたが、その状態は 私が電話ボタンを押したときです。

OFFHOOKはコールが発信されたときの状態です。 電話がかかったときに通知を受ける必要があります。

どうすれば入手できますか? 私を助けることができますか?私は発信時間をカウントする必要がありますか?

おかげ

UPD ..

私は、このデータは、モバイルオペレータサーバが生成さだと思います。そして、このサーバは、各発呼後に通話時間と現在の残高を返します。 おそらく正しいですか?

私は解決策を見つけることができませんが、呼び出し時間の各呼び出し値がdbに格納された後。 CallLog.Calls.DURATIONによって取得できます。 この値がdbのフィールドにどのように入力されますか?それが変更された場合は

+0

は、あなたがこの問題を解決しましたか?着信コールだけでなく、発信コールに関する回答も知りたいと思うでしょう。 –

+0

+アンドロイドデベロッパーいいえ、残念ながら正しい解決策が見つかりませんでした。 通話が終了したときに限り、通話時間を取得できます。 – vsvydenko

答えて

4

コールログのコンテンツURIを聞くために、コンテンツオブザーバを用いた:

ContentResolver contentResolver = context.getContentResolver(); 
CallLogObserver mObserver = new CallLogObserver(new Handler(), context); 
contentResolver.registerContentObserver(
    Uri.parse("content://call_log/calls"), true, mObserver); 

これはあなたのCallLogObserverです:

public class CallLogObserver extends ContentObserver { 
    private Context context; 

    public CallLogObserver(Handler handler, Context context) { 
     super(handler); 
     this.context = context; 
    } 

    @Override 
    public void onChange(boolean selfChange) { 
     super.onChange(selfChange); 
     Log.i(TAG, "CallLogs Onhange()"); 
     try{ 
      Cursor c = context.getContentResolver().query(CallLog.Calls.CONTENT_URI, null, 
        null, null, CallLog.Calls.DATE + " DESC"); 
      if (c != null) { 
       if (c.moveToFirst()) { 
        int type = Integer.parseInt(c.getString(c 
          .getColumnIndex(CallLog.Calls.TYPE))); 
        /* 
        * increase call counter for outgoing call only 
        */ 
        if (type == 2){ 
         String number = c.getString(c 
           .getColumnIndex(CallLog.Calls.NUMBER)); 

         long duration = c.getLong(c 
           .getColumnIndex(CallLog.Calls.DURATION)); 

                Log.i(TAG, "numer = " + number + " type = " + type + " duration = " + duration); 

               } 
       } 
       c.close(); 
      } 
      else 
       Log.e(TAG,"Call Logs Cursor is Empty"); 
     } 
     catch(Exception e){ 
      Log.e(TAG, "Error on onChange : "+ e.toString()); 
     } 

    } 
+0

これはリアルタイムで継続時間を取得しません。コールの終了後、コールの継続時間がログに追加されます。 –

+0

これはまともな解決策ですが、すべての例外を捕まえるわけではありませんが、これは本当に悪い習慣です。開発者が明示的に追加したいのでなければ 'try .. catch'ブロックは不要です –

+0

ハードコードされた文字列' Uri.parse( "content:// call_log/calls")をアンドロイドライブラリ自身からのこの参照で置き換えることができます: android.provider.CallLog.Calls.CONTENT_URI' –

関連する問題