2015-09-03 27 views
29

有没有什么办法可以启动意图进入我的应用的Android通知设置屏幕(如下图所示)?还是一种简单的方法,我可以制作一个PreferenceScreen项目,只需点击此处即可导致此问题?任何方式链接到我的应用程序的Android通知设置?

enter image description here

+0

它看起来像Settings.ACTION_APPLICATION_DETAILS_SETTINGS会让我进入主应用程序信息屏幕,但我试图进一步进入应用程序信息屏幕上的通知设置... –

+0

虽然我们在@ mohamed-hafez,你能解释你是如何做到的吗?在此处定位此“应用设置”条目?我认为它是通过Manifest中的intent-filter完成的,但是没有做到。谢谢! – Gabriel

+0

@Gabriel,看起来你已经找到了你的问题的答案,但对于任何感兴趣的人,答案是[这里](http://stackoverflow.com/a/28710214/238753)。 – Sam

回答

52

以下将是Android 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 O 
intent.putExtra("android.provider.extra.APP_PACKAGE", getPackageName()); 

startActivity(intent); 

注:这不是正式的Android 5-7的支持,但它工作得很好。它是从Android O开始正式支持的。此代码与5.0之前版本的Android不兼容。

+0

太棒了,也可以在棉花糖中使用! –

+0

@shhp - 谢谢你的回答。也可以在N预览中使用。你能说几句话,你是如何找到这个解决方案的?我在这次调查中得到的最远是这条日志消息:'com.android.settings D/SubSettings:启动片段com.android.settings.notification.AppNotificationSettings'时,点击应用程序设置中的“通知”行。 [link2src](https://android.googlesource.com/platform/packages/apps/Settings/+/master/src/com/android/settings/notification/AppNotificationSettings.java) –

+0

@ Dev-iL您将获得第一步。然后我检查了源代码,看看应该在'intent'中加入什么额外的东西:-) – shhp

4

我用这个代码(奇巧和下一版本):

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

我合并谢尔盖和Shhp的解决方案来支持所有的案件:

Intent intent = new Intent(); 
    if(android.os.Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1){ 
     intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS"); 
     intent.putExtra("android.provider.extra.APP_PACKAGE", context.getPackageName()); 
    }else if(android.os.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); 
5

我附加通道通知的设置适用于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); 

用途为App通知设置:

goToNotificationSettings(null, mContext); 

goToNotificationSettings的方法:

public void goToNotificationSettings(String channel, Context context) { 
     Intent intent = new Intent(); 
     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("android.settings.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 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

Settings.ACTION_APP_NOTIFICATION_SETTINGS可从API> = Build.VERSION_CODES.O获得,因此不应在N_MR1上使用https://developer.android.com/reference/android/provider/Settings.html#ACTION_APP_NOTIFICATION_SETTINGS – Ante

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); 
    } 
相关问题