LoginSignup
32
34

More than 5 years have passed since last update.

Unity5でローカル通知 (Android)

Last updated at Posted at 2015-08-16

iOSでローカル通知を実装したので、今度はAndroidで実装しようと思うので自分用メモ

はじめに

iOSでのローカル通知はこちら
細かいAndroid開発の手順についてはこちらを参考にしてください。

キーワード

ローカル通知を実現する上で大切なキーワード

  • AlarmManager
  • PendingIntent
  • BroadcastReceiver
  • NotificationCompat.Builder

Android

localNotification
package com.example.hogehoge;

import java.util.Calendar;

import com.unity3d.player.UnityPlayer;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class localNotification {

    /**
     * 時間指定でローカル通知を投げる
     * @param unixtime
     * @param primary_key
     * @param ticker
     * @param content_title
     * @param content_text
     * @param sound_path
     **/
    public void sendNotification(long unixtime, int primary_key, String ticker, String content_title, String content_text, String sound_path)
    {
        Log.i("Unity", "SendNotificationStart");

        // インテント作成
        Activity activity = UnityPlayer.currentActivity;
        Context context = activity.getApplicationContext();
        Intent intent = new Intent(context, NotificationReceiver.class);
        //渡す値
        intent.putExtra("PRIMARY_KEY", primary_key);
        intent.putExtra("TICKER", ticker);
        intent.putExtra("CONTENT_TITLE", content_title);
        intent.putExtra("CONTENT_TEXT", content_text);
        intent.putExtra("SOUND_PATH", sound_path);

        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(unixtime);

        PendingIntent sender = PendingIntent.getBroadcast(context,  primary_key, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager alarm = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        alarm.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis() , sender);
    }
    /**
     * 時間指定でローカル通知を投げる
     * @param unixtime
     * @param primary_key
     * @param ticker
     * @param content_title
     * @param content_text
     **/
    public void sendNotification(long unixtime, int primary_key, String ticker, String content_title, String content_text)
    {
        sendNotification(unixtime, primary_key, ticker, content_title, content_text,"Default");
    }
    /**
     * 時間指定でローカル通知を投げる
     * @param unixtime
     * @param primary_key
     * @param content_title
     * @param content_text
     **/
    public void sendNotification(long unixtime, int primary_key,  String content_title, String content_text)
    {
        sendNotification(unixtime, primary_key, content_title, content_title, content_text);
    }
    /**
     * 時間指定でローカル通知を投げる
     * @param unixtime
     * @param primary_key
     * @param content_title
     **/
    public void sendNotification(long unixtime, int primary_key,  String content_title)
    {
        sendNotification(unixtime, primary_key, content_title, content_title, "");
    }
    public void clearNotification(int primary_key){
        Log.i("Unity", "ClearNotificationStart");

        // インテント作成
        Activity activity = UnityPlayer.currentActivity;
        Context context = activity.getApplicationContext();
        Intent intent = new Intent(context,NotificationReceiver.class);

        PendingIntent sender = PendingIntent.getBroadcast(context,  primary_key, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        AlarmManager alarm = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        alarm.cancel(sender);
        sender.cancel();
    }
}
NotificationReceiver
package com.example.notification;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.support.v4.app.NotificationCompat;

/**
 * レシーバー
 *
 * @author raharu
 */
public class NotificationReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {

        //値の取得
        Integer primary_key = intent.getIntExtra("PRIMARY_KEY", 0);
        String ticker = intent.getStringExtra("TICKER");
        String content_title = intent.getStringExtra("CONTENT_TITLE");
        String content_text = intent.getStringExtra ("CONTENT_TEXT");
        String sound_path = intent.getStringExtra("SOUND_PATH");

        // intentからPendingIntentを作成
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

        // LargeIcon の Bitmap を生成
        final PackageManager pm = context.getPackageManager();
        ApplicationInfo applicationInfo = null;
        try {
          applicationInfo = pm.getApplicationInfo(context.getPackageName(),PackageManager.GET_META_DATA);
        } catch (NameNotFoundException e) {
          e.printStackTrace();
          return;
        }
        final int appIconResId = applicationInfo.icon;
        Bitmap largeIcon = BitmapFactory.decodeResource(context.getResources(), appIconResId);

        // NotificationBuilderを作成
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
        builder.setContentIntent(pendingIntent);
        builder.setTicker(ticker);                    //通知到着時に通知バーに表示(4.4まで)
        builder.setSmallIcon(appIconResId);           //アイコン
        builder.setContentTitle(content_title);       // タイトル
        builder.setContentText(content_text);         // 本文(サブタイトル)
        builder.setLargeIcon(largeIcon);              //開いた時のアイコン
        builder.setWhen(System.currentTimeMillis());  //通知に表示される時間(※通知時間ではない!)

        // 通知時の音・バイブ・ライト
        if( sound_path.equals("Default") ){
            builder.setDefaults(Notification.DEFAULT_SOUND);
        }else{
            builder.setSound( Uri.parse(sound_path));
        }
        builder.setDefaults(Notification.DEFAULT_VIBRATE);
        builder.setDefaults(Notification.DEFAULT_LIGHTS);
        builder.setAutoCancel(true);

        // NotificationManagerを取得
        NotificationManager manager = (NotificationManager) context.getSystemService(Service.NOTIFICATION_SERVICE);
        // Notificationを作成して通知
        manager.notify(primary_key, builder.build());
    }

}

以上がローカル通知プラグインのコードです。

参考:Unity 時間指定ローカルプッシュ通知処理を書いてみた Android編

32
34
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
34