前回Androidプラグインを作れるようになった。
今回は作りたかったローカル通知(ローカルプッシュ)の機能を作ります。
ローカル通知ってのはステータスバーに表示されるやつで、ネット経由で発信されるやつ(リモート通知)じゃなくインストールしたアプリから出される通知です。
プラグインの作成
Unityで直接使うクラスとレシーバを作成する。
- SET:通知の予約をする。
- CANCEL:通知予約を解除する
- DELETE:通知されたものを削除する
それぞれキー毎にセットして通知される前にキャンセルすれば通知されない。
通知された後にデリートすると通知を削除できる。全削除も可能。
意図する通りに動いてはいるが Intent の使い方が多分おかしい。
レシーバーで上書きせずに LocalPush.java で
1 2 |
Intent intent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()); intent.setClass(context, LocalPushReceiver.class); |
とすれば良い気がするけど、これだとタップ起動しない。
この辺の勉強したことないからなー。よくわからん。
また返り値は Android 実機でのデバッグ用なので特に必要ない。
Unity側
Assets / Plugins / Android 以下に arrファイルとAndroidManifest.xml を配置する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?xml version="1.0" encoding="utf-8"?> <manifest> <application> <activity>...</activity> <!-- レシーバー登録はここ --> <receiver android:name="jp.co.narumium.unitylocalpush.LocalPushReceiver" android:process=":remote" /> </application> <!-- versionはPluginとPlayerSettingにあわせる --> <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="25" /> <!-- 必要なパーミッション --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> </manifest> |
使い方はこんな感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
AndroidJavaObject ajo = null; void Start(){ #if UNITY_ANDROID ajo = new AndroidJavaObject( "jp.co.narumium.unitylocalpush.LocalPush"); #endif } public void SetLocalPush(int key) { if (ajo != null)ajo.Call<string>("setLocalPush",key, 5, "Title", "Message"+key, "sub", "info"); } public void CancelLocalPush(int key) { if (ajo != null)ajo.Call<string>("cancelLocalPush",key); } public void DeleteLocalPush(int key) { if (ajo != null){ if(key!=-1)ajo.Call<string>("deleteNotifiedMessage",key); else ajo.Call<string>("deleteNotifiedMessage");//全削除 } } |
テスト
適当なプロジェクトを作って確認してみる。
2つのメッセージを出してもアイコンは1つ表示された。
この状態から下の通知だけデリート、なんてことも出来た。
また、全削除しても別のアプリの通知は削除されない。
後は通知の予約とキャンセルを上手く制御すればOK。
http://qiita.com/imp954sti/items/e075fb8a99b68dda8180
この記事みたいに Intent を作り直すのが正攻法かもしれないけど冗長な気もする。
今の方法で問題が起きるケースも思いつかないからこのままでいいかな。