Notification.Builderの正確な使用方法


100

通知に非推奨のメソッド(notification.setLatestEventInfo())を使用していることがわかりました

それはNotification.Builderを使用することを言います。

  • どうやって使うの?

新しいインスタンスを作成しようとすると、次のように表示されます。

Notification.Builder cannot be resolved to a type

これはAPIレベル11(Android 3.0)で機能することに気付きました。
mobiledev Alex

回答:


86

これはAPI 11に含まれているため、3.0より前のバージョン用に開発している場合は、引き続き古いAPIを使用する必要があります。

更新:NotificationCompat.Builderクラスがサポートパッケージに追加されたため、これを使用してAPIレベルv4以上をサポートできます。

http://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html


ありがとう。関数ページ自体でそれが言及されていないのはなぜでしょうか
サーリコ

15
ええ:廃止の警告は私の考えでは少し時期尚早ですが、何を知っていますか?
Femi

152

Notification.Builder API 11またはNotificationCompat.Builder API 1

使用例です。

Intent notificationIntent = new Intent(ctx, YourClass.class);
PendingIntent contentIntent = PendingIntent.getActivity(ctx,
        YOUR_PI_REQ_CODE, notificationIntent,
        PendingIntent.FLAG_CANCEL_CURRENT);

NotificationManager nm = (NotificationManager) ctx
        .getSystemService(Context.NOTIFICATION_SERVICE);

Resources res = ctx.getResources();
Notification.Builder builder = new Notification.Builder(ctx);

builder.setContentIntent(contentIntent)
            .setSmallIcon(R.drawable.some_img)
            .setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.some_big_img))
            .setTicker(res.getString(R.string.your_ticker))
            .setWhen(System.currentTimeMillis())
            .setAutoCancel(true)
            .setContentTitle(res.getString(R.string.your_notif_title))
            .setContentText(res.getString(R.string.your_notif_text));
Notification n = builder.build();

nm.notify(YOUR_NOTIF_ID, n);

13
v4サポートパッケージにこれを行うテクニックがあると思います:NotificationCompat.Builder
stanlick

6
誰かがGoogleにNotification.Builderドキュメントページで重大なタイプミスがあることを伝える必要があると思います。私は彼らが言っていることをしていましたが、それは意味がありませんでした。私はここに来て、それが違うのを見ます。ドキュメントの間違いに気づいたので、あなたの回答に本当に感謝しています。
アンディ

5
ドキュメントbuilder.getNotification()は非推奨であると述べています。使うべきだと書いてありますbuilder.build()
mneri 2012

26
NotificationBuilder.build()には、APIレベル16以上が必要です。APIレベル11と15の間は、NotificationBuilder.getNotification()を使用する必要があります。
カミーユセヴィニー2012

4
@MrTristan:ドキュメントに記載されているようにsetSmallIcon()setContentTitle()setContentText()は最小要件です。
2014年

70

選択された回答に加えて、ここではSource TricksのNotificationCompat.Builderクラスのサンプルコードをいくつか示します。

// Add app running notification  

    private void addNotification() {



    NotificationCompat.Builder builder =  
            new NotificationCompat.Builder(this)  
            .setSmallIcon(R.drawable.ic_launcher)  
            .setContentTitle("Notifications Example")  
            .setContentText("This is a test notification");  

    Intent notificationIntent = new Intent(this, MainActivity.class);  
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent,   
            PendingIntent.FLAG_UPDATE_CURRENT);  
    builder.setContentIntent(contentIntent);  

    // Add as notification  
    NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);  
    manager.notify(FM_NOTIFICATION_ID, builder.build());  
}  

// Remove notification  
private void removeNotification() {  
    NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);  
    manager.cancel(FM_NOTIFICATION_ID);  
}  

5
実際に機能した新しいCompatビルダーを使用した最初のコード。よくやった!
James MV

1
私もうまくいきました。2つのメモ:1)「ic_launcher」の32x32アイコンを作成する必要があります。透明な背景の白い描画2)int FM_NOTIFICATION_ID = [yourFavoriteRandom];に乱数を定義する必要があります。
Anders8

1
どうもありがとうございました。私の問題は次のとおりです。通知を2回クリックすると、前のフラグメントが開いていて、この行 "PendingIntent.FLAG_UPDATE_CURRENT"で問題が解決され、1日が終わりました
Shruti

4

通知ビルダーは、Android APIレベル11以上(Android 3.0以上)に完全に対応しています。

したがって、Honeycombタブレットを対象としていない場合は、通知ビルダーを使用するのではなく、次の例のような古い通知作成方法に従ってください。


4
互換性ライブラリを使用できるため、API 4以降で使用できます。
Leandros 2012

3

android-Nの更新(2016年3月)

ご覧ください通知のアップデートの詳細は、リンクを。

  • 直接返信
  • バンドルされた通知
  • カスタムビュー

Android Nでは、同様の通知をバンドルして単一の通知として表示することもできます。これを可能にするために、Android Nは既存のNotificationCompat.Builder.setGroup()方法を使用します。ユーザーは各通知を展開し、通知シェードから個別に各通知の返信や却下などのアクションを実行できます。

