Gestire le chiamate in uscita in modo corretto

Di - 3 July 2013 - in

Tutti sappiamo quanto sia importante testare un’app prima di rilasciarla sul Google Play Store e renderla disponibile agli utenti finali. Se poi si parla di app che utilizzano servizi usufruiti da tutti gli utenti con cadenza giornaliera, come ad esempio le chiamate telefoniche, i test devono naturalmente essere ancor più approfonditi. Ed è appunto su questo servizio che Google ha posto l’accento ultimamente, a tal punto da discuterne sull’Android developers blog, in quanto sembra che la maggior parte degli sviluppatori lo implementi in modo scorretto. Descriviamo quindi come implementarlo correttamente e l’errore più comune commesso dai developers.

Implementazione dell’ascoltatore
Quando un utente vuole avviare una chiamata, il sistema invia una notifica in broadcast del NEW_OUTGOING_CALL Intent, agganciandoci il numero di telefono originale, l’URI ed altre informazioni extra. Questo offre alle app un modo per modificare, reindirizzare o cancellare la chiamata prima che venga passata all’app di gestione telefonica di default.
Se quindi si vuole che la propria app gestisca le chiamate in uscita, è necessario implementare un broadcast receiver che riceva appunto il NEW_OUTGOING_CALL Intent, processi il numero ed inizi la chiamata.

Nel file manifest bisogna quindi assicurarsi di dichiarare questo intent-filter ed inoltre richiedere il permesso PROCESS_OUTGOING_CALLS al fine di ricevere l’Intent.
È importante notare che il sistema invia in broadcast il NEW_OUTGOING_CALL Intent solo per i numeri che non sono associati a funzionalità core, come i numeri d’emergenza.
Di seguito un esempio di broadcast receiver dichiarato nel file manifest:

<manifest>
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />  
    <application>
        ...
        <receiver android:name=MyOutgoingCallHandler">
            <intent-filter>
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
        ...
    </application>
</manifest>

L’implementazione di un possibile broadcast receiver:

public class MyOutgoingCallHandler extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {
    // Extract phone number reformatted by previous receivers
    String phoneNumber = getResultData();
    if (phoneNumber == null) {
      // No reformatted number, use the original
      phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
    }
    // My app will bring up the call, so cancel the broadcast
    setResultData(null);
    // Start my app to bring up the call
    ...
  }
}

Visto che il broadcast dell’intent è ordinato, la vostra app può scegliere se consumare la richiesta oppure semplicemente utilizzare il numero e passare i dati ad un’altra app che potrebbe essere interessata. Nell’esempio mostrato viene avviata una telefonata ed inibito che la richiesta raggiunga l’app di gestione della fonia di default, utilizzando il metodo setResultData(null).

Utilizzo scorretto
Anziché implementare il broadcast receiver mettendosi in ascolto sul NEW_OUTGOING_CALL Intent, molti sviluppatori settano erroneamente l’Intent-filter con il CALL_PRIVILEGED Intent per gestire le chiamate in uscita. Questo NON è un approccio raccomandato perché il sistema potrebbe inviare il suddetto Intent per qualsiasi numero, inclusi i numeri d’emergenza!
Visto che le app non di sistema non possono gestire le numerazioni d’emergenza, in quanto il CALL_PRIVILEGED Intent dovrebbe essere utilizzato solamente dalle app che hanno i necessari permessi, servirsene potrebbe inavvertitamente interferire con l’accesso a questi numeri particolari provocando possibili seri problemi!

Ci rivolgiamo quindi a tutti gli sviluppatori affinché controllino il codice delle proprie app, onde evitare spiacevoli inconvenienti agli utenti finali.

Via | Android Developers Blog

Leave a Reply

Fabrizio Variano Articolo scritto da

Laureato e specializzato in Informatica con il massimo dei voti, lavora come Software engineer con compiti di team leading progettando e sviluppando soluzioni in ambito web con tecnologie Java e “dintorni”.
Grande appassionato di tecnologia, negli ultimi anni si è avvicinato all’ambito mobile, sia hardware che software, con l’intento di far suo questo mondo affascinante.
Oltre a viaggiare, tra i suoi hobby ci sono: la moto, la cucina ed il cinema.

Contatta l'autore

Previous post:

Next post: