Отсутствие уведомлений Firebase cloud pu sh в приложении Android - PullRequest
1 голос
/ 07 мая 2020

Я не получаю уведомление pu sh для своего приложения. Я включил файлы манифеста, файл MainActivity, файл MyFireBaseMessagingService, файл build.gradle и googl-services. json. Я действительно не понимаю, в чем может быть проблема. Я go в Firebase composer, чтобы написать сообщение, но ничего не получено. Я могу жестко закодировать значения в строковом файле, и я получаю уведомление, но мне нужно что-то более динамичное c. Вот почему я пытаюсь понять, как отправлять уведомления pu sh из FCM, но мне кажется, что мне что-то не хватает или что-то вводится неправильно.

Файл MainAcitivity

package com.example.testaaedapp;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.TaskStackBuilder;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.InstanceIdResult;

import java.net.URI;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private ImageButton logoButton;
    private ImageView blueButton, greenButton, orangeButton, yellowButton, redButton, darkBlueButton;
    public Button callButton;
    private final String CHANNEL_ID = "Alerts";
    private final int notificationId = 001;
    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        logoButton = findViewById(R.id.imageButton);
        logoButton.setOnClickListener(this);

        blueButton = findViewById(R.id.bluepuzzlepiece);
        blueButton.setOnClickListener(this);

        redButton = findViewById(R.id.redpuzzlepiece);
        redButton.setOnClickListener(this);

        greenButton = findViewById(R.id.greenpuzzlepiece);
        greenButton.setOnClickListener(this);

        orangeButton = findViewById(R.id.orangepuzzlepiece);
        orangeButton.setOnClickListener(this);

        yellowButton = findViewById(R.id.yellowpuzzlepiece);
        yellowButton.setOnClickListener(this);

        darkBlueButton = findViewById(R.id.darkbluepuzzlepiece);
        darkBlueButton.setOnClickListener(this);

        callButton = findViewById(R.id.button);
        callButton.setOnClickListener(this);

        displayNotification();
        // Get token
        // [START retrieve_current_token]
        FirebaseInstanceId.getInstance().getInstanceId()
                .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
                    @Override
                    public void onComplete(@NonNull Task<InstanceIdResult> task) {
                        if (!task.isSuccessful()) {
                            Log.w(TAG, "getInstanceId failed", task.getException());
                            return;
                        }

                        // Get new Instance ID token
                        String token = task.getResult().getToken();

                        // Log and toast
                        String msg = getString(R.string.msg_token_fmt, token);
                        Log.d(TAG, msg);
                        Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
                    }
                });
        // [END retrieve_current_token]

    }
        int requestCode = 0;
    public void onClick(View view) {

        if (view.getId() == R.id.button && ActivityCompat.checkSelfPermission(MainActivity.this,
                Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
            Log.d("STATE", "Call Button DOES NOT WORK");
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, requestCode);
            return;
        } else if (view.getId() == R.id.button && ActivityCompat.checkSelfPermission(MainActivity.this,
                Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
//            else if (view.getId() == R.id.button && ActivityCompat.checkSelfPermission(MainActivity.this,
//                    Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
            Log.d("STATE", "Call Button DOES WORK");
            Intent callIntent = new Intent(Intent.ACTION_CALL);
            callIntent.setData(Uri.parse("tel:480-240-9255"));
            startActivity(callIntent);


        } else {
            switch (view.getId()) {
                case R.id.imageButton:
                    setContentView(R.layout.activity_main);
                    break;

                case R.id.bluepuzzlepiece:

                    break;

                case R.id.redpuzzlepiece:
                    Intent blogIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.aaed.org/blog"));
                    startActivity(blogIntent);
                    break;

                case R.id.greenpuzzlepiece:
                    Intent videoIntent = new Intent(Intent.ACTION_VIEW);
                    videoIntent.setData(Uri.parse("https://www.youtube.com/channel/UCUwPShLvnCOTeQILvAtneOw"));
                    startActivity(videoIntent);
                    break;

                case R.id.yellowpuzzlepiece:
                    Intent secondActivity = new Intent(this, SecondActivity.class);
                    startActivity(secondActivity);
                    break;

                case R.id.orangepuzzlepiece:
                    Intent webIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.aaed.org"));
                    startActivity(webIntent);
                    break;

                case R.id.darkbluepuzzlepiece:
                    Intent schoolIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.aaed.org/online-course-content"));
                    startActivity(schoolIntent);


            }

        }

    }

    public void displayNotification () {
        createNotificationChannel();
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setSmallIcon(R.drawable.ic_puzzlepieces)
                .setContentTitle("Test Message")
                .setContentText("This is text")
                .setPriority(NotificationCompat.PRIORITY_HIGH)
                .setStyle(new NotificationCompat.BigTextStyle()
                        .bigText(getString((R.string.another_string))));

        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);

        // notificationId is a unique int for each notification that you must define
        notificationManager.notify(notificationId, builder.build());
    }

    public void createNotificationChannel() {
        // Create the NotificationChannel, but only on API 26+ because
        // the NotificationChannel class is new and not in the support library
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            CharSequence name = getString(R.string.channel_name);
            String description = getString(R.string.channel_description);
            int importance = NotificationManager.IMPORTANCE_DEFAULT;
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
            channel.setDescription(description);
            /

/ Register the channel with the system; you can't change the importance
            // or other notification behaviors after this
            NotificationManager notificationManager = getSystemService(NotificationManager.class);
            notificationManager.createNotificationChannel(channel);
        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == requestCode)
        {
            if(grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                Intent callIntent = new Intent(Intent.ACTION_CALL);
                callIntent.setData(Uri.parse("tel:480-240-9255"));
                startActivity(callIntent);
            }
        }

