Any way to link to the Android notification settings for my app?

前端 未结 10 1044
逝去的感伤
逝去的感伤 2020-11-28 03:15

Is there any way I can launch an intent to get to Android\'s notification settings screen for my app (pictured below)? Or an easy way I can make a PreferenceScreen item that

相关标签:
10条回答
  • 2020-11-28 03:39

    Finally i tested almost all devices and works fine. The code given as follows

    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
        }
    }
    
    0 讨论(0)
  • 2020-11-28 03:41

    I'd like to present a clean-code version of @Helix answer:

    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)
    }
    

    One can go even further and extract each when branch into a compact class. And create a factory in which when would be.

    0 讨论(0)
  • 2020-11-28 03:44

    I've appended Channel Notification Settings for Android 8.0 Oreo API 26 or later. There is a solution from Android 4.4, KitKat.

    Usage for Channel notification settings:

    // PRIMARY_CHANNEL:
    goToNotificationSettings(getString(R.string.PRIMARY_CHANNEL), mContext);
    // SECONDARY_CHANNEL:
    goToNotificationSettings(getString(R.string.SECONDARY_CHANNEL), mContext);
    

    Usage for App notification settings:

    goToNotificationSettings(null, mContext);
    

    The method of 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);
    }
    
    0 讨论(0)
  • 2020-11-28 03:46

    I merged the code of some of the answers above and added little edit, I have tested and it working fine on Android KitKat, Lollipop, Marshmallow, Nougat, Oreo and Pie, API level 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           
    
        }
    
    }
    
    0 讨论(0)
  • 2020-11-28 03:46

    Using ACTION_APP_NOTIFICATION_SETTINGS will list all channels of the app:

    Intent intent = new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS)
        .putExtra(Settings.EXTRA_APP_PACKAGE, context.getPackageName());
    startActivity(intent);
    

    To open the settings for a single channel, you can use ACTION_CHANNEL_NOTIFICATION_SETTINGS:

    Where you can change sound,vibration.etc settings for individual channel.

     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);
       } 
    
    0 讨论(0)
  • 2020-11-28 03:46
    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);
        }
    
    0 讨论(0)
提交回复
热议问题