32

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

ありがとう。

4

7 に答える 7

48

インテントをブロードキャストすることで、プログラムで通知ドロワーを閉じることができます。ACTION_CLOSE_SYSTEM_DIALOGS

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

一時的なシステムダイアログの例としては、通知ウィンドウシェードと最近のタスクダイアログがあります。

これには権限は必要ありません。Android1.0以降で利用できるようです。

次のコードは、Android5.0を実行しているNexus4で機能します。

Intent closeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
context.sendBroadcast(closeIntent);
于 2015-07-30T23:51:50.613 に答える
25

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

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の一部ではないため、これが将来機能することは保証されておらず、多くの人がこれを行わないようにアドバイスします。

于 2013-03-23T01:50:31.410 に答える
15

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

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" />
于 2012-07-04T06:18:13.970 に答える
4

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

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

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

すべての「カスタムランチャー」は、@ Yoni Samlanがあなたの質問に対する別の回答で提案した手法のバリエーションを使用して、SDKをバイパスしています。SDKの一部ではないものは、デバイスメーカーによって削除されたり、将来のリリースでコアAndroidチームに置き換えられたりする可能性があります。

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

于 2011-02-17T14:28:20.913 に答える
4

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

// 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()
    }
}
于 2018-07-02T08:43:04.763 に答える
2

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

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

于 2018-11-17T03:38:34.207 に答える
-3

これがAndroidのshowNotificationsメソッドLauncherです:

private void showNotifications() {
    final StatusBarManager statusBar = (StatusBarManager) getSystemService(STATUS_BAR_SERVICE);
    if (statusBar != null) {
        statusBar.expand();
    }
}

(Robbyが示したように、これは「ステータスバー」システムサービスです)。

于 2011-02-17T14:13:16.697 に答える