これは、NotificationCompatを使用して通知を送信する単純なサービスを示す既存のサンプルです。ユーザーからの未読の会話はそれぞれ個別の通知として送信されます。

このサンプルは、Android Nで利用可能な新しい通知機能を利用するように更新されました。

サンプルコード


こんにちは、downloader_libraryを使用しているときに、このメソッドでAndroid 6.0を動作させる方法を教えてください。私はEclipse SDKを使用しています-25.1.7 || ADT 23.0.X悲しいことに|| Google APK Expansion LibraryとLicensing Libraryの両方が1.0
mfaisalhyder

2

通知の作成に問題がありました(Android 4.0以降でのみ開発)。 このリンクは私が間違っていたことを正確に示し、次のように述べています:

Required notification contents

A Notification object must contain the following:

A small icon, set by setSmallIcon()
A title, set by setContentTitle()
Detail text, set by setContentText()

基本的に私はこれらの1つが欠けていました。これを使用したトラブルシューティングの基礎と同様に、少なくともこれらすべてを用意してください。うまくいけば、これは他の誰かの頭痛を救うでしょう。


したがって、「後でアイコンを見つける」と思った場合、notify-loveは得られません。これをありがとう;)
Nanne 2015年

1

それが誰かに役立つ場合...私は新しい古いAPIに対してテストするとき、サポートパッケージを使用して通知を設定することで多くの問題を抱えていました。新しいデバイスで動作させることができましたが、古いデバイスでエラーテストが行​​われました。最後に機能したのは、通知機能に関連するすべてのインポートを削除することでした。特に、NotificationCompatとTaskStackBuilderです。最初にコードを設定しているときに、インポートがサポートパッケージからではなく、新しいビルドから追加されたようです。その後、これらのアイテムを後日eclipseに実装するときに、再度インポートするように求められませんでした。それが理にかなっていて、それが誰かを助けることを願っています:)


1

API 8でも機能し、次のコードを使用できます。

 Notification n = 
   new Notification(R.drawable.yourownpicturehere, getString(R.string.noticeMe), 
System.currentTimeMillis());

PendingIntent i=PendingIntent.getActivity(this, 0,
             new Intent(this, NotifyActivity.class),
                               0);
n.setLatestEventInfo(getApplicationContext(), getString(R.string.title), getString(R.string.message), i);
n.number=++count;
n.flags |= Notification.FLAG_AUTO_CANCEL;
n.flags |= Notification.DEFAULT_SOUND;
n.flags |= Notification.DEFAULT_VIBRATE;
n.ledARGB = 0xff0000ff;
n.flags |= Notification.FLAG_SHOW_LIGHTS;

// Now invoke the Notification Service
String notifService = Context.NOTIFICATION_SERVICE;
NotificationManager mgr = 
   (NotificationManager) getSystemService(notifService);
mgr.notify(NOTIFICATION_ID, n);

または、これについての優れたチュートリアルに従うことをお勧めします


1

利用した

Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
                PendingIntent.FLAG_ONE_SHOT);

        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("Firebase Push Notification")
                .setContentText(messageBody)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(0, notificationBuilder.build());

0
          // This is a working Notification
       private static final int NotificID=01;
   b= (Button) findViewById(R.id.btn);
    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Notification notification=new       Notification.Builder(MainActivity.this)
                    .setContentTitle("Notification Title")
                    .setContentText("Notification Description")
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .build();
            NotificationManager notificationManager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
            notification.flags |=Notification.FLAG_AUTO_CANCEL;
            notificationManager.notify(NotificID,notification);


        }
    });
}

0

自己完結型の例

以下の場合と同様の手法この回答けど。

  • 自己完結型:コピーして貼り付けると、コンパイルして実行されます
  • あなたが好きなだけ通知を生成し、インテントと通知IDで遊ぶためのボタン付き

ソース:

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class Main extends Activity {
    private int i;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final Button button = new Button(this);
        button.setText("click me");
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final Notification notification = new Notification.Builder(Main.this)
                        /* Make app open when you click on the notification. */
                        .setContentIntent(PendingIntent.getActivity(
                                Main.this,
                                Main.this.i,
                                new Intent(Main.this, Main.class),
                                PendingIntent.FLAG_CANCEL_CURRENT))
                        .setContentTitle("title")
                        .setAutoCancel(true)
                        .setContentText(String.format("id = %d", Main.this.i))
                        // Starting on Android 5, only the alpha channel of the image matters.
                        // https://stackoverflow.com/a/35278871/895245
                        // `android.R.drawable` resources all seem suitable.
                        .setSmallIcon(android.R.drawable.star_on)
                        // Color of the background on which the alpha image wil drawn white.
                        .setColor(Color.RED)
                        .build();
                final NotificationManager notificationManager =
                        (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
                notificationManager.notify(Main.this.i, notification);
                // If the same ID were used twice, the second notification would replace the first one. 
                //notificationManager.notify(0, notification);
                Main.this.i++;
            }
        });
        this.setContentView(button);
    }
}

Android 22でテスト済み。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.