为什么当应用在后台时不会响起声音(Android应用中的firebase推送通知)



当推动通知即将到来时,则仅在打开应用时才振动。但是,当我杀死我的应用程序或最小化时,只有从Firebase控制台发送的通知声音并振动就会振动。但是,如果我从PHP服务器收到通知,则不会发出声音和振动。我对许多代码感到疲倦,但是出现了同样的问题。我还尝试了使用不同的Android OS版本的电话。

这是我用来创建通知的代码。

public void createNotification( String title, String message,Intent intent, Uri alarmSound) 
{
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    Uri defaultUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel androidChannel = new NotificationChannel(CHANNEL_ID,
                title, NotificationManager.IMPORTANCE_HIGH);
        // Sets whether notifications posted to this channel should display notification lights
        androidChannel.enableLights(true);
        // Sets whether notification posted to this channel should vibrate.
        androidChannel.enableVibration(true);
        // Sets the notification light color for notifications posted to this channel
        androidChannel.setLightColor(R.color.app_theme_color);
        //androidChannel.setSound(null, null);
        // Sets whether notifications posted to this channel appear on the lockscreen or not
        androidChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
        getManager().createNotificationChannel(androidChannel);
        NotificationCompat.Builder notification = new NotificationCompat.Builder(getApplicationContext(), CHANNEL_ID)
                .setSmallIcon(R.mipmap.logo)
                .setContentTitle(title)
                .setContentText(message)
                .setTicker(title)
                .setStyle(new NotificationCompat.BigTextStyle().bigText(message))
                .setSound(defaultUri)
                .setSound(alarmSound, STREAM_NOTIFICATION)
                .setAutoCancel(true)
                .setContentIntent(contentIntent);
        getManager().notify(NOTIFICATION_ID, notification.build());
    } else {
        try {
            playNotificationSound();
            @SuppressLint({"NewApi", "LocalSuppress"}) NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this).setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.logo))
                    .setSmallIcon(R.mipmap.logo)
                    .setContentTitle(title)
                    .setTicker(title)
                    .setContentText(message)
                    .setStyle(new NotificationCompat.BigTextStyle().bigText(message))
                    .setContentIntent(contentIntent)
                    .setDefaults(Notification.DEFAULT_ALL)
                    .setSound(alarmSound, STREAM_NOTIFICATION)
                    .setLights(0xFF760193, 300, 1000)
                    .setAutoCancel(true)
                    .setVibrate(new long[]{200, 400});

            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.notify(NOTIFICATION_ID/* ID of notification */, notificationBuilder.build());
        } catch (SecurityException se) {
            se.printStackTrace();
        }
    }
}

private NotificationManager getManager() {
    if (mManager == null) {
        mManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    }
    return mManager;
}

// Playing notification sound
public void playNotificationSound() {
    try {
        Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        Ringtone r = RingtoneManager.getRingtone(this, notification);
        r.play();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

,我也在清单中也授予了许可。

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

这是我的php代码。

public function pushSurveyorNotification($send_data){
    $requestJson = json_decode($send_data, true);
    if (empty($requestJson)) {
        generateServerResponse('0', '100');
    }
     $check_request_keys = array(
                '0' => 'message',
                '1' => 'regId',
                '2' => 'apikey',
                '3' => 'booking_details',
                '4' => 'notification_type'
            );
       // $notification_type  = '01';           
        $regId = trim($requestJson['Codruk']['regId']);
        $notification_type = trim($requestJson['Codruk']['notification_type']);
        $registrationId = ''; // set variable as array
        // get all ids in while loop and insert it into $regIDS array
        $deviceIds = explode(",", $regId);
        foreach ($deviceIds as  $devid) { 
            $registrationId .= $devid.",";
        }
        $message  = trim($requestJson['Codruk']['message']);            
        $apikey   = trim($requestJson['Codruk']['apikey']);
        $booking_details  = trim($requestJson['Codruk']['booking_details']);
        $url = 'https://android.googleapis.com/gcm/send'; 
        $fields = array(
                        'to'  => rtrim($registrationId,","),
                        'notification' => array(
                                "title" => "Codruk",
                                "body"  => $message
                        ),
                        'data' => array(
                            "notification_type" => $notification_type,
                            "booking_details" =>json_decode($booking_details, true)
                        ),
                        'priority' => "high"
                    ); 
        $headers = array( 
                            'Authorization: key=' . $apikey,
                            'Content-Type: application/json'
                        );
       $data = json_encode( $fields );
        // Open connection
        $ch = curl_init();
        // Set the url, number of POST vars, POST data
        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_POSTFIELDS, json_encode( $fields ) );
        // Execute post
        $result = curl_exec($ch);
        // Close connection
        curl_close($ch);
        return $result;
}

如果您是从firebase Console发送通知,并且您的应用在背景中,则不会在MessagingService类中调用。

Firebase将在后端处理它。它将将此通知发送到系统以显示通知托盘中的通知。即使您已启用/允许通知声音。

,也不会发出通知。

基本上,您需要将通知代码更改为此类

{
 “to” : “bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1…”,
 “notification” : {
    “body” : “great match!”,
    “title” : “Portugal vs. Denmark”,
    “icon” : “myicon”,
    “sound” : “mySound”
    }

}

您可以在此处阅读有关如何执行此操作的更多信息:Firebase Cloud Messing推送通知Android教程

最新更新