क्या कोई तरीका है जिससे मैं अपने ऐप के लिए एंड्रॉइड की नोटिफिकेशन सेटिंग्स स्क्रीन पर प्राप्त करने का इरादा लॉन्च कर सकता हूं (नीचे चित्र)? या एक आसान तरीका है कि मैं एक वरीयतास्क्रीन आइटम बना सकता हूं जो सिर्फ एक क्लिक पर यहां जाता है?
जवाबों:
निम्नलिखित एंड्रॉइड 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
:-)
Settings
ऐप के आंतरिक / छिपे हुए कोड पर निर्भर करता है , इसलिए इस बात की कोई गारंटी नहीं है कि भविष्य में Settings
ऐप नहीं बदलेगा और अब उसी स्ट्रिंग कार्रवाई का उपयोग नहीं करेगा , एप्लिकेशन विशिष्ट अधिसूचना स्क्रीन खोलने के लिए घटक, या आशय एक्स्ट्रा कलाकार। 2) यह विधि पूरी तरह से पिछड़े संगत नहीं है। स्ट्रिंग एक्शन और उपयोग किए गए घटक लगभग 2 साल पहले पेश किए गए थे। यहाँ देखें
मैंने सभी मामलों का समर्थन करने के लिए सर्गेई और 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);
मैंने एंड्रॉइड 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);
}
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1)
कभी भी निष्पादित नहीं किया जाएगा, कुछ हिस्सों में आप सही तरीके से उपयोग कर रहे हैं, Settings.ACTION_APP_NOTIFICATION_SETTINGS
लेकिन कुछ अन्य में आप हार्डकोड स्ट्रिंग का उपयोग कर रहे हैं"android.settings.APP_NOTIFICATION_SETTINGS"
मैं इस कोड का उपयोग करता हूं (किटकैट और अगले संस्करण):
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);
}
आलसी पुरुषों के लिए यह @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)
}
मैंने ऊपर दिए गए कुछ उत्तरों के कोड को मिला दिया और थोड़ा संपादित किया, मैंने परीक्षण किया है और यह एंड्रॉइड किटकैट, लॉलीपॉप, मार्शमैलो, नूगाट, ओरेओ और पाई, एपीआई स्तर 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
}
}
मैं @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
होगा।
उपयोग 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);
}
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)
को कभी नहीं बुलाया जाएगा
अंत में मैंने लगभग सभी उपकरणों का परीक्षण किया और ठीक काम किया। इस प्रकार दिया गया कोड
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
}
}