2016-06-02 2 views
1

나는 xamarin을 통해 만들어진 안드로이드 응용 프로그램에서 A 버튼을 클릭하면 GCM 알림을 보내야합니다.버튼에 원격 알림을 보내는 방법을 클릭하십시오. Xamarin.Android C#

이 나는이 튜토리얼 https://developer.xamarin.com/guides/cross-platform/application_fundamentals/notifications/android/remote_notifications_in_android/

Button btnCLick = Findviewbyid<button>(resource.id.btnclikc); 
btnCLick.Click += btnCLick_CLICK; 
void btnCLick_Click (object sender, System.EventArgs e) 
{ 
// Here i need to send my notification. I am not able to get it. 
} 

내 통지를 보내도록 MessageSender.exe를 사용하지만 난 내 응용 프로그램으로 만들 기운을 따랐다.

using System; 
using System.Net.Http; 
using System.Net.Http.Headers; 
using System.Text; 
using System.Threading.Tasks; 
using Newtonsoft.Json.Linq; 

namespace MessageSender 

{ 
class Program 
{ 
    public const string API_KEY = "API_KEY"; 
    public const string MESSAGE = "MESSAGE"; 

    static void Main(string[] args) 
    { 
     var jGcmData = new JObject(); 
     var jData = new JObject(); 

     jData.Add("message", MESSAGE); 
     jGcmData.Add("to", "/topics/global"); 
     jGcmData.Add("data", jData); 

     var url = new Uri("https://gcm-http.googleapis.com/gcm/send"); 
     try 
     { 
      using (var client = new HttpClient()) 
      { 
       client.DefaultRequestHeaders.Accept.Add(
        new MediaTypeWithQualityHeaderValue("application/json")); 

       client.DefaultRequestHeaders.TryAddWithoutValidation(
        "Authorization", "key=" + API_KEY); 

       Task.WaitAll(client.PostAsync(url, 
        new StringContent(jGcmData.ToString(), Encoding.Default, "application/json")) 
         .ContinueWith(response => 
         { 
          Console.WriteLine(response); 
          Console.WriteLine("Message sent: check the client device notification tray."); 
         })); 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Unable to send GCM message:"); 
      Console.Error.WriteLine(e.StackTrace); 
     } 
    } 
    } 
} 

나는 내가 그렇게하는 방법을 xamarin.Android 에 내 응용 프로그램의 버튼 클릭으로 이것을 할 필요가?

+0

당신의 안드로이드 애플 리케이션에서 메시지를 보내려고입니까? –

+0

예 푸시 알림 –

+0

클라이언트 응용 프로그램이 글로벌 주제에 가입 했습니까? 질문에 해당 코드를 포함시킬 수 있습니까? –

답변

0

사실 나는 질문에 주어진 것과 같은 것을 사용했습니다.

 string API_KEY = "APIKEY"; 
     var jGcmData = new JObject(); 
     var jData = new JObject(); 
     jData.Add("message", message); 
     jGcmData.Add("to", "/topics/global"); 
     jGcmData.Add("data", jData); 

     var url = new Uri("https://gcm-http.googleapis.com/gcm/send"); 
     try 
     { 
      using (var client = new HttpClient()) 
      { 
       client.DefaultRequestHeaders.Accept.Add(
        new MediaTypeWithQualityHeaderValue("application/json")); 

       client.DefaultRequestHeaders.TryAddWithoutValidation(
        "Authorization", "key=" + API_KEY); 

       Task.WaitAll(client.PostAsync(url, 
        new StringContent(jGcmData.ToString(), Encoding.Default, "application/json")) 
         .ContinueWith(response => 
         { 
          Console.WriteLine(response); 
          Console.WriteLine("Message sent: check the client device notification tray."); 
         })); 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Unable to send GCM message:"); 
      Console.Error.WriteLine(e.StackTrace); 
     } 

효과가있었습니다. 당신의 도움을 주셔서 감사합니다. 형제 @ ZverevEugene

0

xamarin에 대한 크로스 플랫폼 HttpClient 사용 구현이 필요 이상으로 올바르게 표시되는 경우, 맞습니까?

시험해보십시오. Consuming a RESTful Web Service. 주제가 다소 오도 될 수도 있지만 필요한 코드는 HttpClient입니다.

async void MyNotificationPost(Uri uri, string json) 
{ 
    HttpClient client = new HttpClient(); 
    var content = new StringContent (json, Encoding.UTF8, "application/json"); 
    HttpResponseMessage response = await client.PostAsync(uri, content); 

    ... 

    if (response.IsSuccessStatusCode) 
    { 
     ... 
    } 
} 

이 예에서는 교차 플랫폼 Microsoft HTTP Client Libraries이 사용되었습니다. 당신이 그것을 좋아하지 않는다면, 재고가있는 일반 HttpWebRequest을 사용할 수 있습니다.

Task<WebResponse> HTTPRequestSend(
     Uri uri, 
     byte[] bodyData, 
     CancellationToken cancellationToken) 
    { 
     HttpWebRequest request = WebRequest.CreateHttp(uri); 
     request.Method = "POST"; 
     request.Headers["Accept"] = "application/json"; 

     return Task.Factory.FromAsync<Stream>(
      request.BeginGetRequestStream, 
      request.EndGetRequestStream, 
      null).ContinueWith(
       reqStreamTask => 
       { 
        using (reqStreamTask.Result) 
        { 
         reqStreamTask.Result.Write(bodyData, 0, bodyData.Length); 
        } 

        return Task.Factory.FromAsync<WebResponse>(
         request.BeginGetResponse, 
         request.EndGetResponse, 
         null).ContinueWith(
          resTask => 
          { 
           return resTask.Result; 
          }, 
          cancellationToken); 
       }, 
       cancellationToken).Unwrap(); 
    } 

동기화가 필요하면 교착 상태에 빠지지 않도록주의하십시오. ConfigureAwait(false) 등을 사용하는 것을 잊지 마십시오.

P. ContinueWith을 사용하고 있으며 위험하지 않다고 생각합니다. 여기를보십시오 : ContinueWith is Dangerous, Too 그리고 주요 기사를 놓치지 마십시오 : StartNew is Dangerous

+0

나는 그것을 만들 수 없습니다 선생님! 제발 저에게 모범을 보여줄 수 있다면 제발! 나는 너에게 기쁠 것이다! –

+0

@Bakshi 예제를주지 않았습니까? 지금 yor 문제는 정확히 무엇입니까? –

+0

사실. 나는 그것을 사용하는 방법을 만들 수 없습니다. 알림은 주제/글로벌 인스턴트 메신저로 보내야만 사용할 수 없습니다. –

관련 문제