connvoiのブログ

前だけ向いていけばいい。

AndroidのNotificationの種類

AndroidのNotificationに画像を表示する

Android4.1からはNotification(通知バー)に3パターンの表示方法があって、 最近のアプリだと大体対応してる感じですね。

  • inBoxStyle
  • bigTextStyle
  • bigPictureStyle inBoxはほぼリスト、bigTextは長いテキスト、bigPictureは画像を表示します。

notifications

サンプルを書く

2013-05-26 02.01.39

3つボタンがあって、それぞれを押すと通知される。見たいな感じにします。

MainActivity

ボタン配置をします。まずは3つボタンを作って、ClickListenerで拾います。

  Button bt1,bt2,bt3;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        LinearLayout ll=new LinearLayout(this);
        ll.setOrientation(LinearLayout.VERTICAL);
        setContentView(ll);

        bt1 = new Button(this);
        bt1.setText("inboxstye通知");

        bt2 = new Button(this);
        bt2.setText("bigpicturestye通知");

        bt3 = new Button(this);
        bt3.setText("bigtextstye通知");

        ll.addView(bt1);
        ll.addView(bt2);
        ll.addView(bt3);

        bt1.setOnClickListener(new testClickListener());
        bt2.setOnClickListener(new testClickListener());
        bt3.setOnClickListener(new testClickListener());
    }

    class testClickListener implements OnClickListener
    {
        public void onClick(View v)
        {
            //Notitificationの下準備。
            NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            Intent notificationIntent = new Intent(getApplicationContext(), MainActivity.class);
            PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 0, notificationIntent, 0);
            NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getApplicationContext());
            if(v == bt1){

                mBuilder
                .setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle("Big notification")
                .setContentText("test of inboxstyle")
                .setAutoCancel(true)
                .setContentIntent(contentIntent);

                //inbox通知ボタンが叩かれたら。
                NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
                String[] events = new String[6];
                //通知された範囲が拡大されたときのタイトル
                inboxStyle.setBigContentTitle("this is inboxstyle");
                //6行文 testと表示します。
                for (int i=0; i < events.length; i++) {
                    inboxStyle.addLine(i+"test");
                }
                //オブジェクトをセット
                mBuilder.setStyle(inboxStyle);

            }else if(v==bt2){
                mBuilder
                .setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle("Big notification")
                .setContentText("test of bigpicturestyle")
                .setAutoCancel(true)
                .setContentIntent(contentIntent);

                //bigPictureStyleの場合は画像を取得する必要が有るので、
                //AsynkTaskを使ってweb上から画像を取ってくるようにします。
                Loadimage task= new Loadimage();
                task.execute("test");
                Bitmap b;
                NotificationCompat.BigPictureStyle bigpictureStyle = new NotificationCompat.BigPictureStyle();
                try {
                    b = task.get();
                    //bitmapをセット
                    bigpictureStyle.bigPicture(b);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                mBuilder.setStyle(bigpictureStyle);

            }else if(v==bt3){
                mBuilder
                .setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle("Big notification")
                .setContentText("test of bigtextstyle")
                .setAutoCancel(true)
                .setContentIntent(contentIntent);

                NotificationCompat.BigTextStyle bigtextStyle = new NotificationCompat.BigTextStyle();
                //bigtextStyleの設定。bigTextに長い文章を置けます。
                bigtextStyle.setBigContentTitle("this is bigtextstyle");
                bigtextStyle.bigText("3.14159 26535 89793 23846 26433 83279 50288").build();
                // Moves the big view style object into the notification object.
                mBuilder.setStyle(bigtextStyle);
            }
            //Notificationをします。
            notificationManager.notify(1,mBuilder.build());

        }

    }

Loadimage.java

特定のurlから画像を取ってくるtaskです。 Notificationに画像をセットする場合、Bitmapである必要があるので、 データをinputstreamで取得、decodestreamでBitmap化する手順を踏みます。

//ResultにBitmapをしていて、Bitmapを返却するAsyncTaskを作成します。
public class Loadimage extends AsyncTask<String, Void, Bitmap> {

    protected Bitmap doInBackground(String...strings){
        Uri.Builder builder = new Uri.Builder();
        builder.scheme("http");
        builder.encodedAuthority(IMAGE_URL);
        builder.path("/bara.png");

        DefaultHttpClient httpClient= new DefaultHttpClient();
        HttpGet request = new HttpGet(builder.build().toString());
        HttpResponse httpResponse=null;
        try {
            httpResponse = httpClient.execute(request);
            int status = httpResponse.getStatusLine().getStatusCode();

            switch(status){
            case HttpStatus.SC_OK:
                //inputstreamをhttpResponse経由で取得
                InputStream is = httpResponse.getEntity().getContent();
                //decodeStreamに食わせてBitmapオブジェクトを作成。*注意pngのみ!
                Bitmap bitmap = BitmapFactory.decodeStream(is);
                is.close();
                return bitmap;
            case HttpStatus.SC_NOT_FOUND:
                return null;
            }
         } catch (ClientProtocolException e) {
              //たくさん有るので省略
         }
        return null;
    }

    public void onPostExecute(Bitmap res){
        super.onPostExecute(res);
    }
}

結果

2013-05-26 02.02.392013-05-26 02.02.552013-05-26 02.03.07

通知バーの一番上に来ると自動的に展開されます。 そしてそして、展開されてない通知もピンチアウトすればなんと展開されます!すごい!

まとめ

  • Notificationは3つのスタイルがある
  • BitmapFactory.decodeStreamはインターネット経由でのjpegはデコードできない。
  • 互換性を考えるなら、NotificationCompat.BuilderをつかってNotificationオブジェクトを作る。

それにしてもさ、 Notificationがピンチアウトで展開、インで閉じるってすっごい微妙ですな。