3

я следующий вещательный приемник, чтобы захватить событие, когда пользователь выполнить удаление приложения на устройстве, технически, я получаю намерения с действием ACTION_PACKAGE_REMOVED:получить имя пакета (приложение) версии при удалении его

public class appUninstallReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     if (intent != null) { 
      if (intent.getAction().equals(intent.ACTION_PACKAGE_REMOVED)) { 
       try { 
        String packageName = intent.getData().toString(); 
        //Logcat shows the packageName is "com.XXX.YYY" 
        Log.v("debug",packageName); 

        PackageManager packageManager = context.getPackageManager(); 
        PackageInfo packageInfo = packageManager.getPackageInfo(packageName, 0); 
        //Got NameNotFoundException 
        Log.v("debug",packageInfo.versionName); 

       }catch(NameNotFoundException e){ 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 

Значение выше приемник работает хорошо, за исключением того, что при попытке извлечь имя версии деинсталлирующего приложения (пакета) с packageInfo.versionName, NameNotFoundException растет.

packageName У меня есть «com.XXX.YYY», который является именно именем пакета приложения, которое я деинсталлирую. Но почему я не могу получить имя версии с вышеуказанным кодом?

(Кстати, выше приемник запускается при запуске приложения деинсталляция, это потому, что система уже удалены метаданные перед началом удаления?)

+0

Документ говорит: «Существующий пакет приложений был удален с устройства». Вероятно, поэтому причина NameNotFoundException возрастает. – Y2i

+0

Можете ли вы показать мне, как вы снимаете событие удаления, пожалуйста. Мне нужно это – Rauf

ответ

2

Но почему я не могу получить имя версии с вышеуказанным кодом?

Вы заметите, что название действия (ACTION_PACKAGE_REMOVED) - прошедшее время. Имя действия не равно ACTION_PACKAGE_REMOVING, ACTION_PACKAGE_WILL_BE_REMOVED_IN_THE_FUTURE, или ACTION_PACKAGE_USER_WANTS_TO_REMOVE_THIS_PACKAGE_WHICH_WE_WILL_DO_ANY_MINUTE_NOW.

The documentation также использует прошедшее время:

существующий пакет приложений было удалено из устройства.

Таким образом, если приложение быть удалено, приложение не существует на устройстве к тому времени, это широковещательный посылаются, и поэтому она не будет доступна через PackageManager.

+0

Но есть ли другие намерения трансляции, которые я мог бы получить, с которыми я знаю, что приложение будет удалено, чтобы я мог получить доступ к имени версии пакета ? Или любое обходное решение? – Mellon

+0

@Mellon: «Но есть другие намерения трансляции ...» - не связано с деинсталляцией. «Или любой обходной путь?» - поскольку я понятия не имею, какова реальная деловая проблема, я не могу предложить обходной путь. Какой смысл пытаться определить имя версии приложения, которое больше не существует на устройстве? – CommonsWare

-1

Попробуйте этот код, чтобы получить имя пакета приложения, которое в настоящее время неустановленное:

Uri uri = intent.getData(); 
    String pkg = uri != null ? uri.getSchemeSpecificPart() : null; 
    System.out.println("Pakcge Removed: " + pkg); 
-1

вы можете использовать этот вещатель:

public class UninstallHelper extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 

     Uri uri = intent.getData(); 
     String packageName = uri != null ? uri.getSchemeSpecificPart() : null; 
     Bundle b = intent.getExtras(); 
     int uid = b.getInt(Intent.EXTRA_UID); 

     boolean replacing = b.getBoolean(Intent.EXTRA_REPLACING); 


     Toast.makeText(context, "Package removed: " + packageName + " " + uid + "; replacing: " + replacing, Toast.LENGTH_LONG).show(); 


    } 

} 

Тогда в манифесте:

<receiver android:name="braadcasters.UninstallHelper"> 
      <intent-filter android:priority="999"> 
       <action android:name="android.intent.action.PACKAGE_REMOVED" /> 
       <action android:name="android.intent.action.UID_REMOVED" /> 
       <data android:scheme="package"/> 
      </intent-filter> 
     </receiver> 
Смежные вопросы