2012-06-28 10 views
15

Desidero creare un'app che possa ricevere broadcast quando vengono installate o rimosse altre app sul dispositivo.Come far sì che la mia app venga trasmessa quando vengono installate o rimosse altre applicazioni

mio codice

in manifset:

<receiver android:name=".apps.AppListener"> 
    <intent-filter android:priority="100"> 
     <action android:name="android.intent.action.PACKAGE_INSTALL"/> 
     <action android:name="android.intent.action.PACKAGE_ADDED"/> 
     <action android:name="android.intent.action.PACKAGE_REMOVED"/> 
    </intent-filter> 
</receiver> 

in AppListener:

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 

public class AppListener extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent arg1) { 
    // TODO Auto-generated method stub 
    Log.v(TAG, "there is a broadcast"); 
    } 
} 

ma non posso ricevere alcuna trasmissione. Penso che questo problema sia dovuto ai permessi delle app, qualche idea?

Grazie per l'aiuto.

risposta

40

Nel vostro manifesto:

<receiver android:name=".apps.AppListener"> 
    <intent-filter android:priority="100"> 
     <action android:name="android.intent.action.PACKAGE_INSTALL"/> 
     <action android:name="android.intent.action.PACKAGE_ADDED"/> 
     <action android:name="android.intent.action.PACKAGE_REMOVED"/> 
    </intent-filter> 
</receiver> 

aggiungere la riga prima del tag di intent-filtro

<data android:scheme="package"/> 

Così il vostro manifesto dovrebbe essere simile a questo:

<receiver android:name=".apps.AppListener"> 
    <intent-filter android:priority="100"> 
     <action android:name="android.intent.action.PACKAGE_INSTALL"/> 
     <action android:name="android.intent.action.PACKAGE_ADDED"/> 
     <action android:name="android.intent.action.PACKAGE_REMOVED"/> 
     <data android:scheme="package"/> 
    </intent-filter> 
</receiver> 

Non sono sicuro circa l'intento PACKAGE_REMOVED in questo se è effettivamente disponibile.

+0

Ha funzionato +1 .. thnx –

+2

@ rup35h arg1.getDataString() restituirà "pacchetto: TheInstalledPackageName" proprio come "pacchetto: com.google.joke " – wangqi060934

+0

' PACKAGE_INSTALL' è inutile, deprecato e non è mai stato utilizzato da Google: https://developer.android.com/reference/android/content/Intent.html#ACTION_PACKAGE_INSTALL – Solidak

17

È necessario eliminare android.intent.action.PACKAGE_INSTALL in quanto obsoleto e non più consigliato, perché è solo per il sistema. Tutto il resto è perfetto e consiglierei che invece di 100, inserire 999, la documentazione non fornisca il numero massimo o minimo da utilizzare, maggiore è il numero, maggiore priorità avrà il ricevitore per quell'intenzione. Scusa per il traduttore. Parlo e scrivo in spagnolo. Information

<receiver android:name=".apps.AppListener"> 
<intent-filter android:priority="999"> 
    <action android:name="android.intent.action.PACKAGE_ADDED"/> 
    <action android:name="android.intent.action.PACKAGE_REMOVED"/> 
    <data android:scheme="package"/> 
</intent-filter> 

+0

Grazie mille @kiddie .... –

7

grandi risposte, solo una piccola cosa di sinistra:

Su ogni aggiornamento App prima ACTION_PACKAGE_REMOVED sarà chiamato seguita da ACTION_PACKAGE_ADDED- se si vuole ignorare questi eventi, basta aggiungerlo sul OnReceive():

if(!(intent.getExtras() != null && 
    intent.getExtras().containsKey(Intent.EXTRA_REPLACING) && 
    intent.getExtras().getBoolean(Intent.EXTRA_REPLACING, false))) { 

    //DO YOUR THING 
} 

Questo è dalla documentazione:

EXTRA_REPLACING aggiunta nel livello di API 3 String EXTRA_REPLACING Usato come un valore booleano campo aggiuntivo in intenti ACTION_PACKAGE_REMOVED per indicare che questa è una sostituzione del pacchetto, in modo da questa trasmissione sarà immediatamente essere seguito da una trasmissione aggiuntivo per un diverso versione di lo stesso pacchetto. Costante Valore: "android.intent.extra.REPLACING"

+0

Desidero che la mia trasmissione inneschi l'evento solo quando l'applicazione viene installata o disinstallata ma non attiva quando l'applicazione viene aggiornata. Come gestirlo? –

Problemi correlati