【问题标题】:Why Sound is not ringing when app is in background(Firebase Push Notification in Android app)?为什么应用程序在后台时声音没有响起(Android 应用程序中的 Firebase 推送通知)?
【发布时间】:2019-07-02 06:58:20
【问题描述】:

当推送通知到来时,只有在应用打开时才会发出声音和振动。但是,当我杀死我的应用程序或将其最小化时,如果我从 Firebase 控制台发送它,则只会发出通知声音和振动。但是,如果我从 php 服务器收到通知,则没有声音和振动。我已经厌倦了许多代码,但会出现同样的问题。并且我也尝试过不同安卓操作系统版本的手机。

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

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();
    }

}

而且我也在 Manifest 中给予了许可。

<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;
}

【问题讨论】:

    标签: android firebase audio push-notification android-notifications


    【解决方案1】:

    如果您从 Firebase 控制台发送通知并且您的应用在后台,则不会在 MessagingService 类中调用 onMessageReceived 方法。

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

    基本上,您需要将通知代码更改为类似这样的内容

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

    }

    您可以在此处阅读有关如何操作的更多信息:Firebase Cloud Messaging Push Notifications Android tutorial

    【讨论】:

    • 请再看看我的问题。我从 FIrebase 控制台收到声音,但如果我从 php 服务器收到通知,它只会在应用程序打开时才会发出声音,否则不会发出声音
    • 我认为您忘记在有效载荷中添加“声音”引用。检查this out
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 2017-05-24
    • 2019-03-20
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多