Edited at

Unity5でローカル通知 (Android)

More than 3 years have passed since last update.

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編