Нов съм в разработката на приложения за Android. В момента разработвам просто приложение, в което потребителят може да качва данните на MySQL сървъра чрез PHP скриптове. Успешно мога да направя това. Но искам всеки път, когато потребител качи някои данни на сървъра от своето приложение, всички други потребители на приложението да получат известието (т.е. потребителят на xyz е добавил нова публикация.).
Намерих начина, по който мога да постигна това с помощта на Google Cloud Messaging. Но не мога да го внедря в приложението си.
Успешно внедрих GCM известието от уеб съобщението чрез PHP скрипт на уеб сървър, използвайки PHP скрипта по-долу.
<?php
//Generic php function to send GCM push notification
function sendMessageThroughGCM($registatoin_ids, $message) {
//Google cloud messaging GCM-API url
$url = 'https://android.googleapis.com/gcm/send';
$fields = array(
'registration_ids' => $registatoin_ids,
'data' => $message,
);
// Update your Google Cloud Messaging API Key
define("GOOGLE_API_KEY", "AIzaSyCVQRSnEoulXoG21uKua1DTrOUvMkxbK-U");
$headers = array(
'Authorization: key=' . GOOGLE_API_KEY,
'Content-Type: application/json'
);
$ch = curl_init();
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_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
$result = curl_exec($ch);
if ($result === FALSE) {
die('Curl failed: ' . curl_error($ch));
}
curl_close($ch);
return $result;
}
?>
<?php
//Post message to GCM when submitted
$pushStatus = "GCM Status Message will appear here";
if(!empty($_GET["push"])) {
$gcmRegID = file_get_contents("GCMRegId.txt");
$pushMessage = $_POST["message"];
if (isset($gcmRegID) && isset($pushMessage)) {
$gcmRegIds = array($gcmRegID);
$message = array("m" => $pushMessage);
$pushStatus = sendMessageThroughGCM($gcmRegIds, $message);
}
}
//Get Reg ID sent from Android App and store it in text file
if(!empty($_GET["shareRegId"])) {
$gcmRegID = $_POST["regId"];
file_put_contents("GCMRegId.txt",$gcmRegID);
echo "Done!";
exit;
}
?>
<html>
<head>
<title>Google Cloud Messaging (GCM) in PHP</title>
<style>
div#formdiv, p#status{
text-align: center;
background-color: #FFFFCC;
border: 2px solid #FFCC00;
padding: 10px;
}
textarea{
border: 2px solid #FFCC00;
margin-bottom: 10px;
text-align: center;
padding: 10px;
font-size: 25px;
font-weight: bold;
}
input{
background-color: #FFCC00;
border: 5px solid #fff;
padding: 10px;
cursor: pointer;
color: #fff;
font-weight: bold;
}
</style>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
$(function(){
$("textarea").val("");
});
function checkTextAreaLen(){
var msgLength = $.trim($("textarea").val()).length;
if(msgLength == 0){
alert("Please enter message before hitting submit button");
return false;
}else{
return true;
}
}
</script>
</head>
<body>
<div id="formdiv">
<h1>Google Cloud Messaging (GCM) in PHP</h1>
<form method="post" action="/swach/gcm/gcm.php/?push=true" onsubmit="return checkTextAreaLen()">
<textarea rows="5" name="message" cols="45" placeholder="Message to send via GCM"></textarea> <br/>
<input type="submit" value="Send Push Notification through GCM" />
</form>
</div>
<p id="status">
<?php echo $pushStatus; ?>
</p>
</body>
</html>
и успешно получих известието на моето устройство.
Но искам да настроя това приложение да уведомява автоматично GCM да изпрати съобщението, вместо да използва WEB скриптове. И известието трябва да бъде получено от всички други потребители на приложението.
Също така минах през GCM DownStream и UpStream съобщения, но не разбрах много, не успях да внедря успешно.
Опитах се да настроя Downstream с помощта на кода по-долу, но не получих известието за моето приложение
public class AddNewMessage extends Activity{
private Integer msgId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_new_message);
msgId = 1;
}
// OnClick Action to the button inside the Activity Layout
public void sendNewMessage(View view) {
final GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
if (view == findViewById(R.id.send_message)) {
new AsyncTask<Void,Void,String>() {
@Override
protected String doInBackground(Void... params) {
String msg = "";
try {
Bundle data = new Bundle();
data.putString("my_message", "Hello World");
data.putString("my_action","SAY_HELLO");
String id = Integer.toString(msgId);
gcm.send(ApplicationConstants.GOOGLE_PROJ_ID + "@gcm.googleapis.com", id, data);
msg = "Sent message";
} catch (IOException ex) {
msg = "Error :" + ex.getMessage();
}
return msg;
}
@Override
protected void onPostExecute(String msg) {
Toast.makeText(AddNewMessage.this, "send message failed: " + msg, Toast.LENGTH_LONG).show();
}
}.execute(null, null, null);
}
}
}
Благодаря за отделеното време.