मेरे ऐप के लिए Android सूचना सेटिंग से लिंक करने का कोई तरीका?


84

क्या कोई तरीका है जिससे मैं अपने ऐप के लिए एंड्रॉइड की नोटिफिकेशन सेटिंग्स स्क्रीन पर प्राप्त करने का इरादा लॉन्च कर सकता हूं (नीचे चित्र)? या एक आसान तरीका है कि मैं एक वरीयतास्क्रीन आइटम बना सकता हूं जो सिर्फ एक क्लिक पर यहां जाता है?

यहाँ छवि विवरण दर्ज करें


ऐसा लगता है कि Settings.ACTION_APPLICATION_DETAILS_SETTINGS मुझे मुख्य एप्लिकेशन जानकारी स्क्रीन पर ले जाएगा, लेकिन मैं ऐप सूचना स्क्रीन पर अधिसूचना सेटिंग्स में एक कदम और आगे बढ़ने की कोशिश कर रहा हूं ...
मोहम्मद हाफिज

जब हम इस पर @ mohamed-hafez हैं, तो क्या आप बता सकते हैं कि आपने इस "ऐप सेटिंग्स" प्रविष्टि को लंगर कैसे डाला? मुझे लगता है कि यह घोषणापत्र में एक इरादे-फ़िल्टर के माध्यम से किया गया है, लेकिन ऐसा करने में विफल रहा। धन्यवाद!
गैब्रियल

@ गैब्रिएल, ऐसा लगता है जैसे आपने पहले ही अपने प्रश्न का उत्तर पा लिया था, लेकिन किसी और के लिए दिलचस्पी है, इसका जवाब यहां है
सैम

एप्लिकेशन अधिसूचना श्रेणी (डिफ़ॉल्ट) कैसे खोलें? ओरियो पर। जहां हम ध्वनि, कंपन और अन्य सेटिंग को बदल सकते हैं
सागर

जवाबों:


149

निम्नलिखित एंड्रॉइड 5.0 (लॉलीपॉप) और इसके बाद के संस्करण में काम करेगा:

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

नोट: यह आधिकारिक तौर पर एंड्रॉइड 5-7 में समर्थित नहीं है, लेकिन यह ठीक काम करता है। यह आधिकारिक रूप से एंड्रॉइड 8 के रूप में समर्थित है। यह कोड 5.0 से पहले एंड्रॉइड के संस्करणों के साथ पीछे की ओर संगत नहीं है।


@ शश - इस उत्तर के लिए धन्यवाद। एन पूर्वावलोकन में भी काम करता है। क्या आप कृपया कुछ शब्दों में कहेंगे कि आपको यह समाधान कैसे मिला? इस जांच में मुझे जो सबसे दूर मिला, वह यह लॉग मैसेज था: com.android.settings D/SubSettings: Launching fragment com.android.settings.notification.AppNotificationSettingsऐप सेटिंग्स में "नोटिफिकेशन" लाइन पर क्लिक करते समय। link2src
देव-आईएल

@ देव-आईएल आपको पहला कदम मिला। तब मैं स्रोत कोड की जाँच की है देखने के लिए क्या एक्स्ट्रा कलाकार में रखा जाना चाहिए intent:-)
shhp

1
यह अच्छा है, लेकिन उपयोगकर्ताओं को कुछ बातों के बारे में पता होना चाहिए: 1) यह आशय Settingsऐप के आंतरिक / छिपे हुए कोड पर निर्भर करता है , इसलिए इस बात की कोई गारंटी नहीं है कि भविष्य में Settingsऐप नहीं बदलेगा और अब उसी स्ट्रिंग कार्रवाई का उपयोग नहीं करेगा , एप्लिकेशन विशिष्ट अधिसूचना स्क्रीन खोलने के लिए घटक, या आशय एक्स्ट्रा कलाकार। 2) यह विधि पूरी तरह से पिछड़े संगत नहीं है। स्ट्रिंग एक्शन और उपयोग किए गए घटक लगभग 2 साल पहले पेश किए गए थे। यहाँ देखें
टोनी चैन

@TonyChan आपको अनुस्मारक के लिए धन्यवाद। मैं उन्हें उत्तर में जोड़ूंगा।
shhp

1
बस एक ओर ध्यान दें: आप विशिष्ट अधिसूचना चैनल सेटिंग पर भी पहुँच सकते हैं, जैसा कि यहाँ दिखाया गया है: stackoverflow.com/a/48854197/878126
एंड्रॉयड डेवलपर

78

मैंने सभी मामलों का समर्थन करने के लिए सर्गेई और 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

मैंने एंड्रॉइड 8.0 ओरेओ एपीआई 26 या बाद के लिए चैनल अधिसूचना सेटिंग्स को जोड़ा है। एंड्रॉइड 4.4, किटकैट से एक समाधान है।

चैनल अधिसूचना सेटिंग्स के लिए उपयोग:

// 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 एपीआई से उपलब्ध है> = Build.VERSION_CODES.O तो यह N_MR1 पर नहीं किया जाना चाहिए developer.android.com/reference/android/provider/...
पूर्व

अंदर कोड if(Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1)कभी भी निष्पादित नहीं किया जाएगा, कुछ हिस्सों में आप सही तरीके से उपयोग कर रहे हैं, Settings.ACTION_APP_NOTIFICATION_SETTINGSलेकिन कुछ अन्य में आप हार्डकोड स्ट्रिंग का उपयोग कर रहे हैं"android.settings.APP_NOTIFICATION_SETTINGS"
ह्यूगो अललेक्सिस कार्डोना

5

मैं इस कोड का उपयोग करता हूं (किटकैट और अगले संस्करण):

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 उत्तर का कोटलिन संस्करण है:

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

क्या सेटिंग गतिविधि शुरू किए बिना ऐप के अंदर से पुश अधिसूचना सेटिंग को संभालने का एक तरीका है?
विनय कुमार

3

मैंने ऊपर दिए गए कुछ उत्तरों के कोड को मिला दिया और थोड़ा संपादित किया, मैंने परीक्षण किया है और यह एंड्रॉइड किटकैट, लॉलीपॉप, मार्शमैलो, नूगाट, ओरेओ और पाई, एपीआई स्तर 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);
    }

स्कीम स्थिरांक क्या है?
एट्टेक

लगता है कि शाखा 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
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.