У меня есть сайт с регистрацией и общим чатом(php,mysql), как мне сделать так , чтобы когда в чат кто то напишет, мне приходило уведомление на телефон с базы данных? Работаю с андроид студио ,но не знаю как это реализовать. Подскажите пожалуйста.
PUSH УВЕДОМЛЕНИЯ С ИСПОЛЬЗОВАНИЕМ FIREBASE CLOUD MESSAGES (FCM), MySQL AND PHP DATABASE SERVER
В манифесте андроид приложения пишешь это
<service
android:name=".MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<service
android:name=".MyFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
В BuildGradle прописываешь:
classpath 'com.google.gms:google-services:3.0.0'
В BuildGradle Module
apply plugin: 'com.google.gms.google-services'
compile 'com.google.firebase:firebase-messaging:9.0.2'
Нажимаем синхронизировать
Создаем Java class MyFirebaseInstanceIDService
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
private static final String TAG = "MyFirebaseInsIDService";
@Override
public void onTokenRefresh() {
//Get updated token
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "New Token: " + refreshedToken);
Log.d("firebaseid", "Refreshed token: " + refreshedToken);
}
}
Создаем новый джава класс MyFirebaseMessagingService
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = "MyFirebaseMsgService";
private static final String channelId = "default_notification_channel_id";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.d(TAG, "FROM:" + remoteMessage.getFrom());
//Check if the message contains data
if(remoteMessage.getData().size() > 0) {
Log.d(TAG, "Message data: " + remoteMessage.getData());
}
//Check if the message contains notification
if(remoteMessage.getNotification() != null) {
Log.d(TAG, "Mesage body:" + remoteMessage.getNotification().getBody());
sendNotification(remoteMessage.getNotification().getBody(),remoteMessage.getNotification().getTitle());
}
}
private void sendNotification(String body,String title) {
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0/*Request code*/, intent, PendingIntent.FLAG_ONE_SHOT);
//Set sound of notification
Uri notificationSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notifiBuilder = new NotificationCompat.Builder(this, channelId) //NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(title)
.setContentText(body)
// .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
// .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
// .setDefaults(Notification.DEFAULT_ALL)
.setAutoCancel(true)
.setSound(notificationSound)
.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /*ID of notification*/, notifiBuilder.build());
}
}
При авторизации приложения можно отправить в БД MySQL token привязав его к конкретному пользователю.
Получать token можно из приложения андроид с помощью FirebaseInstanceId.getInstance().getToken(); Запустите приложение и из лога Log.d(TAG, "New Token: " + refreshedToken) заберете token. Для упрощения занесем полученный token в MySQL в таблицу tokens.
Далее создаем sendnotification.php
<?php
require_once('dbConnect.php');
$message = $_POST['message'];
$title = $_POST['title'];
$path_to_FCM = 'https://fcm.googleapis.com/fcm/send';
$server_key = 'ваш ключ сервера';
$sql = "SELECT token FROM tokens ";
$r = mysqli_query($con,$sql);
$row = mysqli_fetch_row($r);
$key=$row[0];
$headers = array('Authorization:key='.$server_key,
'Content-Type:application/json'
);
$field = array('to'=>$key,
'notification'=>array('title'=>$title,'body'=>$message,'sound'=>'default'));
$payload = json_encode($field);
$curl_session = curl_init();
curl_setopt($curl_session, CURLOPT_URL, $path_to_FCM);
curl_setopt($curl_session, CURLOPT_POST, true);
curl_setopt($curl_session, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl_session, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_session, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl_session, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
curl_setopt($curl_session, CURLOPT_POSTFIELDS, $payload);
$result = curl_exec($curl_session);
curl_close($curl_session);
mysqli_close($con);
?>
ваш ключ сервера берем тут:
https://console.firebase.google.com/
Добавляем проект ( точно не помню но там где то вписывается имя из андроид проекта, и помните количество создаваемых проектов ограничено )
Заходим в настройки
Вот и ключ сервера..вписываем его в код выше..
Создаем файл для отправки сообщения сообщения. sendnotification.htm
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html" />
<meta name="author" content="admin" />
<meta charset="UTF-8" />
<title>Untitled 1</title>
</head>
<body>
<form action="sendnotification.php" method="post">
<input type="text" name="title"/>
<input type="text" name="message"/>
<input type="submit" value="submit"/>
</form>
</body>
</html>
Вот и готов у нас пример для отправки push уведомления со страницы html в приложение android. Т.е. ввел текст нажал отправить и на телефоне вылезло push уведомление.
p.s. под Genymotion токен не определялся..так что тестируйте на реальном андроид устройстве..если знаете как на виртуальном протестировать пишите в комментариях!
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть код, который объединяет массив значений для одного запроса к БД, но если в массиве некоторые значения повторяются, то этот id выводится...
ЗдравствуйтеЕсть интересный, крайне непонятный баг