2012-01-18 5 views
10

У меня есть приложение, в котором хранится журнал встроенных приложений, установленных на устройстве. После установки широковещательный приемник для Intent.PACKAGE_ADDED вызывается и записывает имя пакета, используя следующий код:Как найти имя пакета, которое было удалено при использовании Intent.ACTION_PACKAGE_REMOVED

public class NewInstallReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     Bundle b = intent.getExtras(); 
     int uid = b.getInt(Intent.EXTRA_UID); 
     String[] packages = context.getPackageManager().getPackagesForUid(uid); 

     ApplicationService appService = new ApplicationService(context); 
     appService.ApplicationInstalled(packages); 
    } 
} 

Проблема я столкнулся при использовании в широковещательный приемник для Intent.PACKAGE_REMOVED, все ссылки на пакет через уникальный идентификатор (UID) возвращается с нулевой информацией (как и следовало ожидать, учитывая, что он уже был удален). Тем временем у меня есть временное решение, но оно не очень элегантное, и для следующей версии я хотел бы иметь более чистый код. Пример того, как код должен работать:

public class RemoveApplicationReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     Bundle b = intent.getExtras(); 
     int uid = b.getInt(Intent.EXTRA_UID); 
     String[] packages = context.getPackageManager().getPackagesForUid(uid); 

     ApplicationService appService = new ApplicationService(context); 
     appService.ApplicationRemoved(packages); 
    } 

} 

Подведем итоги, вопрос:

Как, после того, как программа была удалена, я могу сослаться на имя пакета в широковещательный приемник для Намерения. PACKAGE_REMOVED.

Благодаря

+0

Я также получаю null от getPackagesForUid (uid). Я хочу получить список всех пакетов, установленных для текущего пользователя. Может ли кто-нибудь предоставить какой-либо ввод? – Pratik

ответ

13

Пакет имена в Intent вы получили от BroadcasReceiver, используйте функцию «GetData()», есть ComponentMame установленного/неустановленного пакета.

+12

Работал отлично ... просто использовал getData(). GetSchemeSpecificPart(). Спасибо – Kennifer

+4

Когда я распечатываю aim.toString() Я могу увидеть имя пакета, но когда я использую aim.getData(). GetSchemeSpecificPart() Я получаю пустую строку. Что я делаю не так? – gonzobrains

+3

@ gonzobrains Вы, вероятно, не задали схему? В манифесте он должен выглядеть следующим образом: ''. –