2010-11-01 15 views
13

Sto tentando di registrare la mia attività in modo che possa essere utilizzata dal selettore/selettore Attività che consente all'utente di scegliere se selezionare o meno la mia applicazione/attività per completare ciò che sta tentando di fare.Android - Filtro Intent?

Desidero fornire all'utente la possibilità di selezionare la mia applicazione quando desidera inviare un messaggio SMS e quando desidera effettuare una chiamata in uscita, per provare a ottenere ciò ho aggiunto le seguenti parti di codice nei miei tag attività nel mio manifesto:

<intent-filter> 
<action android:name="android.intent.action.SENDTO" /> 
<category android:name="android.intent.category.DEFAULT" /> 
<data android:mimeType="text/plain" /> 
</intent-filter> 

<intent-filter> 
<action android:name="android.intent.action.NEW_OUTGOING_CALL" /> 
<category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 

Tuttavia il selettore di attività non compare mai e le applicazioni native sono utilizzati senza fornire una scelta per l'utente. Qualcuno può vedere dove sto andando male?

EDIT:

ho capito ho bisogno di aggiungere

<data android:scheme="sms" /> 
<data android:scheme="smsto" /> 

per il messaggio SMS, ma quello che posso utilizzare per la chiamata in uscita?

EDIT 2:

Ho provato quanto segue per la chiamata in uscita:

<intent-filter> 
<action android:name="android.intent.action.VIEW" /> 
<action android:name="android.intent.action.DIAL" /> 
<category android:name="android.intent.category.DEFAULT" /> 
<category android:name="android.intent.category.BROWSABLE" /> 
<data android:scheme="tel" /> 
</intent-filter> 

Ma ancora una volta senza fortuna, è questo stato bloccato da 1.6 a?

Edit 3:

Questo è ciò che accade quando si sceglie Testo Cellulare:

alt text

Quindi voglio la stessa cosa quando clicco chiamata mobile

risposta

9

penso che dovrebbe aiutare a

<intent-filter > 
    <action android:name="android.intent.action.CALL_PRIVILEGED" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
    <data android:scheme="tel" /> 
</intent-filter> 

Testato su Android 2.1

+1

Qualcuno ha notato che questo non funziona sui telefoni HTC? Ho aggiunto lo stesso intent-filter alla mia attività e funziona su alcuni telefoni, ma su HTC Incredible la mia attività non è mai presentata come una scelta per completare l'intento. –

3

Questo perché le attività e i servizi non possono essere captati al di fuori degli intenti da soli. È necessario utilizzare uno BroadcastReceiver. Per implementare questo, effettuare le seguenti operazioni:

Estendere classe BroadcastReceiver di Android in questo modo:

public class MyReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
     Context context = getApplicationContext(); 
    Intent sendIntent = new Intent(); 
    if (intent.getAction().equals(Intent.NEW_OUTGOING_CALL)) { 
    sendIntent.setClass(context, MyActivity.class); 
    context.startActivity(sendIntent); 
    } 
     else if (intent.getAction().equals(Intent.SOME_OTHER_INTENT) { 
      sendIntent.setClass(context, MyService.class); 
    context.startService(sendIntent); 
     } 
     // More else ifs for more intents you want to catch. 
} 

} 

allora avete bisogno di dichiarare il ricevitore nel vostro manifesto in questo modo:

<receiver android:name="MyReceiver"> 
    <intent-filter> 
    <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> 
     // more intents you want to catch here 
    </intent-filter> 
</receiver> 

Solo intenti dichiarati nel il manifest sarà catturato dal tuo Receiver, quindi se vuoi catturare più intenti lanciati dal sistema o da altri programmi e vuoi fare esattamente la stessa cosa quando i loro intenti vengono catturati, specifica qui quegli intenti nel manifest e salta il se/altri blocchi nel metodo onReceive.

+1

io non credo che sia il modo corretto per me per ottenere ciò che voglio, voglio registrare per il SEND e DIAL intenti inviati dal sistema , Ho il SEND che funziona come sopra quando clicco su send text appare la finestra di dialogo "Completa azione usando" che è esattamente quello che voglio, ho solo bisogno di essere in grado di fare lo stesso per quando clicco su chiamata contatto. –

+2

Ah allora forse è necessario specificare alcune autorizzazioni per le quali si desidera che il programma sia autorizzato ad utilizzare. Guarda http://developer.android.com/reference/android/Manifest.permission.html. Credo che sia necessario utilizzare l'autorizzazione CALL_PHONE. – AndrewKS

+0

Sì, ce l'ho anch'io - Non capisco perché non funzioni affatto. –

1

È necessario aggiungere una priorità al filtro intent affinché Android ne tenga conto. Per esempio:

<activity android:name="YourActivity"> 
    <intent-filter android:priority="100"> 
     <action android:name="android.intent.action.CALL_PRIVILEGED" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <data android:mimeType="text/plain" /> 
    </intent-filter> 
</activity> 
2

questo ha funzionato per me

<activity 
     android:label="@string/app_name" 
     android:name=".TestIntentActivity" >    
     <intent-filter> 
     <action android:name="android.intent.action.CALL" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <action android:name="android.intent.action.CALL_PRIVILEGED" /> 
     <data android:scheme="tel" /> 
     </intent-filter> 
    </activity> 
Problemi correlati