내 앱의 Android 알림 설정에 연결하는 방법이 있나요?


84

내 앱의 Android 알림 설정 화면으로 이동하는 인 텐트를 시작할 수있는 방법이 있습니까 (아래 그림 참조)? 아니면 클릭 한 번으로 여기로 이어지는 PreferenceScreen 항목을 쉽게 만들 수 있습니까?

여기에 이미지 설명 입력


... 그것은 주요 응용 프로그램 정보 화면으로 저를 얻을 것이다 Settings.ACTION_APPLICATION_DETAILS_SETTINGS처럼 보이지만 나는 앱 정보 화면에서 알림 설정에 한 단계를 얻으려고
모하메드 하페즈에게

@ mohamed-hafez에있는 동안이 "앱 설정"항목을 여기에 고정하는 방법을 설명해 주시겠습니까? Manifest의 인 텐트 필터를 통해 수행되었지만 실패했습니다. 감사!
가브리엘

@Gabriel, 이미 질문에 대한 답을 찾은 것 같지만 관심있는 다른 사람은 여기에 있습니다 .
Sam

앱 알림 카테고리를 여는 방법 (기본값)? orio에서. 우리는 소리, 진동 및 기타 설정을 변경할 수있는
사가르

답변:


148

다음은 Android 5.0 (Lollipop) 이상에서 작동합니다.

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

참고 : 이는 Android 5-7에서 공식적으로 지원되지 않지만 정상적으로 작동합니다. Android 8부터 공식적으로 지원됩니다.이 코드는 Android 5.0 이전 버전과 역 호환되지 않습니다.


@shhp-이 답변에 감사드립니다. N 미리보기에서도 작동합니다. 이 솔루션을 어떻게 찾았는지 몇 마디로 말씀해 주시겠습니까? 이 조사에서 가장 먼 것은이 로그 메시지였습니다 com.android.settings D/SubSettings: Launching fragment com.android.settings.notification.AppNotificationSettings. 앱 설정에서 "알림"줄을 클릭했을 때. link2src
데브 위원장

@ Dev-iL 당신은 첫 번째 단계를 얻습니다. 그런 다음 소스 코드를 확인하여 추가 항목이 무엇인지 확인했습니다. intent:-)
shhp

1
이것은 멋지지만 사용자는 몇 가지 사항을 알고 있어야합니다. 1)이 인 텐트는 Settings앱 의 내부 / 숨겨진 코드에 의존 하므로 앞으로 Settings앱이 변경되지 않고 더 이상 동일한 문자열 작업을 사용하지 않을 것이라는 보장 은 없습니다. , 구성 요소 또는 인 텐트 추가를 사용하여 앱별 알림 화면을 엽니 다. 2)이 방법은 이전 버전과 완전히 호환되지 않습니다. 사용 된 String 작업 및 구성 요소는 약 2 년 전에 소개되었습니다. 여기 커밋보기
토니 찬

@TonyChan 알림을 보내 주셔서 감사합니다. 대답에 추가하겠습니다.
shhp

1
참고 사항 : 다음과 같이 특정 알림 채널 설정에 도달 할 수도 있습니다. stackoverflow.com/a/48854197/878126
Android 개발자

78

모든 경우를 지원하기 위해 Sergei와 Shhp의 솔루션을 병합했습니다.

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

13

Android 8.0 Oreo API 26 이상에 대한 채널 알림 설정을 추가했습니다. Android 4.4, KitKat의 솔루션이 있습니다.

채널 알림 설정 사용법 :

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

앱 알림 설정 사용법 :

goToNotificationSettings(null, mContext);

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는 API> = Build.VERSION_CODES.O에서 사용할 수 있으므로 N_MR1 developer.android.com/reference/android/provider/…에서
Ante

코드 내부 if(Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1)를 올바르게 사용하고 일부 지역에서 실행되지 않습니다 Settings.ACTION_APP_NOTIFICATION_SETTINGS있지만, 일부 다른 사람에 당신은 하드 코드 문자열을 사용하고"android.settings.APP_NOTIFICATION_SETTINGS"
휴고 Allexis 카르 도나에게

5

이 코드 (kitkat 및 다음 버전)를 사용합니다.

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

5

게으른 남성의 경우 @Helix 답변의 kotlin 버전입니다.

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

설정 활동을 시작하지 않고 앱 내부에서 푸시 알림 설정을 처리하는 방법이 있습니까?
vinay kumar

3

위의 답변 중 일부 코드를 병합하고 약간의 편집을 추가했으며 테스트했으며 Android KitKat, Lollipop, Marshmallow, Nougat, Oreo 및 Pie, API 레벨 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           

    }

}

2

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

한 단계 더 나아가 컴팩트 클래스로 분기 할 때 각각을 추출 할 수 있습니다. 그리고 그 안에 when있을 공장을 만드십시오 .


1

를 사용 ACTION_APP_NOTIFICATION_SETTINGS하면 앱의 모든 채널이 나열됩니다.

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

단일 채널에 대한 설정을 열려면 다음을 사용할 수 있습니다. ACTION_CHANNEL_NOTIFICATION_SETTINGS .

sound,vibration.etc개별 채널에 대한 설정을 변경할 수 있습니다 .

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

SCHEME 상수는 무엇입니까?
Atetc

브랜치 else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1)가 절대 호출되지 않을 것
같습니다

0

마지막으로 거의 모든 장치를 테스트하고 잘 작동합니다. 다음과 같이 주어진 코드

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
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.