2012-06-28 9 views
15

Chcę utworzyć aplikację, która będzie mogła odbierać emisje, gdy inne aplikacje na urządzeniu zostaną zainstalowane lub usunięte.Jak ustawić, czy moja aplikacja odbierze emisję, gdy inne aplikacje są zainstalowane lub usunięte?

mój kod

w 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> 

w 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"); 
    } 
} 

ale nie można odbierać żadnej transmisji. Myślę, że ten problem wynika z uprawnień aplikacji, jakiegokolwiek pomysłu?

Dzięki za pomoc.

Odpowiedz

40

W swoim manifeście:

<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> 

dodać linię przed znacznikiem intent-filtra

<data android:scheme="package"/> 

Więc twój manifest powinien wyglądać następująco:

<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> 

nie jestem pewien intencja PACKAGE_REMOVED w tym, że jeśli jest rzeczywiście dostępna.

+0

Udało +1 .. thnx –

+2

@ rup35h arg1.getDataString() zwróci "pakiet: TheInstalledPackageName" podobnie jak „pakiet: com.google.joke " – wangqi060934

+0

' PACKAGE_INSTALL' jest bezużyteczne, przestarzałe i nigdy nie były używane przez Google: https://developer.android.com/reference/android/content/Intent.html#ACTION_PACKAGE_INSTALL – Solidak

17

Musisz wyeliminować android.intent.action.PACKAGE_INSTALL, ponieważ jest przestarzałe i nie jest już zalecane, ponieważ jest przeznaczone tylko dla systemu. Cała reszta jest idealna i zalecałbym, żeby zamiast 100, umieścić 999, dokumentacja nie daje maksymalnej lub minimalnej liczby do użycia, im większa liczba, tym wyższy priorytet ma twój odbiorca do tego celu. Przepraszamy za tłumacza. Mówię i piszę po hiszpańsku. 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

Bardzo dużo @kiddie .... –

7

Wielkie odpowiedzi, tylko jedna mała rzecz lewej:

Na każdej aktualizacji App pierwszy ACTION_PACKAGE_REMOVED będzie nazwane następnie ACTION_PACKAGE_ADDED- jeśli chcesz zignorować te wydarzenia, dodaj go na onReceive():

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

    //DO YOUR THING 
} 

to z docs:

EXTRA_REPLACING Dodane w poziomie API 3 String EXTRA_REPLACING Używany jako logiczną dodatkowego pola w intencji ACTION_PACKAGE_REMOVED aby wskazać, że to zastąpienie pakietu, więc ta emisja będzie natychmiast następuje audycji dodawanie na inny wersja tego samego pakietu. Stała wartość: "android.intent.extra.REPLACING"

+0

Chcę, aby moja transmisja wywołała zdarzenie tylko wtedy, gdy aplikacja jest zainstalowana lub odinstalowana, ale nie w momencie aktualizacji aplikacji. Jak sobie z tym poradzić? –