В общем суть - отправляем пользователя к настройкам
по другому не нашел
У себя прикручивал к преференс фрагменту
<SwitchPreferenceCompat
app:defaultValue="false"
android:persistent="false"
app:key="openLink"
app:title="Ссылки на чек"
app:summaryOn="обрабатываются этим приложением"
app:summaryOff="действие по умолчанию в Android">
</SwitchPreferenceCompat>
<Preference
android:key="pref_static_field_key"
android:selectable="false"
android:persistent="false"
android:summary="Чтобы вместо перехода на сайт налоговой, происходила обработка приложением, потребуется подтвердить выбор в системных настройках.\nОткрывать по умолчанию - Добавить ссылку - Поставить галочку"/>
в рут преференс добавил два фиктивных элемента android:persistent="false"
упростил функцию проверки под свои цели
@RequiresApi(api = Build.VERSION_CODES.S)
private boolean checkLinkAssociation() {
Context context = requireActivity();
DomainVerificationManager manager;
manager = context.getSystemService(DomainVerificationManager.class);
DomainVerificationUserState userState;
try {
userState = manager.getDomainVerificationUserState(context.getPackageName());
} catch (PackageManager.NameNotFoundException e) {
return false;
}
Map<String, Integer> hostToStateMap = userState.getHostToStateMap();
for (String key : hostToStateMap.keySet()) {
Integer stateValue = hostToStateMap.get(key);
if (stateValue != null && stateValue != DomainVerificationUserState.DOMAIN_STATE_VERIFIED && stateValue != DomainVerificationUserState.DOMAIN_STATE_SELECTED) {
return false;
}
}
return true;
}
в onCreatePreferences запомнил для использования в онресуме и повесил интент
prefOpenLink = findPreference( "openLink");
if (prefOpenLink != null) {
final Intent i = new Intent();
i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.setData(Uri.parse("package:" + requireActivity().getPackageName()));
prefOpenLink.setIntent(i);
}
ну и статус свитча ставлю текущий
@Override
public void onResume() {
super.onResume();
if (prefOpenLink != null) {
boolean status = true;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
status = checkLinkAssociation();
}
prefOpenLink.setChecked(status);
}
}