Unity5でローカル通知 (Android)

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

#はじめに
iOSでのローカル通知は[こちら](http://qiita.com/ToshikiImagawa/items/e4cb64295b009848a144)
細かいAndroid開発の手順については[こちら](http://qiita.com/relzx/items/a35f7ab6dbacb48f7e26)を参考にしてください。

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

* AlarmManager
* PendingIntent
* BroadcastReceiver
* NotificationCompat.Builder

#Android
```lang: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();
	}
}
```

```lang: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編](http://befool.co.jp/blog/raharu/localnotification-android/)