web-dev-qa-db-ja.com

通知を表示せずにステータスバーに小さなアイコンのみを表示する

システムのnotificationトレイに通知自体を表示せずに、status barに常に小さなアイコンを表示したい。

カスタムlayoutを使用して、ルート要素の可視性をView.GONEまたはView.INVISIBLEに設定しようとしましたが、どちらもシステムで無視されます。

ルート要素の高さも設定しようとしましたが、システムもこれを無視します。

これが私のコードです:

R.layout.custom_notification

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/custom_notification"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_gravity="center"
    Android:background="@drawable/notif_background"
    Android:orientation="horizontal"
    Android:baselineAligned="false"/>

そして、Notificationを表示するためのコード:

 NotificationManager nm = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);
 NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(ctx);
 mBuilder
         .setSmallIcon(drawableId)
         .setAutoCancel(false)
         .setOngoing(true)
         .setPriority(Notification.PRIORITY_MAX);
 Intent resultIntent = new Intent(ctx, SettingsActivity.class);
 PendingIntent resultPendingIntent = PendingIntent.getActivity(ctx, 0, resultIntent, 0);
 mBuilder.setContentIntent(resultPendingIntent);
 int layout =  R.layout.custom_notification ;
 RemoteViews contentView = new RemoteViews(ctx.getPackageName(), layout);
 contentView.setViewVisibility(R.id.custom_notification, View.INVISIBLE);
 mBuilder.setContent(contentView);
 nm.notify(NOTIFICATION_ID, mBuilder.build());

私は自分の目標を達成するために文書化された解決策を必要としないことをよく知っています。そして、UXガイドラインがそのようなことをしないことを強く推奨していることも知っています。したがって、これを答えとして書いても意味がありません。

21
yshahak

関連する通知を表示せずにアイコンを表示することはお勧めできません。開発者のドキュメントに従って、

ステータスバー通知には、次のすべてが必要です。

  • ステータスバーのアイコン(興味があるもの)
  • 拡張ビューのタイトルと拡張メッセージ(カスタムの拡張ビューを定義しない限り)
  • PendingIntent。通知がクリックされて関連情報が表示されたときに発生します。

したがって、ユーザーエクスペリエンスを台無しにしたくない場合は、UXガイドラインに従うことを強くお勧めします。

論理的には、ステータスバーにはユーザー(通知)とシステム(その他)の2つの部分があります。システムがシステムパーツに何かを配置することを許可する場合–(他のアプリケーションによって投稿された)非常に多くの役に立たないアイコンが存在し、一貫性がなくなり、すべての使用エクスペリエンスが壊れる可能性があります。

アラームのデフォルトのステータスバーアイコンにアクセスする方法を提供する回答が見つかりました ここ です。あなたのモバイルをRoot化した後、それを行うことができます.youtubeでそれを行ういくつかのトリックがあります。同じトピックに関するいくつかの回答は、通知を使用してアイコンを表示することを提案しますが、通知テキストを空にして、ユーザーにアイコンのみが表示されるようにしますしかし、再びそれは方法ではありません

これはコードです 左および右のアイコン(つまりシステムアイコン)が記述されているシステムでのステータスバーの実装の場合、そこからいくつかのリードを得ることができます。それを説明する答えは here です。

10
TapanHP

通常のGoogle Playアプリケーションには使用しないことをお勧めします。いくつかの理由があります。

  1. 目に見えない通知を表示するのに役立つバグを見つけた場合、何も起こりません。このバグは、特定のAndroid=バージョンを備えた特定のデバイスでのみ機能します。注意:これは、開いたAPIを使用するほとんどのデバイスで通常のコードを正しく実行するように設定するのが非常に難しいことです。隠しAPIはすべてのデバイスで機能するわけではありません。

    1. ソースコードにはそのような動作はありません: http://grepcode.com/file/repository.grepcode.com/Java/ext/com.google.Android/android/5.1.1_r1/Android/app/ NotificationManager.Java#NotificationManager.notify%28int%2Candroid.app.Notification%29 。あなたはそのような行動で何も見つけることができません。

    2. 予測可能な動作には、Androidの* Compatクラスを使用します。つまり、通知にはNotificationCompatクラスのみを使用してください。アプリが通知を表示するのに役立つのは、ラッパーを使用する場合のみです。

    3. これは非常に醜いUI/UXです。

    4. 通知のワークフローは、Androidバージョンに大きく依存しています。

6
Vyacheslav

InputMethodService.showStatusIcon() を使用してこれを行うことができます。ただし、通常の通知を表示し、アプリが現在何をしているのかをユーザーに説明することをお勧めします。

1
Paweł Dedio

遅いですが、他の人に役立つかもしれません。

私の場合、とてもシンプルなので、メインのカスタムレイアウトで高さ0dpを使用するだけです。

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:id="@+id/layout" Android:layout_width="fill_parent" Android:layout_height="0dp">

wrap_contentはここでは機能しません。

0
Khalid Lakhani

remoteViewsを使用してタイトルとテキストを非表示にすることができます

R.id.notification_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >

    <ImageView
        Android:id="@+id/image"
        Android:layout_width="wrap_content"
        Android:layout_height="fill_parent"
        Android:layout_alignParentLeft="true"
        Android:layout_marginRight="10dp"
        Android:layout_marginLeft="7dp"
        Android:src="@drawable/icon_battery" />
</RelativeLayout>

mainActivity:

RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.notification_layout);
Context application = getApplicationContext();

Intent resultIntent = new Intent(application, MainActivity.class);
resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent resultPendingIntent = PendingIntent.getActivity(application, 0, resultIntent, 0);
NotificationManager nmgr = (NotificationManager) application.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(application)
            .setSmallIcon(R.drawable.icon_battery);

mBuilder.setContent(contentView);
Notification mNotification = mBuilder.build();

//  mNotification.flags |= FLAG_NO_CLEAR;
nmgr.notify(0, mNotification);
0
Guangqiu Jiang