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());
}
}
以上がローカル通知プラグインのコードです。