web-dev-qa-db-ja.com

Androidで通知をプログラムで開く/閉じるにはどうすればよいですか?

私はどこでも検索しましたが、SDKまたはGoogleでこれを行う方法について何も見つかりません。すべてのカスタムランチャーがボタンを押すことで実行できるため(LauncherPro、ADWなど)、それが可能であることを知っています。

ありがとう。

29
user496854

プログラムでclose通知ドロワー ACTION_CLOSE_SYSTEM_DIALOGS インテント。

これにより、「一時的なシステムダイアログ」が閉じます。ドキュメントから:

一時的なシステムダイアログのいくつかの例は、通知ウィンドウシェードと最近のタスクダイアログです。

これは権限を必要とせず、Android 1.0。

次のコードは、Android 5.0を実行しているNexus 4で動作します。

Intent closeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
context.sendBroadcast(closeIntent);
35
Christopher Orr

Ashwinからの回答 は、Android 4.2.2より下のバージョン(つまり、バージョン17より下)で機能します。4.2.2では、「expand」メソッドが「expandNotificationsPanel」に変更されました「4.2.2以降でそのメソッド名を使用しない場合、Nullポインタ例外が発生します。したがって、コードは次のようになります。

Object sbservice = getSystemService( "statusbar" );
Class<?> statusbarManager = Class.forName( "Android.app.StatusBarManager" );
Method showsb;
if (Build.VERSION.SDK_INT >= 17) {
    showsb = statusbarManager.getMethod("expandNotificationsPanel");
}
else {
    showsb = statusbarManager.getMethod("expand");
}
showsb.invoke( sbservice );

そして、適切な権限をAndroidManifestに追加する必要があります。

<uses-permission Android:name="Android.permission.EXPAND_STATUS_BAR" />

明らかに、これは公開されたAPIの一部ではないため、これが将来の動作を保証するものではなく、多くの人がこれを行わないようにアドバイスします。

22
Jonathan

はい、このコードを実行したい場所に追加できます

Object sbservice = getSystemService( "statusbar" );
Class<?> statusbarManager = Class.forName( "Android.app.StatusBarManager" );
Method showsb = statusbarManager.getMethod( "expand" );
showsb.invoke( sbservice );

そして、この権限を追加します

<uses-permission Android:name="Android.permission.EXPAND_STATUS_BAR" />
15
Ashwin Singh

Androidで通知をプログラムで開く/閉じるにはどうすればよいですか?

Android SDKを使用して必要なことを行うことはできません。

すべてのcuustomeランチャーがボタンを押すことで実行できるため(LauncherPro、ADWなど)、それが可能であることを知っています。

すべての「カスタムランチャー」は、@ Yoni Samlanが質問の別の回答で提案した手法のバリエーションを使用して、SDKをバイパスしています。 SDKの一部ではないものは、デバイスメーカーが削除したり、コアAndroid今後のリリースでAndroidチームなど)に置き換えたりできます。

私はあなたが望むもの-すべきがSDKを介して可能であると主張します;そうでなければ、それは本当に代替のホーム画面の実装を制限します。ただし、あなたと私が欲しいものはそれほど重要ではありません。

4
CommonsWare

残念ながら、まだ公式APIはありません(リクエストされた here )が、今のところ、このコードを使用できます。私が見つけたすべての答えから一般化された:

// based on https://Gist.github.com/XinyueZ/7bad2c02be425b350b7f 
// requires permission: "Android.permission.EXPAND_STATUS_BAR"
@SuppressLint("WrongConstant", "PrivateApi")
fun setExpandNotificationDrawer(context: Context, expand: Boolean) {
    try {
        val statusBarService = context.getSystemService("statusbar")
        val methodName =
                if (expand)
                    if (Build.VERSION.SDK_INT >= 17) "expandNotificationsPanel" else "expand"
                else
                    if (Build.VERSION.SDK_INT >= 17) "collapsePanels" else "collapse"
        val statusBarManager: Class<*> = Class.forName("Android.app.StatusBarManager")
        val method: Method = statusBarManager.getMethod(methodName)
        method.invoke(statusBarService)
    } catch (e: Exception) {
        e.printStackTrace()
    }
}
1

Christopher Orrの回答は、通知ドロワーを閉じるのに最適です

AccessibilityServices を使用して、以下を呼び出すことにより、通知またはクイック設定をプログラムで表示できます。

0
Eric