Как заставить приложение получать трансляцию, когда другие приложения установлены или удалены

Я хочу сделать приложение, которое может получать трансляцию, когда другие приложения на устройстве установлены или удалены.

мой код

в манифесте:

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

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

но я не могу получать трансляцию. Я думаю, эта проблема связана с разрешениями приложений, любой идеей?

Спасибо за помощь.

Ответы

Ответ 1

В вашем манифесте:

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

Добавьте строку перед тегом фильтра-объекта

<data android:scheme="package"/>

Итак, ваш манифест должен выглядеть так:

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

Не уверен в намерении PACKAGE_REMOVED, если он действительно доступен.

Ответ 2

Вы должны удалить android.intent.action.PACKAGE_INSTALL, поскольку он устарел и больше не рекомендуется, потому что он предназначен только для системы. Все остальное идеально, и я бы рекомендовал вместо 100 поставить 999, в документации не указывается максимальное или минимальное количество, чтобы увеличить число, более высокий приоритет будет иметь ваш приемник для этого намерения. Извините за переводчика. Я говорю и пишу по-испански. Информация

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

Ответ 3

Отличные ответы, осталось только одна небольшая вещь:

В каждом обновлении приложения сначала вызывается ACTION_PACKAGE_REMOVED, а затем ACTION_PACKAGE_ADDED - если вы хотите игнорировать эти события, просто добавьте его на свой onReceive():

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

    //DO YOUR THING
}

Это из документов:

EXTRA_REPLACING Добавлен в уровень API 3 String EXTRA_REPLACING Используется как boolean extra field в ACTION_PACKAGE_REMOVED, чтобы указать, что это замена пакета, поэтому эта трансляция будет сразу после этого следует добавление трансляции для другой версии тот же пакет. Постоянное значение: "android.intent.extra.REPLACING"