Action package added android

How to listening android.intent.action.PACKAGE_ADDED? #34

Comments

CjoyHome commented Dec 13, 2017

Is it possible to receive the broadcast from android.intent.action.PACKAGE_ADDED?

The text was updated successfully, but these errors were encountered:

bsorrentino commented Dec 13, 2017

Really you could manage whatever events . but, if such events are external ones, you have to re-route them (take a look at #17)

This mean that you have:

  1. register a listener in javascript
  1. properly configure android.intent.action.PACKAGE_ADDED and when receive event you can call

CjoyHome commented Dec 14, 2017 •

CjoyHome commented Dec 14, 2017 •

sorry, I may forgot to mention I am using Ionic 2.

It is unsuccessful,

bsorrentino commented Dec 14, 2017

I’ve no idea the origin of the error. I don’t know the class io.ionic.starter.CDVBroadcaster the plugin class is org.bsc.cordova.CDVBroadcaster

I’ve to check, if you have anything that could help me (config.xml, snippet, . ) please share it

CjoyHome commented Dec 24, 2017

您好,我使用的是ionic2 的nactive,我想问下在ionic2 中怎么样使用这个插件动态的监听安装成功的广播,我希望的是当我在app中点击下载按钮,在下载完成后自动跳转到软件安装,在这个时候注册并启用监听,当我安装完成后,给我个安装成功的返回状态,然后我在进行下一步操作,请问这个如何实现,我查了很久,由于对安卓原生不熟悉,所以没成功。谢谢

CjoyHome commented Dec 26, 2017

Sorry,My English is poor, now is the use of translation, I play Chinese is afraid of my expression is not clear, I am afraid that you can not understand translation.

CjoyHome commented Dec 26, 2017

Hello, I use is ionic2 nactive, I would like to ask how to use this plugin dynamic monitor installation successful broadcast in ionic2, I hope that when I click the download button in app, when the download completes automatically jump to the software installation, registration at this time and enable listening, when I finished the installation then, give me a return to the state of installation is successful, then I in the next step, this is how to achieve, I look for a long time, because not familiar with the original Android, so there is no success. Thank you

bsorrentino commented Dec 28, 2017

I’m arranging a ionic2 simple project so will be easier to understand how use this plugin

Источник

Как зарегистрироваться для ACTION_PACKAGE_ADDED и ACTION_PACKAGE_REMOVED на Android Oreo?

Глядя на последние примечания к выпуску Android Oreo, кажется, что приложениями может быть зарегистрировано лишь несколько неявных трансляций. ACTION_PACKAGE_ADDED и ACTION_PACKAGE_REMOVED среди них нет. Есть ли обходной путь для получения этих трансляций?

2 ответа

Приложения, ориентированные на Android 8.0 или выше, больше не могут регистрировать широковещательные приемники для неявных широковещательных рассылок в своем манифесте. Неявная трансляция — это трансляция, которая не предназначена специально для этого приложения. Например, ACTION_PACKAGE_REPLACED — это неявная трансляция, поскольку она отправляется всем зарегистрированным слушателям, сообщая им, что какой-то пакет на устройстве был заменен.

Это говорит о том, что вы не можете зарегистрировать эти намерения в своем манифесте. Вы по-прежнему можете зарегистрировать их программно, чтобы получать их, когда ваше приложение работает.

Вы также можете попробовать ACTION_PACKAGE_FULLY_REMOVED, который является одним из исключений, которые вы можете по-прежнему слушайте, зарегистрировав его в манифесте. Нет такой «альтернативы» при добавлении пакета.

Как отметил CW, вы также можете периодически проверять наличие изменений в списке установленных приложений.

Вы также можете использовать опрос, настроить задание JobScheduler для периодической проверки, спрашивая PackageManager, что изменилось в списке установленных приложений, через getChangedPackages ().

Я мог бы заставить его работать со следующим кодом

Источник

Получаем разрешение MANAGE_EXTERNAL_STORAGE для приложения

Безопасность данных в операционной системе является очень важной задачей, и Android здесь не является исключением. Так, Google в Android 10 добавили новый способ обеспечения безопасности, называемый хранилищем с ограниченной областью видимости (Scoped storage).

Читайте также:  Часы будильник виджет для андроид

До Android 10 всё работало достаточно просто: приложение запрашивало доступ к хранилищу, используя одно из разрешений (WRITE_EXTERNAL_STORAGE либо READ_EXTERNAL_STORAGE), и, после того как пользователь предоставлял разрешение, приложение получало возможность прочесть и изменить практически любой файл, хранящийся на устройстве, за исключением системных файлов и папок, а также папок других приложений. Иначе говоря, приложение просто получало доступ ко всей файловой системе. Scoped storage же изменил этот подход. Теперь приложение по умолчанию имеет доступ только к некоторым участкам памяти, где хранятся общедоступные файлы, такие как медиа, загруженные файлы, некоторые документы. При этом полный доступ приложение имеет только к тем файлам, которые находятся непосредственно в папке приложения, расположенной в Android/data/ . Если приложению нужно изменить или удалить файл, находящийся вне этой папки, то приложение должно запросить у пользователя разрешение на конкретную операцию с помощью MediaStore API (для медиа-файлов) или через Storage Access Framework (для всех остальных файлов). Однако этот способ очень неудобен, если мы разрабатываем файловый менеджер или приложение, которое должно работать не с медиа-файлами.

Scoped storage был добавлен в Android 10 как опциональная функция, которую легко можно было отключить, добавив в AndroidManifest.xml приложения строчку android:requestLegacyExternalStorage=»true» внутри элемента . Таким образом, можно было вернуть работу с файлами так, как было раньше. Однако, начиная с Android 11, использование Scoped storage стало обязательным. Безусловно, это улучшило безопасность и сохранность файлов в операционной системе, но и прибавило проблем разработчикам, заставив их пересмотреть принципы работы своих приложений с файловой системой.

Поскольку часть приложений всё же требует для своей работы полный доступ к хранилищу, а не ограниченный, Google добавили новое разрешение MANAGE_EXTERNAL_STORAGE для таких случаев. Это разрешение, как и раньше, позволяет получить доступ ко всей файловой системе, однако для его использования в приложении требуется подтверждение со стороны Google. В этой статье мы разберём, как использовать разрешение в приложении, а также рассмотрим процесс заполнения заявки в консоли Google Play.

Для начала создадим новый проект с пустой активностью. Для начала нам нужно определить в манифесте, что приложению нужны следующие разрешения для работы. Добавим их в файле AndroidManifest.xml.

Поскольку MANAGE_EXTERNAL_STORAGE используется в обязательном порядке только начиная с API 30, то нам всё ещё нужно обрабатывать запрос разрешений на предыдущих версиях так, как мы это делали раньше. Для этого мы добавляем также WRITE_EXTERNAL_STORAGE, но ограничиваем его использование API 29. Таким образом, мы будем каждый раз проверять уровень API устройства и, в зависимости от этого, использовать либо старое разрешение, либо новое.

Как уже упоминалось выше, в случае с Android 10 для работы с файловой системой нам также нужно в манифесте добавить следующий флаг в элемент .

В файле разметки activity_main.xml добавим несколько элементов для тестирования:

Перейдём к написанию кода. Создадим класс PermissionUtils, в котором будет находиться проверка разрешений и их запрос.

Затем в классе активности MainActivity.java определим элементы из разметки.

Текстовое поле будет отображать, если у приложения необходимые разрешения. Для этого после объявления переменных добавим проверку.

Если запустить приложение сейчас, то у нас всегда будет выводиться сообщение о том, что разрешений нет, поскольку мы их пока что не запрашивали.

Добавим обработчик для кнопки, который будет отправлять запрос на предоставление разрешения.

Нам также необходимо задать код запроса, чтобы мы могли после определить, что ответ пришёл именно для этого запроса.

Когда пользователь нажмёт на кнопку, у него откроется новая активность с настройками приложения, в которой будет предложено дать полный доступ данному приложению. Пользователь может как согласиться, так и отклонить запрос.

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

Любой результат действий пользователя в итоге возвращается в нашу активность. Поскольку для API 30 мы запускаем отдельную активность, то результат работы мы должны отслеживать в методе onActivityResult(). Переопределим его и добавим следующий код.

Читайте также:  Почистить память андроид от ненужных файлов

Здесь мы снова проверяем, дал ли пользователь разрешение или нет, и обновляем текстовое поле в соответствии с результатом.

Аналогичным образом проверяем результат операции для старых уровней API, но здесь уже переопределяем метод onRequestPermissionResult().

Теперь у нашего приложения есть полный доступ к файловой системе, и технически этого уже достаточно. Однако если попытаться опубликовать такое приложение в Google Play, то публикацию запретят по причине отсутствия заявки на получение доступа ко всем файлам. Поэтому, после того, как в консоли будет создан выпуск и загружена туда новая версия приложения, нам нужно перейти в раздел Контент приложения и выбрать там появившийся пункт Важные разрешения и API.

В появившейся форме требуется описать подробно, зачем приложению требуется доступ ко всем файлам, относится ли это к основному функционалу приложения, а также объяснить с технической точки зрения почему невозможно использовать в приложении альтернативные способы.

Также, в случае если показать работу приложения проще, чем объяснить, можно также записать демо-ролик работы приложения, загрузить его на Youtube и прикрепить в данной форме ссылку на видео. В некоторых случаях это может ускорить получение доступа.

Итак, заполнив форму и сохранив её, можно вернуться обратно в настройку выпуска и проверить его. Предупреждение об отсутствии заявки должно пропасть и мы может отправить выпуск на публикацию. В процессе публикации Google тщательно проверит приложении, чтобы убедиться, что доступ ко всем файлам действительно необходим приложению. Как показывает практика, для приложений, представляющих собой файловые менеджеры, заявку одобрят достаточно быстро.

Когда Google одобрил доступ для приложения, новая версия успешно публикуется, а в разделе Контент приложения указано разрешение, которое было одобрено.

Однако, Google также могут и не одобрить заявку, если посчитают, что это не является обязательной функцией или если можно ограничиться MediaStore\Storage Access Framework. Здесь может помочь изменение в работе приложения либо переоформление заявки, это нужно учитывать.

Таким образом, с помощью пары строк кода можно обновить своё приложения для работы с файловой системой на новых версиях Android.

Источник

Package visibility in Android 11

On Android 10 and earlier, apps could query the full list of installed apps on the system using methods like queryIntentActivities() . In most cases, this is far broader access than is necessary for an app to implement its functionality. With our ongoing focus on privacy, we’re introducing changes on how apps can query and interact with other installed apps on the same device on Android 11. In particular, we’re bringing better scoped access to the list of apps installed on a given device.

To provide better accountability for access to installed apps on a device, apps targeting Android 11 (API level 30) will see a filtered list of installed apps by default. In order to access a broader list of installed apps, an app can specify information about apps they need to query and interact with directly. This can be done by adding a element in the Android manifest.

For most common scenarios, including any implicit intents started with startActivity() , you won’t have to change anything! For other scenarios, like opening a specific third party application directly from your UI, developers will have to explicitly list the application package names or intent filter signatures like this:

If you use Custom Tabs to open URLs, you might be calling resolveActivity() and queryIntentActivities() in order to launch a non-browser app if one is available for the URL. In Android 11 there’s a better way to do this, which avoids the need to query other apps: the FLAG_ACTIVITY_REQUIRE_NON_BROWSER intent flag. When you call startActivity() with this flag, an ActivityNotFoundException will be thrown if a browser would have been launched. When this happens, you can open the URL in a Custom Tab instead.

In rare cases, your app might need to query or interact with all installed apps on a device, independent of the components they contain. To allow your app to see all other installed apps, Android 11 introduces the QUERY_ALL_PACKAGES permission. In an upcoming Google Play policy update, look for guidelines for apps that need the QUERY_ALL_PACKAGES permission.

Читайте также:  Как снять заднюю крышку андроид

When targeting API level 30 and adding a element to your app, use the latest available release of the Android Gradle plugin. Soon we’ll be releasing updates to older Android Gradle plugin versions to add support for this element. You can find more information and use cases about Package Visibility in the developer documentation.

Источник

Давайте будем прямыми в своих intent

В Android 12 появится важное изменение, улучшающее безопасность платформы целиком и всех приложений, предназначенных для работы с этой версией ОС. Активити, сервисы и бродкаст ресиверы (broadcast receivers), в которых указаны интент-фильтры (intent-filters), должны явно обозначать, будут ли они доступны для других приложений или компонентов системы.

Далее перевод статьи про проблемы и решения, которые могут возникнуть при переходе на новую версию.

Ошибки

Если установка вашего приложения завершается одним из сообщений ниже, скорее всего, это связано с новыми изменениями.

Решение

Обе эти ошибки можно устранить, добавив атрибут `android:exported` к каждому компоненту манифеста приложения, таким как , , или , если в них объявлены свои интент-фильтры.

Но не следует бездумно добавлять `android:exported=”true”` ко всем этим элементам. Просмотрите каждый компонент, включающий в себя и спросите себя: «Хочу ли я, чтобы любое приложение, установленное на устройстве, могло запустить этот компонент?».

Ответ на этот вопрос зависит от назначения приложения, взаимодействия с ним другого ПО и иных, более специфических условий. Ниже представлены несколько распространённых примеров интент-фильтров с рекомендуемым значением exported-атрибута и объяснением выбора.

Активити с : android:exported=”true”

Скорее всего, это MainActivity вашего приложения и поскольку лаунчер в Android может быть обычным приложением, атрибут exported необходим, иначе лаунчер не сможет запустить её.

Эта активити отвечает за обработку действия «открыть с помощью» из других приложений.

Позволяет обрабатывать контент, которым могут делиться другие приложения.

Если сервис предоставляет другим приложениям доступ к медиа-библиотеке вашего, то он должен быть экспортированным (exported), чтобы разрешить приложениям использовать эту библиотеку. Скорее всего, такой сервис, напрямую или опосредованно, наследуется от MediaBrowserServiceCompat. Если это не так, то возможно, атрибут exported необязателен.

Это сервис Firebase Cloud Messaging, он должен наследоваться от FirebaseMessagingService и не должен быть экспортированным, поскольку Firebase может запустить компонент вне зависимости от факта его экспортации. Подробности можно узнать по ссылке: Set up a Firebase Cloud Messaging client app on Android

Система может доставлять это событие в бродкаст ресивер вне зависимости от факта экспортации.

Бэкграунд

Вплоть до Android 12, активити, сервисы и бродкаст ресиверы с обозначенным интент-фильтром автоматически становились экспортированными.

Эта активити экспортирована по умолчанию:

И хотя подобное дефолтное поведение выглядит разумным, ошибка может сделать ваше приложение уязвимым. Например, приложение имеет активити для проигрывания видео:

Позже обнаруживается, что мы обращаемся к этой активити из множества разных мест в приложении, и, чтобы уменьшить связность, меняем её, включая интент-фильтр для выбора активити системой:

Внезапно появляется проблема. Наша активити, созданная исключительно для использования внутри приложения, внезапно становится экспортированной!

Но при таргете на Android 12 система предотвратит подобное поведение, требуя от нас явно указать значение атрибута android:exported. И поскольку в данном случае мы не хотим, чтобы активити была экспортирована — ставим атрибут android:exported = false, чтобы обезопасить приложение.

Для улучшения безопасности в Android 12 появится важное изменение. Приложения, у которых эта версия указана в target SDK, должны будут явно объявлять значение атрибута `android:exported` для любых активити, сервисов или ресиверов, которые используют интент-фильтры в AndroidManifest.xml. Без него приложение просто не установится.

Тщательно принимайте решение касательно значения этого атрибута и, если сомневаетесь — предпочитайте android:exported=”false”.

Для получения более подробной информации об интентах и интент-фильтрах смотрите Receiving an implicit intent.

О других изменениях безопасности и приватности читайте на этой странице.

Источник

Оцените статью