java - 从 ASP.NET 向 Android 应用程序发送推送通知

标签 java c# android asp.net android-notifications

我想从我的 ASP.NET WEB API 发布方法向我的简单 Android 应用程序发送一个小的推送通知。这是我尝试和重新搜索的所有内容。

我正在使用 Google 云消息服务将通知发送到应用程序。我的应用程序以名称值对的形式接收它。我还在此处提供了服务器代码的工作 Java 版本和我的 Post 方法中的 C# 实现。但是我的方法抛出异常 Android 应用程序中出现“异常发生,错误为(15913):println 需要一条消息”。

服务器部分的工作 Java 代码如下:-

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();
    }

同样,我在 ASP.NET WEB API 中的 C# 代码如下...

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;
        }
    }

在 Android APP 中,我有以下接收器的 LOC...

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
    {

    }

我是 Android 开发的新手,这是我的第一个 Helloworld Android 应用程序。谁能告诉我我做错了什么,为什么抛出异常以及如何纠正它?

最佳答案

经过大量研究后发现了这个问题。我假设 Log.i() 在内部也使用 println 将消息打印到 LOG。由于 GCM 没有推送我的客户端代码正在寻找的任何数据,因此它会抛出异常。撇开这一点不谈,我得到了 PUSH 通知工作,这是我学到的,因为它可能对遇到同样问题的其他人有用。

  1. GCM 使用 JSON 接收通知并将其推送到设备
  2. GCM 接收的 JSON 具有如下预定义格式

    { 数据: { 账号:你的号码, 金额:您的金额 }, registration_ids:[id1,id2,id3....]

因此,我在我的 ASP.NET 服务器端构建了上述 JSON 格式,并将 Http 请求传递给 GCM 服务器,其中包含 Authorization header 。在我的接收端,我提取了我的案例中所需的数据(帐户和金额)并相应地显示给用户。

PFB 我的 ASP.NET 服务器端和客户端接收器的代码。

服务器端:-

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;
        }
    }

Android 应用程序的客户端如下:-

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);
        }

所以,现在我只想知道如何在警报或任何带有确定按钮的对话框中显示收到的通知。谁能帮我在我的应用程序中使用什么类以及如何将其显示给用户?如果应用程序未处于 Activity 状态,它可以显示在通知栏中,否则需要带有确定按钮的弹出窗口。

谢谢,

关于java - 从 ASP.NET 向 Android 应用程序发送推送通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24029228/

相关文章:

java - 将欢迎页面重定向到 servlet 容器中另一个域中的页面?

java - 如果我在 App Engine 上构建 Spring 应用程序,它会默认使用多线程还是可以配置为?

c# - 比较两个对象的属性

android - 切换到支持库 26 和 AppBarActivity 到 AppCompatActivity 后工具栏菜单项被挤压

android - 连接到特定的 HID 配置文件蓝牙设备

android - 操作栏按钮仅显示在溢出中

java - 通过聚合和分组将一个对象映射到另一个对象

java - Java 中的对象内的对象

c# - 使用空值更新 varchar 字段

c# - 如何使用 Microsoft Office Interop word 选择段落的第一行或(前 20 个字符)。?