アプリに簡単な通知機能を作りたいのですが。私は this YouTubeビデオとこれらの両方のFirebaseドキュメントURL 1 および 2 に加えて、Android StudioのFirebaseツールアシスタント(これはFirebaseに接続していると言います)。何らかの理由で、私の古いアプリ(これらのコードは以下に掲載されています)でこれらの手順とドキュメントを実行すると、通知を受信できなくなります。ただし、新しいアプリで同じ手順を実行すると、完全に機能します。同じ物理デバイスと環境で両方のアプリをバックグラウンド、アクティブ状態、終了状態でテストしました。作成した新しいデモアプリは問題なく機能しますが、通知を必要とする古いアプリは機能しません。どちらもデバイスIDを取得せずにテストされました。エラーログやTAGログも表示されません。コンパイルされたプロジェクトの1つが干渉していると思います。正確にはわかりませんが、そこを見る必要があるかもしれません。
これらのSO投稿もすべてチェックアウトしました: 12 など
PS。以下のパッケージ名を削除しました。FireBaseで複数回チェックしましたが、一致するため、問題はありません。ただし、新しいデモアプリのFireBaseには、アプリが接続されていることが示されていますが、以前のアプリのFireBaseは接続されていません。また、私は以前に報奨金を設定しましたが、それでも同じ問題が発生しています。
これが私の問題のあるコードです:
Notification.Java(ドキュメントが要求するようなサービス)
public class Notification extends FirebaseMessagingService {
public Notification() {
}
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
showNotification(remoteMessage.getData().get("message"));
Log.d("FMC", "Message Notification Body: " + remoteMessage.getNotification().getBody());
}
private void showNotification(String message) {
Intent i=new Intent(this, SplashScreen.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent=PendingIntent.getActivity(this,0,i,PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder=new NotificationCompat.Builder(this)
.setAutoCancel(true)
.setContentTitle("FCM TITLE").setContentText(message)
.setSmallIcon(R.drawable.pt_icon)
.setDefaults(Android.app.Notification.DEFAULT_ALL)
.setContentIntent(pendingIntent);
NotificationManager notificationManager= (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(0,builder.build());
}
}
上記のnotification.Javaでログを取得していません。
Project.gradle
buildscript {
repositories {
jcenter()
maven {
url 'https://maven.google.com/'
name 'Google'
}
}
dependencies {
classpath 'com.Android.tools.build:gradle:3.0.1'
classpath 'com.google.gms:google-services:3.2.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
maven { url "https://jitpack.io" }
maven { url 'https://maven.google.com' }
google()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
app.gradle
apply plugin: 'com.Android.application'
Android {
compileSdkVersion 26
defaultConfig {
minSdkVersion 16
targetSdkVersion 26
versionCode 16
versionName "2.6"
}
dexOptions {
jumboMode = true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
}
}
//Code below is added to fix random error ("Fix the issues identified by lint")
lintOptions {
abortOnError false
}
productFlavors {
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
//compile project(path: ':backend', configuration: 'Android-endpoints')
//Removed the 0.2.+
compile 'com.daprlabs.aaron:cardstack:0.3.1-beta0'
//noinspection GradleCompatible
compile 'com.Android.support:appcompat-v7:25.4.0'
compile "com.Android.support:appcompat-v7:19.0.+"
compile 'com.Android.support:design:23.4.0'
compile 'com.Android.support:recyclerview-v7:23.4.0'
compile 'com.Android.support:cardview-v7:23.4.0'
compile 'com.github.danylovolokh:video-player-manager:0.2.0'
compile 'com.github.danylovolokh:list-visibility-utils:0.2.0'
implementation 'com.Android.support:appcompat-v7:26.1.0'
implementation 'com.google.firebase:firebase-messaging:11.8.0'
compile 'com.google.firebase:firebase-core:11.8.0'
compile 'com.orhanobut:dialogplus:1.11@aar'
compile 'com.nineoldandroids:library:2.4.0'
compile files('libs/sinch-Android-rtc-3.9.14.jar')
compile 'com.amazonaws:aws-Android-sdk-s3:2.4.4'
compile 'com.github.chrisbanes:PhotoView:1.2.6'
compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.5.0'
compile 'com.github.amlcurran.showcaseview:library:5.4.3'
compile 'com.github.d-max:spots-dialog:0.7@aar'
compile 'com.victor:lib:1.0.4'
compile 'com.github.bumptech.glide:glide:3.5.2'
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.Android.support:recyclerview-v7:23.0.0'
compile 'me.grantland:autofittextview:0.2.0'
compile 'com.wang.avi:library:1.0.5'
compile 'com.nineoldandroids:library:2.4.0'
compile 'com.braintreepayments.api:drop-in:2.3.8'
compile 'com.braintreepayments.api:braintree:2.3.9'
compile 'com.loopj.Android:android-async-http:1.4.9'
compile 'com.getbase:floatingactionbutton:1.10.1'
compile 'com.mxn.soul:flowingdrawer-core:1.2.2'
compile 'com.github.rengwuxian:MaterialEditText:2.1.4'
compile 'com.github.PhilJay:MPAndroidChart:v3.0.1'
compile 'net.gotev:uploadservice:3.2.5'
compile 'in.srain.cube:ultra-ptr:1.0.11'
compile 'com.Android.support.constraint:constraint-layout:1.0.0-alpha9'
testCompile 'junit:junit:4.12'
//implementation 'com.Android.support:appcompat-v4:23.+'
}
apply plugin: 'com.google.gms.google-services'
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools">
<uses-feature
Android:name="Android.hardware.microphone"
Android:required="false" />
<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission Android:name="Android.permission.INTERNET" />
<!--
so the app can be found on tablets Google Play
<uses-permission Android:name="Android.permission.CALL_PHONE" />
-->
<uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE" />
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
<uses-permission Android:name="Android.permission.CHANGE_WIFI_STATE" />
<uses-permission Android:name="Android.permission.RECORD_AUDIO" />
<uses-permission Android:name="Android.permission.MODIFY_AUDIO_SETTINGS" />
<!-- <uses-permission Android:name="com.google.Android.c2dm.permission.RECEIVE"/> -->
<!-- <uses-permission Android:name="Android.permission.WAKE_LOCK" /> -->
<!-- <uses-permission Android:name="Android.permission.READ_PHONE_STATE" /> -->
<grant-uri-permission
Android:path="string"
Android:pathPattern="string"
Android:pathPrefix="string" />
<application
Android:allowBackup="true"
Android:icon="@mipmap/_icon"
Android:label=""
Android:supportsRtl="true"
Android:theme="@style/Theme.AppCompat.Light.NoActionBar"
tools:node="replace">
<activity Android:name=".SplashScreen">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service Android:name=".Notification">
<intent-filter>
<action Android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<!-- <!– -->
<!-- Set custom default icon. This is used when no icon is set for incoming notification messages. -->
<!-- See README() for more. -->
<!-- –> -->
<!-- <meta-data -->
<!-- Android:name="com.google.firebase.messaging.default_notification_icon" -->
<!-- Android:resource="@drawable/pt_icon" /> -->
<!-- <!– -->
<!-- Set color used with incoming notification messages. This is used when no color is set for the incoming -->
<!-- notification message. See README() for more. -->
<!-- –> -->
<!-- <meta-data -->
<!-- Android:name="com.google.firebase.messaging.default_notification_color" -->
<!-- Android:resource="@color/colorAccent" /> -->
<activity Android:name=".SignInForm" />
<activity Android:name=".SignUpPage" />
<activity Android:name=".SellerFillOutForm" />
<activity Android:name=".BuyerFillOutForm" />
<activity
Android:name=".BuyerHomePage"
Android:label="@string/title_activity_buyer_home_page" />
<action Android:name="Android.intent.action.VIEW" />
<category Android:name="Android.intent.category.BROWSABLE" />
<data Android:scheme="http" />
<activity Android:name=".VideoPlayerActivity" />
<activity Android:name=".BackgroundTask" />
<service
Android:name="com.amazonaws.mobileconnectors.s3.transferutility.TransferService"
Android:enabled="true" />
<activity Android:name=".EnterCreditCard" />
<activity Android:name=".PickMeeting" />
<activity Android:name=".HowBillingWorks" />
<activity Android:name=".ReBillingPlan" />
<activity Android:name=".PayBill" />
<activity
Android:name=".Buyer_Home_Page"
Android:configChanges="locale|orientation" />
<activity Android:name=".Seller_Home_Page" />
<activity Android:name=".ProductList" />
<activity Android:name=".EditProduct" />
<activity Android:name=".EditSellerAccount" />
<activity Android:name=".EditBuyerAccount" />
<activity Android:name=".Video_Calling.incomingVideoCall" />
<activity Android:name=".Video_Calling.CallScreenActivity" />
<activity Android:name=".SellerAnalytics" />
<activity Android:name=".Swipe_Layout.SwipeLayout" />
<activity Android:name=".Swipe_Layout.PopUpActivity" />
</application>
</manifest>
以下の作業コード(手順をテストするために作成したアプリで、100%機能します):
Notifaction.Java
import Android.app.Notification;
import Android.app.NotificationManager;
import Android.app.PendingIntent;
import Android.app.Service;
import Android.content.Intent;
import Android.os.IBinder;
import Android.support.v4.app.NotificationCompat;
import Android.util.Log;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
import static Android.content.ContentValues.TAG;
public class Notifaction extends FirebaseMessagingService {
public Notifaction() {
}
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
showNotification(remoteMessage.getData().get("message"));
}
private void showNotification(String message) {
Intent i=new Intent(this,MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent=PendingIntent.getActivity(this,0,i,PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder=new NotificationCompat.Builder(this)
.setAutoCancel(true)
.setContentTitle("FCM TITLE").setContentText(message)
.setSmallIcon(R.drawable.ic_launcher_background)
.setDefaults(Notification.DEFAULT_ALL)
.setContentIntent(pendingIntent);
NotificationManager notificationManager= (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(0,builder.build());
}
}
AndroidManiest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="">
<application
Android:allowBackup="true"
Android:icon="@mipmap/ic_launcher"
Android:label="@string/app_name"
Android:roundIcon="@mipmap/ic_launcher_round"
Android:supportsRtl="true"
Android:theme="@style/AppTheme">
<activity Android:name=".MainActivity">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
Android:name=".Notifaction">
<intent-filter>
<action
Android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
</application>
</manifest>
app.gradle
apply plugin: 'com.Android.application'
Android {
compileSdkVersion 26
defaultConfig {
applicationId ""
minSdkVersion 14
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.Android.support:appcompat-v7:26.1.0'
implementation 'com.google.firebase:firebase-messaging:11.8.0'
compile 'com.google.firebase:firebase-core:11.8.0'
implementation 'com.Android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.Android.support.test:runner:1.0.1'
androidTestImplementation 'com.Android.support.test.espresso:espresso-core:3.0.1'
}
apply plugin: 'com.google.gms.google-services'
Project.grdle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.Android.tools.build:gradle:3.0.1'
classpath 'com.google.gms:google-services:3.2.0'
// NOTE: Do not place your application dependencies here; they
belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
Android Oreonew notifications model が原因で通知が表示されない可能性が高いです。通知を表示。また、app.gradleでは、Androidversion 26、つまりAndroid Oreoなので、以下のコードをいずれかの方法で実装する必要があります。
採用しやすいです。あなたがする必要があるのは:
1。 YourApplicationClass.onCreate()で通知チャネルを定義します
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel chan1 = new NotificationChannel(
YOUR_DESIRED_CHANNEL_ID_STRING,
YOUR_DESIRED_CHANNEL_LABEL_STRING,
NotificationManager.IMPORTANCE_DEFAULT);
chan1.setDescription(YOUR_DESIRED_CHANNEL_DESC_STRING);//OPTIONAL
chan1.setLightColor(Color.BLUE);//OPTIONAL
chan1.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);//OPTIONAL
chan1.setShowBadge(true);//OPTIONAL
getManager().createNotificationChannel(chan1);
}
2。通知ビルダーをこのコンストラクターに置き換えます
NotificationCompat.Builder builder=
new NotificationCompat.Builder(this, YOUR_DESIRED_CHANNEL_ID_STRING);
Android Oreo以上をターゲットとするさまざまなプロパティで複数のチャネルを定義できることを知っておくと役立ちます
デバイストークンを受信していて、サーバーAPIキーがある場合は、 pushtry を使用していないか、コードが適切に機能しているかどうかを確認してください。 無効な登録、404エラーなどのエラーが発生しますあなたのコードに間違いをしました。 FCMの実装については、このチュートリアルに従うことができます FCMチュートリアル
もう1つ、build.gradle
fileありませんapplicationId "Package Name"
in defaultConfig
。わかりませんが、これはパッケージ名であり、Firebaseコンソールでプロジェクトを作成するときに使用されます(パッケージを含むプロジェクト名)
これを見ると doc トークンの作成/ローテーションを管理するためにFirebaseInstanceIdService
を拡張するサービスがないようです。 ここ はコード例です。特定のデバイスにプッシュ通知を送信するために必要なトークンは、このクラスによって受信されます。
<service
Android:name=".MyFirebaseInstanceIDService">
<intent-filter>
<action Android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
[〜#〜]編集[〜#〜]:
さて、このエラーは私を悩ませています。私はあなたの依存関係ツリーを見ました、そしてあなたはそれらのいくつかを繰り返しているようです。たとえば、次の3つのバージョンがあります。
compile 'com.Android.support:appcompat-v7:25.4.0'
たぶんあなたはそれを最新バージョンにクリアするか、それを作業バージョンと一致させるべきです。また、新しいgradleプラグインを使用していますが、ほとんどの場合、implementation
の代わりにcompile
を使用するように依存関係を更新していません。これが why です。
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
//compile project(path: ':backend', configuration: 'Android-endpoints')
//Removed the 0.2.+
compile 'com.daprlabs.aaron:cardstack:0.3.1-beta0'
//noinspection GradleCompatible
compile 'com.Android.support:appcompat-v7:25.4.0'
compile "com.Android.support:appcompat-v7:19.0.+"
compile 'com.Android.support:design:23.4.0'
compile 'com.Android.support:recyclerview-v7:23.4.0'
compile 'com.Android.support:cardview-v7:23.4.0'
compile 'com.github.danylovolokh:video-player-manager:0.2.0'
compile 'com.github.danylovolokh:list-visibility-utils:0.2.0'
implementation 'com.Android.support:appcompat-v7:26.1.0'
implementation 'com.google.firebase:firebase-messaging:11.8.0'
compile 'com.google.firebase:firebase-core:11.8.0'
compile 'com.orhanobut:dialogplus:1.11@aar'
compile 'com.nineoldandroids:library:2.4.0'
compile files('libs/sinch-Android-rtc-3.9.14.jar')
compile 'com.amazonaws:aws-Android-sdk-s3:2.4.4'
compile 'com.github.chrisbanes:PhotoView:1.2.6'
compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.5.0'
compile 'com.github.amlcurran.showcaseview:library:5.4.3'
compile 'com.github.d-max:spots-dialog:0.7@aar'
compile 'com.victor:lib:1.0.4'
compile 'com.github.bumptech.glide:glide:3.5.2'
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.Android.support:recyclerview-v7:23.0.0'
compile 'me.grantland:autofittextview:0.2.0'
compile 'com.wang.avi:library:1.0.5'
compile 'com.nineoldandroids:library:2.4.0'
compile 'com.braintreepayments.api:drop-in:2.3.8'
compile 'com.braintreepayments.api:braintree:2.3.9'
compile 'com.loopj.Android:android-async-http:1.4.9'
compile 'com.getbase:floatingactionbutton:1.10.1'
compile 'com.mxn.soul:flowingdrawer-core:1.2.2'
compile 'com.github.rengwuxian:MaterialEditText:2.1.4'
compile 'com.github.PhilJay:MPAndroidChart:v3.0.1'
compile 'net.gotev:uploadservice:3.2.5'
compile 'in.srain.cube:ultra-ptr:1.0.11'
compile 'com.Android.support.constraint:constraint-layout:1.0.0-alpha9'
testCompile 'junit:junit:4.12'
//implementation 'com.Android.support:appcompat-v4:23.+'
}
また、依存関係を更新し、コンパイルではなく実装を使用します。
implementation 'com.google.firebase:firebase-messaging:15.0.2'
implementation 'com.google.firebase:firebase-core:15.0.2'
データペイロードをonMessageReceivedメソッドに配信するには、FCMメッセージから通知ペイロードを削除します。
以下のリンクをよく読んでください。
アプリがバックグラウンドにある場合、データペイロードは、通知ペイロードがない場合にのみonMessageReceivedメソッドに配信されます。 (言葉をマーク)
両方のペイロードが存在する場合、システムは通知部分(システムトレイ)を自動的に処理し、アプリは(ユーザーが通知をタップした後)ランチャーアクティビティのインテントのエクストラでデータペイロードを取得します。
両方のプラットフォーム、AndroidおよびiOSに正常に対応できるようにするために、クライアントのOSに応じて異なるFCMメッセージを送信する必要がある場合があります。
//これは、電話の再起動時にFCMサービスをバックグラウンドで開始するのに役立ちます.
Add receiver in Manifest.xml
<uses-permission Android:name="Android.permission.WAKE_LOCK" />
<receiver Android:name=".OnBootBroadcastReceiver">
<intent-filter>
<action Android:name="Android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
OnBootBroadcastReceiver.class
import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;
public class OnBootBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent("com.examle.FirebaseMessagingReceiveService");
i.setClass(context, FirebaseMessagingReceiveService.class);
context.startService(i);
}
}
通知の種類を知っていることを願っています。通知を送信するには、カスタムサーバーまたはpostmanなどを使用する必要があります。詳細については、これらの質問の回答を参照してください。
アプリがFirebaseでバックグラウンドにある場合の通知の処理方法
とにかく、onMessageReceived()メソッドを呼び出すには、FirebaseMessagingServiceでhandleIntent(Intent intent)メソッドを呼び出す必要があります。
これが私の完全な動作コードであるnotification-when-app-in-background-in-firebaseです。
build.gradle:
apply plugin: 'com.Android.application'
Android {
compileSdkVersion 26
buildToolsVersion '26.0.3'
defaultConfig {
applicationId "com.abc.xyz"
minSdkVersion 17
targetSdkVersion 26
multiDexEnabled true
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
}
}
dexOptions {
javaMaxHeapSize "4g"
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.Android.support.constraint:constraint-layout:1.0.2'
implementation 'com.Android.support:support-v4:26.1.0'
implementation 'com.Android.support:appcompat-v7:26.1.0'
implementation 'com.Android.support:design:26.1.0'
implementation 'com.Android.support:recyclerview-v7:26.1.0'
implementation 'com.Android.support:cardview-v7:26.1.0'
//firebase analytics and ads
implementation 'com.google.firebase:firebase-ads:11.4.2'
implementation 'com.google.firebase:firebase-core:11.4.2'
implementation 'com.google.firebase:firebase-messaging:11.4.2'
implementation 'com.firebase:firebase-jobdispatcher:0.8.5'
}
apply plugin: 'com.google.gms.google-services'
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.abc.xyz">
<uses-permission Android:name="Android.permission.WAKE_LOCK" />
<uses-permission Android:name="Android.permission.VIBRATE" />
<uses-permission Android:name="Android.permission.INTERNET" />
<application
Android:name=".MyApplication"
Android:allowBackup="true"
Android:icon="@mipmap/ic_launcher"
Android:label="@string/app_name"
Android:roundIcon="@mipmap/ic_launcher_round"
Android:supportsRtl="true"
Android:theme="@style/AppTheme">
<activity Android:name=".MainActivity">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- [START fcm_default_icon] -->
<meta-data
Android:name="com.google.firebase.messaging.default_notification_icon"
Android:resource="@drawable/ic_stat_ic_notification" />
<meta-data
Android:name="com.google.firebase.messaging.default_notification_color"
Android:resource="@color/colorAccent" />
<!-- [END fcm_default_icon] -->
<!-- [START fcm_default_channel] -->
<meta-data
Android:name="com.google.firebase.messaging.default_notification_channel_id"
Android:value="@string/default_notification_channel_id" />
<!-- [END fcm_default_channel] -->
<service
Android:name=".services.MyFirebaseMessagingService"
Android:enabled="true"
Android:exported="true">
<intent-filter>
<action Android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<service Android:name=".services.MyFirebaseInstanceIDService">
<intent-filter>
<action Android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
<service
Android:name=".services.MyJobService"
Android:exported="false">
<intent-filter>
<action Android:name="com.firebase.jobdispatcher.ACTION_EXECUTE" />
</intent-filter>
</service>
</application>
</manifest>
MyFirebaseMessagingService.Java:
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = "MyFirebaseMsgService";
@Override
public void handleIntent(Intent intent) {
Log.e(TAG, "handleIntent");
try
{
if (intent.getExtras() != null)
{
RemoteMessage.Builder builder = new RemoteMessage.Builder("MyFirebaseMessagingService");
for (String key : intent.getExtras().keySet())
{
builder.addData(key, intent.getExtras().get(key).toString());
}
onMessageReceived(builder.build());
}
else
{
super.handleIntent(intent);
}
}
catch (Exception e)
{
super.handleIntent(intent);
}
}
/**
* Called when message is received.
*
* @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
*/
// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
// [START_EXCLUDE]
// There are two types of messages data messages and notification messages. Data messages are handled
// here in onMessageReceived whether the app is in the foreground or background. Data messages are the type
// traditionally used with GCM. Notification messages are only received here in onMessageReceived when the app
// is in the foreground. When the app is in the background an automatically generated notification is displayed.
// When the user taps on the notification they are returned to the app. Messages containing both notification
// and data payloads are treated as notification messages. The Firebase console always sends notification
// messages. For more see: https://firebase.google.com/docs/cloud-messaging/concept-options
// [END_EXCLUDE]
// TODO(developer): Handle FCM messages here.
// Not getting messages here? See why this may be:
Log.e(TAG, "Notification received Successfully");
Log.e(TAG, "From: " + remoteMessage.getFrom());
// Check if message contains a data payload.
if (remoteMessage.getData().size() > 0) {
Log.e(TAG, "Message data payload: " + remoteMessage.getData());
if (/* Check if data needs to be processed by long running job */ true) {
// For long-running tasks (10 seconds or more) use Firebase Job Dispatcher.
scheduleJob();
} else {
// Handle message within 10 seconds
handleNow();
}
}
// Check if message contains a notification payload.
if (remoteMessage.getNotification() != null) {
Log.e(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
}
// Also if you intend on generating your own notifications as a result of a received FCM
// message, here is where that should be initiated. See sendNotification method below.
}
// [END receive_message]
/**
* Schedule a job using FirebaseJobDispatcher.
*/
private void scheduleJob() {
// [START dispatch_job]
FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this));
Job myJob = dispatcher.newJobBuilder()
.setService(MyJobService.class)
.setTag("my-job-tag")
.build();
dispatcher.schedule(myJob);
// [END dispatch_job]
}
/**
* Handle time allotted to BroadcastReceivers.
*/
private void handleNow() {
Log.e(TAG, "Short lived task is done.");
}
/**
* Create and show a simple notification containing the received FCM message.
*
* @param messageBody FCM message body received.
*/
private void sendNotification(String messageBody) {
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
String channelId = getString(R.string.default_notification_channel_id);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.drawable.ic_stat_ic_notification)
.setContentTitle("FCM Message")
.setContentText(messageBody)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
}
MyFirebaseInstanceIDService.Java:
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
private static final String TAG = "MyFirebaseIIDService";
/**
* Called if InstanceID token is updated. This may occur if the security of
* the previous token had been compromised. Note that this is called when the InstanceID token
* is initially generated so this is where you would retrieve the token.
*/
// [START refresh_token]
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
Log.e(TAG, "onTokenRefresh");
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.e(TAG, "Refreshed token: " + refreshedToken);
// If you want to send messages to this application instance or
// manage this apps subscriptions on the server side, send the
// Instance ID token to your app server.
sendRegistrationToServer(refreshedToken);
}
// [END refresh_token]
/**
* Persist token to third-party servers.
*
* Modify this method to associate the user's FCM InstanceID token with any server-side account
* maintained by your application.
*
* @param token The new token.
*/
private void sendRegistrationToServer(String token) {
// TODO: Implement this method to send token to your app server.
}
}
MyJobService.Java
@RequiresApi(api = Build.VERSION_CODES.Lollipop)
public class MyJobService extends JobService {
private static final String TAG = "MyJobService";
@Override
public boolean onStartJob(JobParameters job) {
// Do some work here
Log.e(TAG, "Inside MyJobService");
return false; // Answers the question: "Is there still work going on?"
}
@Override
public boolean onStopJob(JobParameters job) {
Log.e(TAG, "Inside MyJobService");
return false; // Answers the question: "Should this job be retried?"
}
}
MyApplication.Java:
public class MyApplication extends MultiDexApplication {
@Override
public void onCreate() {
super.onCreate();
// active JobSchedulerReceiver
Intent intent = new Intent();
intent.setAction(getPackageName() + ".receiver.JobSchedulerReceiver");
sendBroadcast(intent);
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
MainActivity.Java:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, "Inside MainActivity");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// Create channel to show notifications.
String channelId = getString(R.string.default_notification_channel_id);
String channelName = getString(R.string.default_notification_channel_name);
NotificationManager notificationManager =
getSystemService(NotificationManager.class);
assert notificationManager != null;
notificationManager.createNotificationChannel(new NotificationChannel(channelId,
channelName, NotificationManager.IMPORTANCE_LOW));
}
// If a notification message is tapped, any data accompanying the notification
// message is available in the intent extras. In this sample the launcher
// intent is fired when the notification is tapped, so any accompanying data would
// be handled here. If you want a different intent fired, set the click_action
// field of the notification message to the desired intent. The launcher intent
// is used when no click_action is specified.
//
// Handle possible data accompanying notification message.
// [START handle_data_extras]
if (getIntent().getExtras() != null) {
for (String key : getIntent().getExtras().keySet()) {
Object value = getIntent().getExtras().get(key);
Log.e(TAG, "Key: " + key + " Value: " + value);
}
}
// [END handle_data_extras]
Button subscribeButton = findViewById(R.id.subscribeButton);
subscribeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// [START subscribe_topics]
FirebaseMessaging.getInstance().subscribeToTopic("news");
// [END subscribe_topics]
// Log and toast
String msg = getString(R.string.msg_subscribed);
Log.e(TAG, msg);
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
});
Button logTokenButton = findViewById(R.id.logTokenButton);
logTokenButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Get token
String token = FirebaseInstanceId.getInstance().getToken();
// Log and toast
String msg = getString(R.string.msg_token_fmt, token);
Log.e(TAG, msg);
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
});
}
}
同じ問題に直面しても、フルパスを追加することで解決しましたAndroid:name AndroidManifest.xmlにサービス
<service Android:name="com.testapp.Notifaction">
<intent-filter>
<action Android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
一度試してみて、何か問題があれば私に知らせてください。
Firebase Messagingサービスの最新バージョンで運用中の実際のプロジェクトと比較して、すべてのコードを段階的に確認します。
Gradleへの依存関係は問題ありませんが、implementation "com.google.firebase:firebase-messaging:15.0.2"
が必要です
クラスの名前を別の名前に変更してみてください。 Notification
name多分独自のAndroid通知クラスとの相互作用です。また、Emptyコンストラクターが必要です(ただし、コードにそれがあることがわかります)。
たとえば、それをMessagingControllerと呼び、<application>
内のマニフェストに次のように配置します。
<!--Service to control messaging requests-->
<service
Android:name=".messaging.controller.MessagingController"
Android:exported="false">
<intent-filter>
<action Android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
</application>
また、FirebaseInstanceService
のインスタンスが必要であることを忘れないでください。これは 公式ドキュメントによると のように必要です。
FirebaseInstanceIdServiceを拡張して、登録トークンの作成、ローテーション、更新を処理するサービス。これは、特定のデバイスへの送信またはデバイスグループの作成に必要です。
<!--Firebase instance service to renew messaging tokens-->
<service
Android:name=".messaging.service.FirebaseInstanceService"
Android:exported="false">
<intent-filter>
<action Android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
さて、この時点で、あなたのコードで、これは少なくともログで通知を受信しているはずです、
必要に応じて、通知システムを構築するためのアプリケーションSkeletonである次のプロジェクトを確認できます。多分それもあなたを助けるでしょう: https://github.com/FrangSierra/PushNotificationSkeleton
最後に、サーバーから通知を送信する方法についていくつかのクラウド関数コードを確認したい場合は、 このリポジトリ を確認することをお勧めします
Firebaseからログイベントを受け取っていないため、次の手順を確認してください。
app/
モジュールにコピーします(Androidからプロジェクトの視点を変更))MAKE SUREファイル名はgoogle-services.json
Firebase
のlogcat検索に移動します。成功した場合は、次のメッセージが表示されます。I/FirebaseInitProvider:FirebaseAppの初期化に成功しました
これは単なる提案ですが、数週間前に同様のエラーを引き起こしたのは、間違った形式の通知を送信したことです。大声で送信すべきだったのに、サイレント通知を送信しました。サーバーがメッセージを送信する方法を確認します。また、FCM APIがキーを期待する順序をめちゃくちゃにしました。
これは、Django Python server:
def _build_loud_message(not_id, data):
"""Construct loud notifiation message.
Loud means that this message will show up in the notifications hub
of the app.
"""
return {
'message': {
'notification': {
'title': 'New activity',
'body': 'Hey you have some new activity!'
},
'data': {"data": data},
'apns': {
'payload': {
"notId": not_id, # notId HAS TO BE FIRST!!!
'aps': {
'badge': 1,
'sound': 'default',
'content-available': 1
}
},
'headers': {
'apns-priority': '10',
'apns-collapse-id': 'myid-1'
}
},
'Android': {
'priority': "high",
'data': {
"androidData": data
},
'notification': {
'sound': 'default',
'tag': 'mytag-1'
}
}
}
}
また、ディックキーが記載されている順序にも注意してください。それらを変更すると、FCM APIが正常に送信したと言っていても、メッセージがFCMからデバイスに正常に送信されない可能性があります。
通知データには2つのタイプがあります。1)通知ペイロード2)サーバーからデータを通知ペイロードで送信する場合のデータペイロード。 FirbaseMessagingServiceからonMessageRecieved()が呼び出されない可能性があります このリンク
アプリにfirebaseデータベースの値をリッスンさせ、必要に応じてメッセージを変更します。私はこれを自分のアプリケーションとその魅力のように動作させるために行います。
FCMコンソールでアプリケーションを登録しましたか?アプリケーションに.jsonファイルを追加しましたか?