2010-05-06 4 views
9

Sto cercando di implementare la mia interfaccia telefonica per gestire l'interfaccia utente.Come accettare una chiamata in arrivo facendo clic su un pulsante?

Quello che voglio fare è, se arriva una chiamata, il numero di telefono in arrivo e una foto vengono visualizzati, e, se premo un pulsante, la chiamata in arrivo sarà accettata/risposta.

Il codice relativo è:

@Override 
    public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    answerButton = (Button) findViewById(R.id.pickup); 
    answerButton.setOnClickListener(new OnClickListener() { 
     public void onClick(final View v) { 
      Intent intent = new Intent("android.intent.action.ANSWER"); 
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      startActivity(intent);   
     } 
    }); 

Purtroppo, il codice non funziona. In un primo momento, viene generata un'eccezione se premo il mio pulsante di risposta:

ActivityNotFoundException: trovate attività per gestire Intent {
atto = android.intent.action.ANSWER

Poi ho aggiunto un voce in AndroidManifest.xml:

<uses-permission android:name="android.permission.CALL_PHONE" /> 

Eseguo nuovamente l'app, non ci sono più eccezioni. Tuttavia, dubito che la chiamata in arrivo non sia realmente accettata. Perché se si preme il pulsante di risposta dello schermo di Android (pulsante verde), la chiamata in entrata viene accettata e un'icona di chiamata in verde viene visualizzata anche nell'angolo in alto a sinistra dello schermo dell'emulatore, mentre la mia app no.

Ho letto anche il codice sorgente dell'app Telefono in Android. C'è un metodo come acceptCall() nella classe Phone. Ma questi codici sembrano difficili per me da usare, perché ci sono molti dichiarazione importazioni nel codice, come ad esempio:

import com.android.internal.telephony.Call; 
import com.android.internal.telephony.CallStateException; 
import com.android.internal.telephony.CallerInfo; 
import com.android.internal.telephony.CallerInfoAsyncQuery; 
import com.android.internal.telephony.Connection; 
import com.android.internal.telephony.MmiCode; 
import com.android.internal.telephony.Phone; 

E, se posso aggiungere queste importazioni nel mio codice, non ci saranno troppi errori, come ad esempio :
The import com.android.internal.telephony cannot be resolved.

Qual è il modo giusto e semplice per il mio problema?

+0

consultare il link: [http://mylifewithandroid.blogspot.com/2008/01/phonecalls.html](http://mylifewithandroid.blogspot. COM/2008/01/telefonate.html) –

risposta

1

Aggiungere la categoria "android.intent.category.DEFAULT" (Intent.CATEGORY_DEFAULT)

+0

Grazie, MasterGaurav! Ma ho già aggiunto la categoria "android.intent.category.DEFAULT" nel file manifest. Ecco il codice: \t \t \t Quindi mi chiedo ci sono altri motivi . – Armstrong

+0

Intendevo aggiungere una categoria predefinita nell'intento nel codice. –

1

L'intento android.intent.action.ANSWER è in qualche modo non funziona come previsto. C'è una soluzione alternativa emulando il pulsante bluetooth per rispondere alla chiamata in arrivo. È possibile visualizzare un esempio dal progetto auto-answer.

0

È necessario creare un ricevitore di trasmissione in cui si otterrà l'evento quando il telefono squilla e dopo è possibile avviare l'attività desiderata. Non è possibile sostituire la schermata di chiamata in arrivo predefinita fino all'utilizzo di CUSTOM ROM. E non dimenticare di impostare la priorità nel ricevitore broadcast nel file manifest. Una volta ottenuto l'evento, è possibile utilizzare l'oggetto di ITelephony utilizzando la reflection.E ciò può fornire metodi per rispondere o rifiutare la chiamata.

0

Questo è possibile utilizzando il pacchetto com.android.internal.telephony, ma è necessario trovare in qualche modo l'utilizzo di questi metodi in eclipse e l'app deve essere compilata come app di sistema utilizzando il codice sorgente Android.

0

cambiare il metodo di chiamata di accettare da questo:

public static void acceptCall(Context context) 
{ 
    Intent buttonUp = new Intent(Intent.ACTION_MEDIA_BUTTON); 
    buttonUp.putExtra(Intent.EXTRA_KEY_EVENT, 
     new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK)); 
    context.sendOrderedBroadcast(buttonUp, "android.permission.CALL_PRIVILEGED"); 
}