Насочено известие в приложението за Android чрез GCM

Нов съм в разработката на приложения за 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);
    }
}
}

Благодаря за отделеното време.


person Yogesh Yadav    schedule 02.01.2016    source източник
comment
какво получаваш в отговор?   -  person er.irfankhan11    schedule 02.01.2016
comment
Разгледайте tounder.com. Те се справят с повечето настройки на сървъра. Те имат прост Android SDK и поддържат страхотни действия за потребителско изживяване като глобално отхвърляне и проследяване, ако вашето известие се отваря или отхвърля. Ето един пример: youtube.com/watch?v=77hfYzZml9s   -  person Keith    schedule 06.01.2016


Отговори (2)


Следвайте стъпките: 1. Вземете регистрационен идентификатор на устройството на потребителя на приложението и го запазете във вашата база данни.

private String getRegistrationId(Context context) 
{
   final SharedPreferences prefs = getGCMPreferences(context);
   String registrationId = prefs.getString(PROPERTY_REG_ID, "");
   if (registrationId.isEmpty()) {
       Log.d(TAG, "Registration ID not found.");
       return "";
   }
   int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
   int currentVersion = getAppVersion(context);
   if (registeredVersion != currentVersion) {
        Log.d(TAG, "App version changed.");
        return "";
    }
    return registrationId;
}

2. Използвайте своя php код. (премахнете HTML частта)

Забележка - използвайте масив от регистрационни идентификатори

3.В отговор отворете този php скрипт с регистрационни идентификатори.

person Rahul_Bhusal    schedule 02.01.2016

Можете да имате по-дълъг метод, при който изпращате информацията към php скрипт. Този php скрипт ще избере всички регистрационни идентификатори на потребителите и ще използва foreach цикъл, за да изпрати известията. Това означава, че трябва да съхранявате регистрационните идентификатори във вашата база данни mysql

person Jackson Dyora    schedule 02.01.2016