Có cách nào để liên kết đến cài đặt thông báo Android cho ứng dụng của tôi không?


81

Có cách nào để tôi có thể khởi chạy ý định truy cập màn hình cài đặt thông báo của Android cho ứng dụng của mình (hình bên dưới) không? Hay một cách dễ dàng để tôi có thể tạo một mục PreferenceScreen chỉ dẫn đến đây bằng một cú nhấp chuột?

nhập mô tả hình ảnh ở đây


Có vẻ như Cài đặt.ACTION_APPLICATION_DETAILS_SETTINGS sẽ đưa tôi đến màn hình thông tin ứng dụng chính, nhưng tôi đang cố gắng tiến thêm một bước vào cài đặt Thông báo trên màn hình thông tin ứng dụng ...
Mohamed Hafez

Trong khi chúng tôi đang ở đó @ mohamed-hafez, bạn có thể giải thích cách bạn đã làm để neo mục "Cài đặt ứng dụng" này ở đây không? Tôi cho rằng nó được thực hiện thông qua bộ lọc ý định trong Tệp kê khai, nhưng không thực hiện được. Cảm ơn!
Gabriel

@Gabriel, có vẻ như bạn đã tìm thấy câu trả lời cho câu hỏi của mình, nhưng đối với bất kỳ ai quan tâm khác, câu trả lời là ở đây .
Sam

làm thế nào để mở danh mục thông báo ứng dụng (Mặc định)? trên orio. nơi chúng ta có thể thay đổi âm thanh, rung và thiết lập khác
Sagar

Câu trả lời:


144

Các tính năng sau sẽ hoạt động trong Android 5.0 (Lollipop) trở lên:

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

Lưu ý: Tính năng này không được hỗ trợ chính thức trong Android 5-7, nhưng nó hoạt động tốt. Nó chính thức được hỗ trợ kể từ Android 8. Mã này không tương thích ngược với các phiên bản Android trước 5.0.


@shhp - Cảm ơn bạn vì câu trả lời này. Cũng hoạt động trong N bản xem trước. Bạn có thể vui lòng nói vài lời bạn đã tìm ra giải pháp này như thế nào không? Điều xa nhất mà tôi nhận được trong cuộc điều tra này là thông báo nhật ký này: com.android.settings D/SubSettings: Launching fragment com.android.settings.notification.AppNotificationSettingskhi nhấp vào dòng "Thông báo" trong cài đặt ứng dụng. link2src
Dev-iL

@ Dev-iL bạn đã có bước đầu tiên. Sau đó, tôi đã kiểm tra mã nguồn để xem những tính năng bổ sung nào nên được đưa vào intent:-)
shhp

1
Điều này thật tuyệt, nhưng người dùng nên lưu ý một số điều: 1) Mục đích này dựa trên mã nội bộ / ẩn của Settingsứng dụng, vì vậy không có gì đảm bảo rằng trong tương lai Settingsứng dụng sẽ không thay đổi và không còn sử dụng cùng một hành động Chuỗi , thành phần hoặc tính năng bổ sung Ý định để mở màn hình thông báo cụ thể của ứng dụng. 2) Phương pháp này không hoàn toàn tương thích ngược. Hành động chuỗi và các thành phần được sử dụng đã được giới thiệu khoảng 2 năm trước. Xem cam kết tại đây
Tony Chan

@TonyChan Cảm ơn bạn đã nhắc nhở. Tôi sẽ thêm chúng trong câu trả lời.
shhp

Chỉ cần chỉnh sửa để điều này sẽ hoạt động với Android O, ngoài Android 5-7. Lưu ý: tính năng này chính thức được hỗ trợ trong Android O!
Mohamed Hafez

77

Tôi đã hợp nhất giải pháp của Sergei và Shhp để hỗ trợ tất cả các trường hợp:

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

12

Tôi đã thêm Cài đặt thông báo kênh cho Android 8.0 Oreo API 26 trở lên. Có một giải pháp từ Android 4.4, KitKat.

Sử dụng cho cài đặt thông báo Kênh:

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

Sử dụng cho cài đặt thông báo Ứng dụng:

goToNotificationSettings(null, mContext);

Phương thức của 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);
}

1
Settings.ACTION_APP_NOTIFICATION_SETTINGS có sẵn từ API> = Build.VERSION_CODES.O, vì vậy nó không nên được sử dụng trên N_MR1 developer.android.com/reference/android/provider/…
Ante

mã bên trong if(Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) sẽ không bao giờ được thực thi, trong một số bộ phận bạn đang sử dụng một cách chính xác Settings.ACTION_APP_NOTIFICATION_SETTINGSnhưng trong một số người khác bạn đang sử dụng chuỗi hardcode"android.settings.APP_NOTIFICATION_SETTINGS"
Hugo Allexis Cardona

5

Tôi sử dụng mã này (kitkat và các phiên bản tiếp theo):

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

3

Tôi đã hợp nhất mã của một số câu trả lời ở trên và thêm một số chỉnh sửa nhỏ, tôi đã thử nghiệm và nó hoạt động tốt trên Android KitKat, Lollipop, Marshmallow, Nougat, Oreo và Pie, API cấp 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           

    }

}

3

Đối với những người đàn ông lười biếng, đây là phiên bản kotlin của câu trả lời @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)
}

2

Tôi muốn trình bày một phiên bản mã sạch của @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)
}

Người ta có thể đi xa hơn nữa và trích xuất mỗi khi rẽ nhánh thành một lớp nhỏ gọn. Và tạo ra một nhà máy ở đó when.


1

Sử dụng ACTION_APP_NOTIFICATION_SETTINGSsẽ liệt kê tất cả các kênh của ứng dụng:

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

Để mở cài đặt cho một kênh, bạn có thể sử dụng ACTION_CHANNEL_NOTIFICATION_SETTINGS:

Nơi bạn có thể thay đổi sound,vibration.etccài đặt cho từng kênh.

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

Hằng số SCHEME là gì?
Atetc

Có vẻ như chi nhánh else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1)sẽ không bao giờ được gọi
Atetc

0

Cuối cùng tôi đã thử nghiệm hầu hết tất cả các thiết bị và hoạt động tốt. Mã đưa ra như sau

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
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.