android - 为什么当应用程序处于后台时声音不响(Android应用程序中的Firebase推送通知)?

标签 android firebase audio push-notification android-notifications

当推送通知到来时,声音和振动仅在打开应用程序时有效。但是,当我杀死我的应用程序或将其最小化时,如果我从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();
    }

}

我也已在 list 中给予了许可。
<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控制台发送通知,而您的应用程序处于后台,则不会在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

关于android - 为什么当应用程序处于后台时声音不响(Android应用程序中的Firebase推送通知)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56846956/

相关文章:

android - 无法使微调器的滚动条始终可见(Android)

android - android项目最好的静态代码分析工具是什么?

android - 反序列化包含数组的 Firestore 文档的推荐方法是什么?

php - 在我的项目中找不到 PHP 库

php - 使用 Web 应用程序实时跟踪 Android 手机

android - 无法在 android ListView 中实现 ClickListener

c# - `Failed resolution of: Lcom/google/android/datatransport/TransportFactory` 使用 Xamarin.Firebase 时

c# - 在 Windows 音频混音器(C# 或 C++)中显示 Audio Session

audio - 如何从iPhone 11或iPhone 11 Pro Max获得采样率为44100的音频

python - 没有下载模块可以在 Python 中使用 MP3 处理声音?