Ricevi il numero di telefono delle chiamate in arrivo e in output

Sto facendo un'applicazione in cui devo recuperare il numero di telefono e posso recuperarla ma il mio problema è che stavo ricevendo il numero di telefono dell'ultima chiamata piuttosto che la chiamata attuale. Il mio codice è il seguente:

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"; 

  • causando un errore java.IllegalStateException, nessuna attività, solo quando si naviga a Fragment per la seconda volta
  • Android Studio: Duplicare i file copiati in APK META-INF / DEPENDENCIES quando si compila
  • Considerate l'aggiunta di android: paddingStart = "25dp" per supportre meglio i layout da destra a sinistra
  • Blur Bitmap per Android SDK
  • Installazione di appium su macOS sierra 10.12.3
  • AndroidPlot: Come posso modificare i dati di dominio?
  • Ombreggiando le stringhe di risorse che potrebbero dare via troppe informazioni sulla logica di programmazione
  • Come autoplay HTML5 video mp4 su Android?
  • adb logcat: Aumenta la lunghezza massima del messaggio
  • Che cosa può essere una causa di java.net.SocketException: recvfrom fallito: ETIMEDOUT?
  • Impedire il recupero di frammento in Android
  • registerReceiver non funziona
  • 2 Solutions collect form web for “Ricevi il numero di telefono delle chiamate in arrivo e in output”

    Come suggerito da Krutix, il LOG di chiamata, è un LOG delle chiamate telefoniche finite che viene scritta dall'applicazione dialer dopo una chiamata finita. In quanto tale non troverai il numero che sta attualmente chiamando nel provider di contenuti.

    Ecco un'implementazione che ti permetterà di recuperare il numero di telefono se è una chiamata in arrivo come numero di ingresso e anche quando la chiamata è FINITA – nota il codice 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; } } } } 

    E quindi aggiungere e inizializzare l'ascoltatore nel codice onCreate o onStartCommand:

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

    modifica la tua richiesta con

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

    darà il numero di telefono dell'ultima chiamata e non c'è bisogno di richiedere così tante volte

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.