Wednesday, 20 July 2022

FCM notification arrives only user opens the device screen (Android 11) in PHP

I have a php page and I want to send push notification to Android devices.

Here is a php code sample what is working:

<?php
function sendPushNotification($to, $data = array()){
    $fields = array('to' => '/topics/' .$to , 'notification' => $data);//, 'android_channel_id' => 'automento_szallitas');
    echo $fields['to'];
    echo $fields['notification'];
    
    //$headers = array('Authorization: key='.apiKey, 'Content-Type: application/json');
    $headers = array('Authorization: key=MY_SECRET_FCM_KEY', 'Content-Type: application/json');
    
    $url = 'https://fcm.googleapis.com/fcm/send';
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
    $result = curl_exec($ch);
    curl_close($ch);
    return json_decode($result, true);
    echo "ok";
}
$data = array(
    'title' => 'title',
    'body' => 'body'
  );

sendPushNotification("myTopic", $data);
?>

I got the notification for the Android device, when the device screen is open. (Android 11 device) I enabled everything and turned of every energy save mode. I can get notification in few minutes from Firebase console whe a scree is locked till minutes. If I use the php code with a 10 minutes screen lock, de notification doesn't arrive. I got it inmediatelly when I open the screen. It seems the front end Android code is ok. I think there is a problem with the back end side php code but I haven't a clue

***************** Anndroid ********************* Manifest:

        <service
        android:name=".services.AutomentoFirebaseMessagingService"
        android:directBootAware="true"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

Firebase service:

    override fun onMessageReceived(remoteMessage: RemoteMessage) {
    Log.d(TAG, "Topic message: " + remoteMessage.from)
    super.onMessageReceived(remoteMessage)

    val powerIntent = Intent(Intent.ACTION_POWER_CONNECTED)
    context?.sendBroadcast(powerIntent)

    wakeUpScreen()

    val intent = Intent(this, MainActivity::class.java)
    val pendingIntent = PendingIntent.getActivity(
        this,
        REQUEST_CODE, intent, PendingIntent.FLAG_ONE_SHOT
    )
    val channelId = getString(R.string.default_notification_channel_id)
    val notificationBuilder: NotificationCompat.Builder = NotificationCompat.Builder(this, channelId)
        .setSmallIcon(R.drawable.ic_rendeleseim_white_48)
        .setContentTitle(remoteMessage.notification!!.title)
        .setContentText(remoteMessage.notification!!.body)
        .setAutoCancel(true)
        .setContentIntent(pendingIntent)
        .setOngoing(true)
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        .setLights(Color.RED, 500, 500)
    val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager

    val channel = NotificationChannel(
        channelId,
        "Pushnotification",
        NotificationManager.IMPORTANCE_HIGH,
    ).apply {
        lockscreenVisibility = Notification.VISIBILITY_PUBLIC
    }

    notificationManager.createNotificationChannel(channel)
    val notification = notificationBuilder.build()
    notification.flags = notification.flags or Notification.FLAG_INSISTENT
    notificationManager.notify(REQUEST_CODE, notification)
}

    private fun wakeUpScreen() {
    val powerManager = getSystemService(POWER_SERVICE) as PowerManager
    val isScreenOn: Boolean = powerManager.isInteractive
    if (!isScreenOn) {
        val wakeLock: PowerManager.WakeLock =
            (getSystemService(Context.POWER_SERVICE) as PowerManager).run {
                newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MentoMano::WakelockTag").apply {
                    acquire(1000)
                }
            }
    }

    val pm = baseContext.getSystemService(POWER_SERVICE) as PowerManager
    val isScreenOn2 = pm.isInteractive // check if screen is on

    if (!isScreenOn2) {
        val wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK or PowerManager.ACQUIRE_CAUSES_WAKEUP, "myApp:notificationLock")
        wl.acquire(3000) //set your time in milliseconds
    }
}

    fun subscribeToTopic() {
    val userId = sharedPreferences?.getInt(Constants.SHARED_USER_ID, -1)
    if (userId != -1) {
        val topic = "user$userId"
        FirebaseMessaging.getInstance().subscribeToTopic(topic)
            .addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    Log.d(TAG, "subscribeToTopic: sikeres feliratkozás $topic")
                    AutomentoController().updateToken(userId!!, topic)
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe({ response ->
                            Log.d(TAG, "onCreate: token update success: ${response.success} | response: ${response.message}")
                        },{
                        })
                } else {
                    Log.d(TAG, "subscribeToTopic: hiba a feliratkozás során")
                }
            }
    }
}

Help please



from FCM notification arrives only user opens the device screen (Android 11) in PHP

No comments:

Post a Comment