2012-07-16 7 views
9

Dies ist mein Server-Side-Code oder Android-Seitencode. Dieser Code funktioniert nur für englische Nachrichten. Wenn ich Unicode-Chartas wie arabische Sprache verwende, dann zeigt es nichts anstelle von Arabisch. Aufgrund des Englisch-Arabisch-Mix überspringt es die einzigen arabischen Charters.Android GCM Unicode-Zeichen werden nicht empfangen

Bitte geben Sie mir eine Lösung. Danke!

Dies ist mein C# -Code

private string SendNotification(string authstring, string id, string msg) 
    { 
     try 
     { 
      ServicePointManager.ServerCertificateValidationCallback = (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) => true; 
      WebRequest request = WebRequest.Create("https://android.googleapis.com/gcm/send"); 
      request.Method = "POST"; 
      request.ContentType = "application/x-www-form-urlencoded;charset=UTF-8"; 

      request.Headers.Add(string.Format("Authorization: key={0}", authstring)); 
      string collaspeKey = Guid.NewGuid().ToString("n"); 
      string postData = string.Format("registration_id={0}&data.payload={1}&collapse_key={2}", id, msg, collaspeKey); 
      byte[] byteArray = Encoding.UTF8.GetBytes(postData); 
      request.ContentLength = byteArray.Length; 
      Stream dataStream = request.GetRequestStream(); 
      dataStream.Write(byteArray, 0, byteArray.Length); 
      dataStream.Close(); 
      WebResponse response = request.GetResponse(); 
      dataStream = response.GetResponseStream(); 
      StreamReader reader = new StreamReader(dataStream); 
      string responseFromServer = reader.ReadToEnd(); 
      reader.Close(); 
      dataStream.Close(); 
      response.Close(); 

      return responseFromServer; 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

Und das ist mein Android-Side-Code, der die Nachricht zu fangen.

+0

Ich bin nicht sicher, ob dies die Antwort ist, und Ich bin kein C# -Programmierer. Aber basierend auf dem, was ich von Ihrem Code verstanden habe, codieren Sie die Strings nicht. Zum Beispiel ist "http: //www.acom? Q = einige Daten" ungültig. Sie mussten "einige Daten" kodieren, die "http: //www.acom? Q = einige% 20data" ergeben. Ich vermute, dass Sie auch die arabischen Zeichen verschlüsseln müssen. In Python würde ich 'cgi.encode()' und in Java 'UrlEnconder.encode()' verwenden. Ich kenne das Äquivalent in C# nicht. –

Antwort

9

André Oriani hat die allgemeine Idee für das Update. Obwohl die Nachricht im Hauptteil der Anfrage platziert wird, muss sie dennoch verschlüsselt sein.

string postData = string.Format("registration_id={0}&data.payload={1}&collapse_key={2}", id, msg, collaspeKey); 

sollte mit

string postData = string.Format("registration_id={0}&data.payload={1}&collapse_key={2}", id, HttpUtility.UrlEncode(msg), HttpUtility.UrlEncode(collaspeKey)); 

Sie müssen einen Verweis auf System.Web um HttpUtility zu verwenden, ersetzt werden. Weitere Informationen finden Sie unter URL Encoding using C#.

+0

gibt es so etwas wie HTTPUtility das für Java? – user1163234

+0

Hoppla! Vielen Dank! gut! – breceivemail

2

Haben Sie darüber nachgedacht, base64 zu verwenden, um die über GCM gesendete Zeichenfolge zu codieren? Auf diese Weise würden Sie alle Codierungsprobleme entfernen.

2

Hier ist, was es für mich in Java gelöst:

Auf der Serverseite:

encodedMessage = URLEncoder.encode(message, "UTF-8"); 

In der App:

decodedMessage = URLDecoder.decode(message, "UTF-8"); 
Verwandte Themen