2013-06-30 4 views
5

Ho un'app che consente agli utenti di inoltrare i messaggi SMS non appena vengono ricevuti. Nel corso della giornata, ho avuto il android:priority nel mio intent-filter per android.provider.Telephony.SMS_RECEIVED impostato su appena sopra l'app di messaggistica predefinita di Android. L'ho fatto, in modo che l'utente possa inoltrare i messaggi senza doverli cancellare nell'app di messaggistica. Tuttavia, alcuni mesi dopo, Go SMS Pro ha rilasciato un aggiornamento della propria app con un valore di android:priority estremamente elevato, pertanto gli utenti con quell'app installata hanno iniziato a riscontrare problemi. Ho aggiornato la mia app in modo che la mia priorità fosse leggermente superiore a quella di Go SMS Pro e tutto è andato bene. Ora Go SMS Pro lo ha fatto di nuovo, il loro android:priority è stato ripreso al valore massimo che è possibile assegnare. 2147483647 su uno dei loro ricevitori di trasmissione e 2147483640 su un altro (sì, Go SMS Pro ha ora due ricevitori di trasmissione).Go SMS Pro sostituisce android.provider.Telephony.SMS_RECEIVED

Per risolvere questo problema, ho provato a cambiare la mia priorità al massimo, proprio come loro, ma in qualche modo la loro applicazione di continuo vincente l'SMS a combattere anche se le nostre priorità sono gli stessi. Ho letto da qualche parte che Android, quando deve decidere tra due app con la stessa priorità, sceglie quella installata prima. Ho provato a installare Go SMS Pro DOPO la mia app, ma ancora nulla.

Qual è il modo corretto per risolvere il problema? Cosa stanno facendo nella loro app che li fa ricevere la trasmissione SMS prima di chiunque altro, anche con gli stessi valori android:priority?

+1

siamo anche un po 'infastidito da GoSMS, di solito un sk nostro (mobitexter.net) per fare quanto segue: 1. Avviare l'app GoSMS sul proprio dispositivo mobile Android. 2. Sotto 'Menu -> Impostazioni -> Impostazioni di ricezione' - Deselezionare la casella 'Disabilita notifica di altri messaggi'. –

risposta

4

Qual è il modo corretto per risolvere questo problema?

Modifica la tua app per sopravvivere durante l'esecuzione di Go SMS Pro o qualsiasi altra app. Si consiglia inoltre agli utenti di rilevare le app che monitorano la stessa trasmissione con priorità uguali o superiori (utilizzare PackageManager per questo), in modo che sappiano configurare tali app di conseguenza.

Cercando di avere una priorità maggiore rispetto a tutti gli altri è una corsa agli armamenti, in cui vi troverete infine a vento fino, nel migliore dei casi, legato con la stessa priorità. Il comportamento delle trasmissioni ordinate con priorità legate non è documentato e quindi non esiste un comportamento garantito. Android - o versioni personalizzate di Android - sono invitati a modificare l'algoritmo di tie-breaker. Questo algoritmo potrebbe essere qualsiasi cosa, da:

  • ordine alfabetico per nome del pacchetto

  • ordine come si trova in una collezione hash, in cui il tasto cancelletto potrebbe essere basato su qualcosa (ad esempio, ID oggetto)

  • generatore di numeri casuali

Dal momento che non si può in modo affidabile "vincere", modificare l'applicazione per essere un successo come possibile quando si fa ind eed "perdere".

+0

Suppongo che tu abbia ragione. Ho appena finito di massimizzare la priorità sul mio manifest e quando lanciano l'app, utilizzo PackageManager per trovare qualsiasi app con uguale priorità (o superiore anche se è già al massimo) e mostrare loro una finestra di dialogo con un elenco di questi app e un suggerimento per disinstallarli. Questo è tutto ciò che si può fare ora, immagino. Grazie. – AxiomaticNexus

2

GO SMS Pro ha messo queste linee nel suo manifesto SmsReceiver:

<receiver android:name=".smspopup.SmsReceiver"  android:permission="android.permission.BROADCAST_SMS"> 
     <intent-filter android:priority="2147483647"> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
     <intent-filter android:priority="2147483647"> 
      <action android:name="android.provider.Telephony.GSM_SMS_RECEIVED" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" /> 
      <data android:mimeType="application/vnd.wap.mms-message" /> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="com.android.mms.transaction.MESSAGE_SENT" /> 
     </intent-filter> 
    </receiver> 

tutti questi intent-filtri rendono la sua priorità maggiore rispetto il ricevitore anche se il vostro ricevitore ha la priorità impostata 2147483647. si può vedere l'elenco di tutti i ricevitori di tutte le applicazioni di:

List<ResolveInfo> receivers = getPackageManager().queryBroadcastReceivers(new Intent("android.provider.Telephony.SMS_RECEIVED"), 0); 

il primo ricevitore nell'elenco, riceve l'sms prima di altri