Файл MyFirebaseMessagingService

package com.example.testaaedapp;

import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Build;
import android.util.Log;
import androidx.core.app.NotificationCompat;

import com.example.testaaedapp.MainActivity;
import com.example.testaaedapp.R;
import com.google.firebase.messaging.FirebaseMessagingService;

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    private static final String TAG = "MyFirebaseMsgService";

    // [START on_new_token]

    /**
     * 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.
     */
    @Override
    public void onNewToken(String token) {
        Log.d(TAG, "Refreshed token: " + token);

        // 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(token);
    }
    // [END on_new_token]

Файл манифеста

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.testaaedapp">

    <!--
         The ACCESS_COARSE/FINE_LOCATION permissions are not required to use
         Google Maps Android API v2, but you must specify either coarse or fine
         location permissions for the 'MyLocation' functionality.
    -->
    <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=".MapsActivity"
            android:label="@string/title_activity_maps"></activity>
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_channel_id"
            android:value="AAED" />
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_icon"
            android:resource="@drawable/ic_puzzlepieces" />
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_color"
            android:resource="@color/colorAccent" />

        <activity
            android:name=".MainActivity"
            android:label="Autism Academy"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".SecondActivity"
            android:label="Locations"></activity>

        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_maps_key" />
        <!-- [START firebase_service] -->
        <service
            android:name=".MyFirebaseMessagingService"
            android:exported="false"
            android:enabled="true">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>


        <!-- [END firebase_service] -->
    </application>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>

</manifest>

1 Ответ

0 голосов
/ 08 мая 2020

У меня была аналогичная проблема. Я все перепробовал - на мой взгляд, основная причина в том, что все службы рано или поздно убиваются системой. Единственный способ - убедиться, что уведомление доставляется в системный трей, а не в приложение. Для этого вам необходимо использовать Сообщение с данными уведомления.

Есть 2 типа уведомлений FCM: Уведомление и Сообщение с данными.

Сообщения с данными доставляются в панель задач и всегда отображаются - даже если служба не запущена.

Уведомляющее сообщение выглядит так:

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification":{
      "title":"Portugal vs. Denmark",
      "body":"great match!"
    }
  }
}

и запускает метод OnMessageReceaved () FirebaseMessagingService. Многие устройства (особенно Huawei и Xiaomi) пытаются сделать все, чтобы отключить фоновые службы и предотвратить разряд батареи. Таким образом, FirebaseMessagingService - не лучший способ обработки уведомлений.

Второй тип - это сообщение с данными:

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "data":{
      "Nick" : "Mario",
      "body" : "great match!",
      "Room" : "PortugalVSDenmark"
    }
  }
}

Этот тип обрабатывается в системном трее, поэтому вам не нужны службы, работающей, чтобы получить уведомление. Это гораздо более удобный метод, но, насколько я знаю, с помощью консоли этого нельзя достичь.

Возможно, вам понадобится серверный API для отправки сообщения с данными.

Прочтите этот для получения более подробной информации.

...