読者です 読者をやめる 読者になる 読者になる

うさがにっき

読書感想文とプログラムのこと書いてきます

Notificationで大きなアイコンとか大きな画像を表示する方法

Android

概要

Android4.1ぐらいからNotificationで大きな画像だったり、widgetが配置できたりするようになった

http://developer.android.com/reference/android/app/Notification.BigPictureStyle.html
http://developer.android.com/reference/android/app/Notification.BigTextStyle.html
http://developer.android.com/reference/android/app/Notification.InboxStyle.html

サポートライブラリを使えば上記のスタイルも使えるのだが、使っているアプリを見かけることが少ない
以前の実装方法(Notification#setLatestEventInfo())がだいぶ前に非推奨になっているので、上記のスタイルの使い方とともにナウいNotificationの実装方法についてまとめた

詳細

ナウいNotificationの実装方法

ナウいと言ってもAPI 11くらいからなので4年くらい前の話

Notification.Builder(context) or NotificationCompat.Builder(context)を使って実装する
builderに対して必要な設定を行い、最終的にbuildすることによりNotificationを作成する

    /**
     * Notificationを送信
     */
    private void sendNotification() {
        PendingIntent contentIntent = getPedndingIntent();

        Notification notification = getNotification(contentIntent);

        // NotificationManagerを取得
        NotificationManager manager = (NotificationManager) getActivity().getSystemService(Service.NOTIFICATION_SERVICE);
        // Notificationを作成して通知
        manager.notify(NOTIFICATION_CLICK, notification);
    }

    /**
     * Notificationを作成
     *
     * @param pendingIntent
     * @return
     */
    private Notification getNotification(PendingIntent pendingIntent) {
        NotificationCompat.Builder builder = new NotificationCompat.Builder(getActivity().getApplicationContext());

        builder.setContentIntent(pendingIntent);
        // ステータスバーに表示されるテキスト
        builder.setTicker("Ticker");
        // アイコン
        builder.setSmallIcon(R.drawable.ic_small);
        // Notificationを開いたときに表示されるタイトル
        builder.setContentTitle("ContentTitle");
        // Notificationを開いたときに表示されるサブタイトル
        builder.setContentText("ContentText");

        // ICS以降のみLargeIconを設定
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            // LargeIcon の Bitmap を生成
            Bitmap largeIcon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_big);
            // Notificationを開いたときに表示されるアイコン
            builder.setLargeIcon(largeIcon);
        }

        // 通知するタイミング
        builder.setWhen(System.currentTimeMillis());
        // 通知時の音・バイブ・ライト
        builder.setDefaults(Notification.DEFAULT_SOUND
                | Notification.DEFAULT_VIBRATE
                | Notification.DEFAULT_LIGHTS);
        // タップするとキャンセル(消える)
        builder.setAutoCancel(true);

        return builder.build();
    }

    /**
     * PendingIntenの設定
     */
    private PendingIntent getPedndingIntent() {
        Intent intent = new Intent(getActivity(), NotificationActivity.class);
        PendingIntent contentIntent = PendingIntent.getActivity(
                getActivity(), REQUEST_CODE_MAIN_ACTIVITY, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        return contentIntent;
    }

こんな感じでNotificationが上がる
f:id:tiro105:20150623194544p:plain

詳細なソースはGithub参照
https://github.com/tiro105/NewNotificationUsing

4.1くらいから使えるようになったNotificationのスタイルを使ってみる

  • BigPictureStyle
  • BigTextStyle
  • InboxStyle
  • Notificationへのボタンの配置

を実装してみる

BigPictureStyle
    private void sendBigPictureStyleNotification() {
        PendingIntent pendingIntent = getPendingIntent();
        NotificationCompat.Builder builder = getNotificationBuilder(pendingIntent);

        Notification notification = setNotificationBigPictureStyle(builder);

        // NotificationManagerを取得
        NotificationManager manager = (NotificationManager) getActivity().getSystemService(Service.NOTIFICATION_SERVICE);
        // Notificationを作成して通知
        manager.notify(NOTIFICATION_CLICK, notification);

    }

    private Notification setNotificationBigPictureStyle(NotificationCompat.Builder builder) {
        NotificationCompat.BigPictureStyle bigPictureStyle = new NotificationCompat.BigPictureStyle(builder);

        bigPictureStyle.bigPicture(BitmapFactory.decodeResource(getActivity().getResources(), R.drawable.ic_large));
        bigPictureStyle.setBigContentTitle("BigContentTitle");
        bigPictureStyle.setSummaryText("SummaryText");

        return builder.build();
    }

実装結果
f:id:tiro105:20150623194615p:plain

BigTextStyle
    private void sendBigTextStyleNotification() {
        PendingIntent pendingIntent = getPendingIntent();
        NotificationCompat.Builder builder = getNotificationBuilder(pendingIntent);

        Notification notification = setNotificationBigTextStyle(builder);

        // NotificationManagerを取得
        NotificationManager manager = (NotificationManager) getActivity().getSystemService(Service.NOTIFICATION_SERVICE);
        // Notificationを作成して通知
        manager.notify(NOTIFICATION_CLICK, notification);
    }

    private Notification setNotificationBigTextStyle(NotificationCompat.Builder builder) {
        // BigTextStyle を適用
        NotificationCompat.BigTextStyle bigTextStyle = new NotificationCompat.BigTextStyle(builder);
        bigTextStyle.bigText("BigText");
        bigTextStyle.setBigContentTitle("BigContentTitle");
        bigTextStyle.setSummaryText("SummaryText");

        return builder.build();
    }

実装結果
f:id:tiro105:20150623194634p:plain

InboxStyle
    private void sendInBoxStyleNotification() {
        PendingIntent pendingIntent = getPendingIntent();
        NotificationCompat.Builder builder = getNotificationBuilder(pendingIntent);

        Notification notification = setNotificationInBoxStyle(builder);

        // NotificationManagerを取得
        NotificationManager manager = (NotificationManager) getActivity().getSystemService(Service.NOTIFICATION_SERVICE);
        // Notificationを作成して通知
        manager.notify(NOTIFICATION_CLICK, notification);

    }

    private Notification setNotificationInBoxStyle(NotificationCompat.Builder builder) {
        NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(builder);

        inboxStyle.setBigContentTitle("BigContentTitle");
        inboxStyle.setSummaryText("SummaryText");
        for (int i = 0; i < 10; i++) {
            inboxStyle.addLine("Line" + (i + 1));
        }

        return builder.build();
    }

実装結果
f:id:tiro105:20150623194653p:plain

Notificationへのボタンの配置
    private void buttonStyleButtonNotification() {
        PendingIntent pendingIntent = getPendingIntent();
        NotificationCompat.Builder builder = getNotificationBuilder(pendingIntent);

        Notification notification = setbuttonStyleButtonStyle(builder);

        // NotificationManagerを取得
        NotificationManager manager = (NotificationManager) getActivity().getSystemService(Service.NOTIFICATION_SERVICE);
        // Notificationを作成して通知
        manager.notify(NOTIFICATION_CLICK, notification);
    }

    private Notification setbuttonStyleButtonStyle(NotificationCompat.Builder builder) {
        PendingIntent contentIntent = getPendingIntent();

        builder.addAction(R.drawable.ic_small, "アクション1", contentIntent);
        builder.addAction(R.drawable.ic_small, "アクション2", contentIntent);
        builder.addAction(R.drawable.ic_small, "アクション3", contentIntent);

        return builder.build();
    }

実装結果
f:id:tiro105:20150623194709p:plain

ものによってはsetContentTitleで設定したものが表示されなくなったりする
なにが表示されて、なにが表されないのかは端末依存な部分があるので怖いところ

詳細なソースはGithub参照
https://github.com/tiro105/NewStyleNotification