Я разрабатываю приложение, которое реализует службу VPN, и я хочу прослушать, когда пользователь нажал «Забыть VPN» в службе VPN моего приложения в настройках Android.
Есть ли способ сделать это?
Нет, вы можете использовать Intent prepare = VpnService.prepare(this), если намерение недействительно, то ваша VPN создается в настройках, иначе вызовите startActivityForResult(prepare, REQUEST_VPN), чтобы создать VPN. вы можете использовать нулевую проверку prepare == null, чтобы узнать, создана ли VPN или нет.
Надеюсь, это поможет вам.
При проверке исходного кода VpnSettings#удалитьпрофиль() - ничего не транслируется.
Единственным доступным обратным вызовом является VpnService#onRevoke(); как указано в документации:
Invoked when the application is revoked. At this moment, the VPN interface is already deactivated by the system. The application should close the file descriptor and shut down gracefully. The default implementation of this method is calling
Service#stopSelf().
Я полагаю, что исходный код является ответом на мой вопрос. Спасибо!
@avielt10 на стандартном ПЗУ, это кажется недосягаемым, но эти профили на самом деле хранятся в /misc/vpn/profiles, где можно использовать FileObserver для отслеживания событий DELETE или DELETE_SELF. VpnSettings — это редактор файлов в этом каталоге.
если VpnService не запущен, нам не позвонят onRevoke()
@MartinZeitler я вижу ... так что на нерутированном устройстве, если мое приложение является владельцем устройства, могу ли я попасть в этот каталог?
@avielt10 Вы получите уведомление, когда из этого каталога будет удалена какая-либо VPN, а не только ваша собственная VPN.
@AkshayKumarS Думаю, его можно отфильтровать по имени. Вы знаете, есть ли у меня доступ к этому пути как у владельца устройства?
@avielt10 можно наблюдать каталоги (которые вызывают событие DELETE), а также отдельные файлы (которые вызывают событие DELETE_SELF). на пользовательском ПЗУ однажды можно было даже транслировать пользовательское событие при удалении профиля. на самом деле, путь /data/misc/vpn/profiles. изменение меток SE Linux может потребоваться даже при наличии разрешений root. ls -Z /data/misc/vpn/profiles перечисляет контекст безопасности.
@MartinZeitler попробовал AVD, и ls -a /data/misc/vpn на выходе . .., кажется, что /data/misc/vpn/profiles не существует, хотя на устройстве есть 3 профиля VPN.
@avielt10 Я написал -Z, а не -a ... и этот путь жестко запрограммирован в исходном коде, который там четко читается и пишется. при использовании учетной записи пользователя и контекста, который может не указывать каталог, он не будет отображать каталог. только журнал аудита может показать отказ. SE Linux императивен и требует соответствующего контекста безопасности, что бы ни случилось; по крайней мере с Android 5.0.
mkdir /data/misc/vpn/profiles 0770 system system ...является частью скрипта init.rc, который создает структуру каталогов по умолчанию. что означает, что пользователь или группа system могут получить к нему доступ, независимо от контекста безопасности, что может добавить дополнительные ограничения. пользовательская трансляция может быть наименьшим усилием, без потери принятых мер безопасности... потому что это работает как system:system.
@MartinZeitler Спасибо за подробное объяснение, сэр.
Спасибо за ответ, уже пользуюсь вашим предложением. Я хотел знать, можно ли прослушать это действие пользователя.