Как заставить приложение получать трансляцию, когда другие приложения установлены или удалены
Я хочу сделать приложение, которое может получать трансляцию, когда другие приложения на устройстве установлены или удалены.
мой код
в манифесте:
<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"