Intereting Posts
AndroidHttpClient и HttpGet API устарели в Android 6.0 Marshmallow (API 23) InAppBilling активность и финиш () Android.view.InflateException: двоичная строка XML-файла # 12: ошибка раздувания класса <unknown> Запретить предупреждение AndroidManifest.xml minSdkVersion Узнайте, зашифровано ли устройство зашифрованным диском и какое шифрование было использовано? Невозможно настроить область входа Google на Android Как установить размер предварительного просмотра камеры в квадрат в квадрате SurfaceView (например, Instagram) Центральные источники изображений NinePatch? Приложение Android Voice Call (VoIP) с использованием SIP Можно ли протестировать версию релиза вашего приложения с помощью плагина Android Gradle? Разблокировать тег mifare с помощью android Аналитика Firebase AppMeasurement не включена Возмещение покупки приложений на Android Как сортировать массив JSON из объектов JSON в Android? Как реализовать аутентификацию OAuth 2.0 как аутентификацию на токенах для API доступа, доступ к которой осуществляется из мобильных и javascript веб-приложений

Android: BroadcastReceiver при установке / удалении приложения

Я хочу установить файл apk и установить широковещательный приемник, чтобы поймать информацию о статусе установки.

Я подготовил класс BroadcastReceiver:

public class newPackageReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.d("DEBUG"," test for application install/uninstall"); } } 

В основном я сначала регистрирую новый объект-получатель, а затем кнопку instanciate для установки приложения.

 public void onCreate(Bundle savedInstanceState) { ... IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_PACKAGE_ADDED); filter.addAction(Intent.ACTION_PACKAGE_CHANGED); filter.addAction(Intent.ACTION_PACKAGE_DATA_CLEARED); filter.addAction(Intent.ACTION_PACKAGE_INSTALL); filter.addAction(Intent.ACTION_PACKAGE_REMOVED); filter.addAction(Intent.ACTION_PACKAGE_REPLACED); filter.addAction(Intent.ACTION_PACKAGE_RESTARTED); receiver = new newPackageReceiver(); registerReceiver(receiver, filter); ... dlButton.setText(R.string.dl_button); dlButton.setOnClickListener(new AppliDownloadOnClickListener(this )); @Override public void onDestroy(){ unregisterReceiver(receiver); super.onDestroy(); } 

В моем классе OnclickListener я ставил:

 @Override public void onClick(View v) { // actually, the below process is in an asyncTask URL url; Intent promptInstall; try { url = new URL(apkurl); HttpURLConnection c = (HttpURLConnection) url.openConnection(); c.setRequestMethod("GET"); c.setDoOutput(true); c.connect(); String PATH = Environment.getExternalStorageDirectory()+ "/download/"; File file = new File(PATH); file.mkdirs(); File outputFile = new File(file, "app.apk"); FileOutputStream fos = new FileOutputStream(outputFile); InputStream is = c.getInputStream(); byte[] buffer = new byte[1024]; int len1 = 0; while ((len1 = is.read(buffer)) != -1) { fos.write(buffer, 0, len1); } fos.close(); is.close(); promptInstall = new Intent(Intent.ACTION_VIEW); promptInstall.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/download/" + "app.apk")), "application/vnd.android.package-archive"); if (promptInstall != null) { activity.startActivity(promptInstall); } else { ErrorDetails.displayToastMessage(activity,R.string.connection_error); } } catch (...) { ... } } 

С приведенным выше кодом (я сократил его), когда нажата кнопка, отображается программа установки и приложение прекрасно установлено, но класс приемника (newPackageReceiver) никогда не вызывается. Регистрация (registerReceiver) выполняется в методе onCreate, и unregisterReceiver вызывается в методе onDestroy, поэтому он должен быть действительным. Ты знаешь почему ?

Спасибо за чтение !

Вам нужно добавить схему данных в свой фильтр намерений.

 filter.addDataScheme("package"); 

Кроме того, ACTION_PACKAGE_INSTALL никогда не использовался.