当推送通知到来时,声音和振动仅在打开应用程序时有效。但是,当我杀死我的应用程序或将其最小化时,如果我从Firebase控制台发送它,则只会发出通知声音和振动。但是,如果我从php服务器收到通知,则没有声音和振动。我已经厌倦了很多代码,但同样会发生问题。而且我还尝试了在其他Android操作系统版本的手机中。
这是我用来创建通知的代码。
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;
}
答案 0 :(得分:0)
如果您是从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