2012-04-13 2 views
4

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

projection = new String[]{Calls.NUMBER}; 
cur = context.getContentResolver().query(Calls.CONTENT_URI, projection, null, null, null); 
cur.requery(); 
numberColumn = cur.getColumnIndex(Calls.NUMBER); 
cur.requery(); 
cur.requery(); 
cur.requery(); 
cur.requery(); 
cur.moveToLast(); 
s = cur.getString(numberColumn); 
String pathname = "/sdcard/" + s + ".amr"; 
+0

вы должны увидеть http://stackoverflow.com/questions/1853220/retrieve-incoming-calls-phone -number-in-android – ngesh

+0

sandy, я видел это, но не могли бы вы рассказать, где добавить код snipet в мой код? –

ответ

14

Как было предложено Krutix, LOG LOG - это LOG законченных телефонных звонков, который записывается приложением дозвона после завершения вызова. Таким образом, вы не найдете, какой номер набирается в настоящее время в поставщике контента.

Вот реализация, которая позволит вам получить номер телефона, если это входящий телефонный звонок как входящий номер, а также когда звонок ЗАВЕРШЕН - обратите внимание на код Handler().

private class PhoneCallListener extends PhoneStateListener { 

    private boolean isPhoneCalling = false; 

    @Override 
    public void onCallStateChanged(int state, String incomingNumber) { 

     if (TelephonyManager.CALL_STATE_RINGING == state) { 
      // phone ringing 
      Log.i(LOG_TAG, "RINGING, number: " + incomingNumber); 
     } 

     if (TelephonyManager.CALL_STATE_OFFHOOK == state) { 
      // active 
      Log.i(LOG_TAG, "OFFHOOK"); 

      isPhoneCalling = true; 
     } 

     if (TelephonyManager.CALL_STATE_IDLE == state) { 
      // run when class initial and phone call ended, need detect flag 
      // from CALL_STATE_OFFHOOK 
      Log.i(LOG_TAG, "IDLE number"); 

      if (isPhoneCalling) { 

       Handler handler = new Handler(); 

       //Put in delay because call log is not updated immediately when state changed 
       // The dialler takes a little bit of time to write to it 500ms seems to be enough 
       handler.postDelayed(new Runnable() { 

        @Override 
        public void run() { 
         // get start of cursor 
          Log.i("CallLogDetailsActivity", "Getting Log activity..."); 
          String[] projection = new String[]{Calls.NUMBER}; 
          Cursor cur = getContentResolver().query(Calls.CONTENT_URI, projection, null, null, Calls.DATE +" desc"); 
          cur.moveToFirst(); 
          String lastCallnumber = cur.getString(0); 
        } 
       },500); 

       isPhoneCalling = false; 
      } 

     } 
    } 
} 

А потом добавить и инициализацию слушателя в вашем OnCreate или onStartCommand код:

PhoneCallListener phoneListener = new PhoneCallListener(); 
    TelephonyManager telephonyManager = (TelephonyManager) this 
      .getSystemService(Context.TELEPHONY_SERVICE); 
    telephonyManager.listen(phoneListener, 
      PhoneStateListener.LISTEN_CALL_STATE); 
+0

Это ответ. +1 in this :) –

+0

Ошибка времени компиляции: метод getContentResolver() не определен для типа new Runnable() {}? –

+0

решил его, указав поле частного контекста контекста; и context.getContentResolver(). query (Calls.CONTENT_URI, проекция, null, null, Calls.DATE + "desc"); Ссылка: http: //stackoverflow.com/questions/10165609/sms-logger-method-getcontentresolver-is-undefined-for-the-type? Answertab = votes # tab-top –

0

пожалуйста, измените запрос с

cur = context.getContentResolver().query(Calls.CONTENT_URI, 
         projection, null, null, Calls.DATE +" desc"); 
    cur.moveToFirst(); 
    s = cur.getString(numberColumn); 

это даст LAS t номер телефона звонка, и нет необходимости требовать столько раз

+0

Тем не менее, я получаю предыдущий номер –

+0

, используя мой код, вы можете получить данные после того, как ваш звонок закончен и как вы хотите эта информация, когда звонок звонит или находится на удержании, вы должны использовать прослушиватель и приемник – Krutik

+0

Можете ли вы, пожалуйста, помочь с каким-то примером –

Смежные вопросы