android
android-notifications
android-6.0-marshmallow
Mohamed Hafez
fuente
fuente
Respuestas:
Lo siguiente funcionará en Android 5.0 (Lollipop) y superior:
Intent intent = new Intent(); intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS"); //for Android 5-7 intent.putExtra("app_package", getPackageName()); intent.putExtra("app_uid", getApplicationInfo().uid); // for Android 8 and above intent.putExtra("android.provider.extra.APP_PACKAGE", getPackageName()); startActivity(intent);
Notas: Esto no se admite oficialmente en Android 5-7, pero funciona bien. Es oficialmente compatible a partir de Android 8. Este código no es compatible con versiones anteriores de Android 5.0.
fuente
com.android.settings D/SubSettings: Launching fragment com.android.settings.notification.AppNotificationSettings
al hacer clic en la línea "Notificaciones" en la configuración de la aplicación. link2srcintent
:-)Settings
aplicación, por lo que no hay garantía de que en el futuro laSettings
aplicación no cambie y ya no use la misma acción String , componente o Intent extras para abrir la pantalla de notificación específica de la aplicación. 2) Este método no es completamente compatible con versiones anteriores. La acción String y los componentes utilizados se introdujeron hace aproximadamente 2 años. Ver compromiso aquíFusioné la solución de Sergei y Shhp para respaldar todos los casos:
Intent intent = new Intent(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS); intent.putExtra(Settings.EXTRA_APP_PACKAGE, context.getPackageName()); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS"); intent.putExtra("app_package", context.getPackageName()); intent.putExtra("app_uid", context.getApplicationInfo().uid); } else { intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setData(Uri.parse("package:" + context.getPackageName())); } context.startActivity(intent);
fuente
Agregué la configuración de notificación de canal para Android 8.0 Oreo API 26 o posterior. Existe una solución de Android 4.4, KitKat.
Uso de la configuración de notificaciones del canal:
// PRIMARY_CHANNEL: goToNotificationSettings(getString(R.string.PRIMARY_CHANNEL), mContext); // SECONDARY_CHANNEL: goToNotificationSettings(getString(R.string.SECONDARY_CHANNEL), mContext);
Uso para la configuración de notificaciones de la aplicación:
goToNotificationSettings(null, mContext);
El método de goToNotificationSettings:
public void goToNotificationSettings(String channel, Context context) { Intent intent = new Intent(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { intent.addFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK); if (channel != null) { intent.setAction(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS); intent.putExtra(Settings.EXTRA_CHANNEL_ID, channel); } else { intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS); } intent.putExtra(Settings.EXTRA_APP_PACKAGE, context.getPackageName()); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (channel != null) { intent.setAction(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS); intent.putExtra(Settings.EXTRA_CHANNEL_ID, channel); } else { intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS); } intent.putExtra(Settings.EXTRA_APP_PACKAGE, context.getPackageName()); } else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS); intent.putExtra(Settings.EXTRA_APP_PACKAGE, context.getPackageName()); } else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS); intent.putExtra("app_package", context.getPackageName()); intent.putExtra("app_uid", context.getApplicationInfo().uid); } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) { intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setData(Uri.parse("package:" + context.getPackageName())); } context.startActivity(intent); }
fuente
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1)
nunca se ejecutará, en algunas partes está usando correctamente,Settings.ACTION_APP_NOTIFICATION_SETTINGS
pero en otras está usando una cadena de código duro"android.settings.APP_NOTIFICATION_SETTINGS"
Yo uso este código (kitkat y próximas versiones):
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Intent intent = new Intent(); intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS"); intent.putExtra("app_package", getActivity().getPackageName()); intent.putExtra("app_uid", getActivity().getApplicationInfo().uid); startActivity(intent); } else if (android.os.Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) { Intent intent = new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setData(Uri.parse("package:" + getActivity().getPackageName())); startActivity(intent); }
fuente
Fusioné el código de algunas de las respuestas anteriores y agregué una pequeña edición, lo probé y funciona bien en Android KitKat, Lollipop, Marshmallow, Nougat, Oreo y Pie, API nivel 19-28
public void goToNotificationSettings(Context context) { String packageName = context.getPackageName(); try { Intent intent = new Intent(); if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) { intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS); intent.putExtra(Settings.EXTRA_APP_PACKAGE, packageName); intent.addFlags(FLAG_ACTIVITY_NEW_TASK); } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O) { intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS); intent.putExtra("android.provider.extra.APP_PACKAGE", packageName); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS"); intent.putExtra("app_package", packageName); intent.putExtra("app_uid", context.getApplicationInfo().uid); } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) { intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setData(Uri.parse("package:" + packageName)); } else { return; } startActivity(intent); } catch (Exception e) { // log goes here } }
fuente
Para los hombres perezosos, esta es la versión kotlin de la respuesta de @Helix:
fun openAppNotificationSettings(context: Context) { val intent = Intent().apply { when { Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> { action = Settings.ACTION_APP_NOTIFICATION_SETTINGS putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName) } Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP -> { action = "android.settings.APP_NOTIFICATION_SETTINGS" putExtra("app_package", context.packageName) putExtra("app_uid", context.applicationInfo.uid) } else -> { action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS addCategory(Intent.CATEGORY_DEFAULT) data = Uri.parse("package:" + context.packageName) } } } context.startActivity(intent) }
fuente
Me gustaría presentar una versión de código limpio de la respuesta de @Helix:
fun openNotificationsSettings() { val intent = Intent() when { Build.VERSION.SDK_INT > Build.VERSION_CODES.O -> intent.setOpenSettingsForApiLarger25() Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP -> intent.setOpenSettingsForApiBetween21And25() else -> intent.setOpenSettingsForApiLess21() } app.startActivity(intent) } private fun Intent.setOpenSettingsForApiLarger25(){ action = Settings.ACTION_APP_NOTIFICATION_SETTINGS putExtra("android.provider.extra.APP_PACKAGE", app.packageName) } private fun Intent.setOpenSettingsForApiBetween21And25(){ action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS putExtra("app_package", app.packageName) putExtra("app_uid", app.applicationInfo?.uid) } private fun Intent.setOpenSettingsForApiLess21(){ action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS addCategory(Intent.CATEGORY_DEFAULT) data = Uri.parse("package:" + app.packageName) }
Uno puede ir aún más lejos y extraer cada uno cuando se ramifica en una clase compacta. Y crear una fábrica en la que
when
estaría.fuente
El uso
ACTION_APP_NOTIFICATION_SETTINGS
enumerará todos los canales de la aplicación:Intent intent = new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS) .putExtra(Settings.EXTRA_APP_PACKAGE, context.getPackageName()); startActivity(intent);
Para abrir la configuración de un solo canal, puede usar
ACTION_CHANNEL_NOTIFICATION_SETTINGS
:Donde puede cambiar la
sound,vibration.etc
configuración de un canal individual.if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { Intent intent = new Intent("android.settings.CHANNEL_NOTIFICATION_SETTINGS"); intent.putExtra("android.provider.extra.CHANNEL_ID", "ChannelID"); intent.putExtra("android.provider.extra.APP_PACKAGE", getPackageName()); startActivity(intent); }
fuente
public static void goToNotificationSettings(Context context) { Intent intent = new Intent(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.fromParts(SCHEME, context.getPackageName(), null)); } else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) { intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS"); intent.putExtra("app_package", context.getPackageName()); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS"); intent.putExtra("app_package", context.getPackageName()); intent.putExtra("app_uid", context.getApplicationInfo().uid); } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) { intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setData(Uri.parse("package:" + context.getPackageName())); } else { return; } context.startActivity(intent); }
fuente
else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1)
nunca se llamaráFinalmente probé casi todos los dispositivos y funciona bien. El código dado de la siguiente manera
public void goToPushSettingPage(Context context) { try { Intent intent=new Intent(); if(Build.VERSION.SDK_INT>Build.VERSION_CODES.N_MR1){ intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS); intent.putExtra(Settings.EXTRA_APP_PACKAGE,context.getPackageName()); }else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS); intent.putExtra(ConstUtil.PUSH_SETTING_APP_PACKAGE,context.getPackageName()); intent.putExtra(ConstUtil.PUSH_SETTING_APP_UID,context.getApplicationInfo().uid); }else{ intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setData(Uri.parse(ConstUtil.PUSH_SETTING_URI_PACKAGE+context.getPackageName())); } startActivity(intent); } catch (Exception e) { // log goes here } }
fuente