Reputation: 61
I want to Send a small Push Notification from my ASP.NET WEB API Post Method to my Simple Android App.. Here is what all I tried and re searched.
I am using Google Cloud Messaging Service to Send in the notification to the App. My App receives it in Name Value Pairs. I also give here the working Java Version of the Server Code and my C# implementation in my Post Method. But my Method throws an Exception as "Exception Occured with Error as(15913): println needs a message" in the Android App.
Working Java Code is as follows for the Server Part:-
public void sendmessage2Device(View v,String regisID,String msg1,String msg2) {
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(
"https://android.googleapis.com/gcm/send");
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
nameValuePairs.add(new BasicNameValuePair("registration_id",regisID));
nameValuePairs.add(new BasicNameValuePair("data1",msg1));
nameValuePairs.add(new BasicNameValuePair("data2", msg2));
post.setHeader("Authorization","key=AIzaSyBB6igK9sYYBTSIly6SRUHFVexeOa_7FuM");
post.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = client.execute(post);
InputStreamReader inputst = new InputStreamReader(response.getEntity().getContent());
BufferedReader rd = new BufferedReader(inputst);
String line = "";
while ((line = rd.readLine()) != null) {
Log.e("HttpResponse", line);
String s = line.substring(0);
Log.i("GCM response",s);
//Toast.makeText(v.getContext(), s, Toast.LENGTH_LONG).show();
}
} catch (IOException e) {
e.printStackTrace();
}
Similarly My C# Code in the ASP.NET WEB API is as follows...
public String Post([FromBody]TransactionDetails value)
{
try
{
WebClient toGCM = new WebClient();
toGCM.Headers.Add("ContentType:");
toGCM.Headers["ContentType"] = "application/x-www-form-urlencoded; charset=UTF-8";
//HttpWebRequest toGCM = (HttpWebRequest)WebRequest.Create("https://android.googleapis.com/gcm/send");
//toGCM.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
toGCM.Headers.Add("Accept:");
toGCM.Headers["Accept"]= "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36";
//toGCM.Accept = "application/json, text/javascript, */*; q=0.01";
toGCM.Headers.Add("UserAgent:") ;
toGCM.Headers["UserAgent"]= "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36";
toGCM.Headers.Add("Authorization:");
toGCM.Headers["Authorization"] = "key=AIzaSyCoxjeOGi_1ss2TeShDcoYbNcPU9_0J_TY";
//String DatatoClient = "ToAccountNumber=" + value.ToAccountNumber + "&Amount=" + value.Amount;
NameValueCollection postFieldNameValue = new NameValueCollection();
postFieldNameValue.Add("registration_id", "APA91bHzO52-3TsEIMV3RXi45ICIo9HOe1ospPl3gRYwAAw59ATHvadGPZN86heHOQJNU8syju-yD9UQqSgkZOqllGi5AoSPMRRuw3RYhgApflr0abLoAh2GWFQCZgToG_aM0rOg0lBV8osz6ZMtP1JBF1S9_DiWiqKRT5WL6qFz4PqyE0jCHsE");
postFieldNameValue.Add("Account", value.ToAccountNumber.ToString());
postFieldNameValue.Add("Amount", value.Amount.ToString());
byte[] responseArray = toGCM.UploadValues("https://android.googleapis.com/gcm/send", postFieldNameValue);
String S=Encoding.ASCII.GetString(responseArray);
return S;
}
catch (Exception e)
{
Console.WriteLine("Exception Occured in Post Method on Web Server as:{0}", e.Message);
return e.Message;
}
}
In the Android APP I have the following LOC for Receiver...
public void onReceive(Context context, Intent intent) {
try {
String action = intent.getAction();
if (action.equals("com.google.android.c2dm.intent.REGISTRATION"))
{
String registrationId = intent.getStringExtra("registration_id");
Log.i("Received the Registration Id as ",registrationId);
String error = intent.getStringExtra("error");
String unregistered = intent.getStringExtra("unregistered");
}
else if (action.equals("com.google.android.c2dm.intent.RECEIVE"))
{
Log.i("In the RECEIVE Method ",intent.getStringExtra("Account"));
String Account = intent.getStringExtra("Account");
String Amount = intent.getStringExtra("Amount");
Log.i("Received Account as ",Account);
Log.i("Received Amount as ",Amount);
}
}
catch(Exception e)
{
Log.i("Exception Occured with Error as ",e.getMessage());
}
finally
{
}
I am very new to Android Development and ths is my first Helloworld Android App. Can anyone tell me what am I doing wrong and why the Exception is being thrown and how to correct it?
Upvotes: 3
Views: 7552
Reputation: 61
Found the issue after some substantial research. I presumed that the Log.i() uses println internally to print the messages to LOG as well.Since the GCM is not pushing any data my client code is looking for, it throws an exception. Keeping that aside, I got the PUSH notifications working and here is what I learnt as it might be useful to someone else with the same problem.
The JSON to be received by the GCM has a predefined format as below
{ data: { Account: your number, Amount: your Amount }, registration_ids:[id1,id2,id3....] }
So, I constructed the above JSON format on my ASP.NET Server side and passed with Http request to GCM Server with the Authorization header in it. On my receiver side, I extracted the required data (Account and Amount) in my case and displayed to user accordingly.
PFB the codes of my ASP.NET Server Side and Client Side Receiver.
Server Side:-
public String Post([FromBody]TransactionDetails value, HttpRequestMessage receivedReq)
{
try
{
var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://android.googleapis.com/gcm/send");
httpWebRequest.ContentType = "application/json; charset=UTF-8";
httpWebRequest.Method = "POST";
httpWebRequest.Headers.Add("Authorization", "key=AIzaSyBs_eh4nNVaJl3FjQ_ZC72ZZ6uQ2F8r8W4");
String result = "";
String yourresp = "<html><head><title>Response from Server</title></head><body>";
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
string json = "{\"data\":" +"{\"Amount\":"+value.Amount+","+
"\"Account\":"+value.ToAccountNumber+"}"+","+
"\"registration_ids\":[" + "\""+value.RegID +"\"]}";
streamWriter.Write(json);
streamWriter.Flush();
streamWriter.Close();
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
result = streamReader.ReadToEnd();
}
}
DialogResult result1 = MessageBox.Show("Server sent the details to your phone, Check and Confirm to Continue or Not", "Important Information",MessageBoxButtons.YesNo);
if (result1.ToString().Contains("Yes"))
{
WriteAccountNumber(value.ToAccountNumber, value.Amount);
yourresp += "<h1>The Transaction was Successful</h1>";
}
else
{
yourresp += "<h1>The Transaction was NOT Successful</h1>";
}
yourresp += "</body></html>";
return yourresp;
}
catch (Exception e)
{
Console.WriteLine("Exception Occured in Post Method on Web Server as:{0}", e.Message);
return e.Message;
}
}
On the Client Side in the Android App is as follows:-
else if (action.equals("com.google.android.c2dm.intent.RECEIVE"))
{
//Log.i("Message Received","Before Scheme");
String Account=intent.getStringExtra("Account");
String Amount=intent.getStringExtra("Amount");
Toast.makeText(context, "Your Transaction Details Received by the Server are...\n\nAccount="+Account+"\nAmount="+Amount, Toast.LENGTH_LONG).show();
Log.i("Account=",Account);
Log.i("Amount=",Amount);
}
So, now I just want to know how to display the received Notification in an Alert or any kind of dialog box with an OK button. Could anyone help me what class an how to use it in my App to display it to user? if the App is not active it can be shown in Notifcation bar else a pop up is needed with an OK button.
Thanks,
Upvotes: 1