2016-03-29 7 views
-1

Я хочу отправить уведомление пользователю при назначении задачи (например, при нажатии кнопки). Когда задание назначается пользователю, я меняю некоторые значения на моем сервере (т. Е. Выполняю почтовый метод). Я хотел бы знать, как это сделать. Я добрался до регистрации пользователя при входе в мое приложение & Я храню идентификатор пользователя на моем сервере. Я также ознакомился с руководством для разработчиков Google и зарегистрировал мое приложение и получил senderid и serverapikey. Я отправлю код до того места, где я достиг, пожалуйста, помогите мне, как двигаться дальше.Включить уведомление GCM Push в мое приложение

LoginActivity

private void checkUserRegistrationToken() { 
    String url = URLMap.getGcmtokenUrl("gcmtoken_url"); 
    employeeId = LoggedInUserStore.getLoggedInEmployeeId(getApplicationContext()); 
    companyId = LoggedInUserStore.getLoggedInCompanyId(getApplicationContext()); 
    url = url.replace("{eid}", employeeId).replace("{cid}", companyId); 
    final StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      try { 
        JSONObject jObj = new JSONObject(response); 
       tokenId = jObj.getString("TokenId"); 
       if (tokenId.equals("null")) { 
        registerInBackground(); 
       } 
      } catch (JSONException e) { 

      } 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      System.out.println("Error===" + error.toString()); 
     } 
    }); 
    request.setRetryPolicy(new VolleyRetryPolicy().getRetryPolicy()); 
    RequestQueue queue = ((VolleyRequestQueue) getApplication()).getRequestQueue(); 
    queue.add(request); 
} 

private void registerInBackground() { 
    new AsyncTask<Void, Void, String>() { 
     @Override 
     protected String doInBackground(Void... params) { 
      String msg = ""; 
      try { 
       if (gcmObj == null) { 
        gcmObj = GoogleCloudMessaging.getInstance(LoginActivity.this); 
       } 
       tokenId = gcmObj.register(String.valueOf(R.string.gcm_defaultSenderId)); 
       msg = "Registration ID:" + tokenId; 
       if (new ServiceManager(getApplicationContext()).isNetworkAvailable() && checkPlayServices()) { 
        String storeUrl = URLMap.getGcmtokenPostUrl(); 
        employeeId = LoggedInUserStore.getLoggedInEmployeeId(getApplicationContext()); 
        companyId = LoggedInUserStore.getLoggedInCompanyId(getApplicationContext()); 
        HashMap<String, String> map = new HashMap<String, String>(); 
        map.put("EmployeeId", employeeId); 
        map.put("CompanyId", companyId); 
        map.put("TokenId", tokenId); 
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, storeUrl, new JSONObject(map), new Response.Listener<JSONObject>() { 
         @Override 
         public void onResponse(JSONObject response) { 
          Log.i(TAG, "Token has been posted in server!"); 
         } 
        }, new Response.ErrorListener() { 
         @Override 
         public void onErrorResponse(VolleyError error) { 
          Log.i(TAG, "Error posting token into server!!"); 
         } 
        }); 
        request.setRetryPolicy(new VolleyRetryPolicy().getRetryPolicy()); 
        RequestQueue queue = ((VolleyRequestQueue) getApplication()).getRequestQueue(); 
        queue.add(request); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      System.out.println("Token Mesage=" + msg); 
      return msg; 
     } 

     @Override 
     protected void onPostExecute(String s) { 
     } 
    }.execute(); 
} 

Как вы можете видеть, что я храню токенов идентификатор пользователя в моем сервере. Теперь я также создал GcmBroadcastReceiver класс

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 
    ComponentName comp = new ComponentName(context.getPackageName(), 
      NotificationService.class.getName()); 
    startWakefulService(context, (intent.setComponent(comp))); 
    setResultCode(Activity.RESULT_OK); 
} 

}

и я также создал класс NotificationService, который имеет по методу MessageReceived

public class NotificationService extends GcmListenerService { 


public static final int notifyID = 9001; 
public static final String appname = "FM Ninja"; 
NotificationCompat.Builder builder; 

public NotificationService() { 
    // super("GcmIntentService"); 
} 

@Override 
public void onMessageReceived(String from, Bundle data) { 

     Intent resultIntent = null; 
     PendingIntent resultPendingIntent; 
     resultIntent = new Intent(this, HomeActivity.class); 
     resultPendingIntent = PendingIntent.getActivity(this, 0, 
       resultIntent, PendingIntent.FLAG_CANCEL_CURRENT); 

     NotificationCompat.Builder mNotifyBuilder; 
     NotificationManager mNotificationManager; 

     mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 

     mNotifyBuilder = new NotificationCompat.Builder(this) 
       .setContentTitle("title") 
       .setTicker("New Message !") 
       .setContentText("first message please") 
       .setSmallIcon(R.mipmap.cms_launch_icon); 

     // Set pending intent 
     mNotifyBuilder.setContentIntent(resultPendingIntent); 

     // Set Vibrate, Sound and Light 
     int defaults = 0; 
     defaults = defaults | Notification.DEFAULT_LIGHTS; 
     defaults = defaults | Notification.DEFAULT_VIBRATE; 
     defaults = defaults | Notification.DEFAULT_SOUND; 

     mNotifyBuilder.setDefaults(defaults); 
     mNotifyBuilder.setAutoCancel(true); 
     // Post a notification 
     mNotificationManager.notify(notifyID, mNotifyBuilder.build()); 
} 

}

Проблема еще после добавления разрешения в Manifeast при вызове с сервера onMessageReceived никогда не выполняется. Пожалуйста, помогите мне , Я также разместить manifeast файлу

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

<!--GCM Permissions--> 

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
<uses-permission android:name="com.google.android.c2dm.permission.SEND"/> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
<permission android:name="com.six30labs.cms.permission.C2D_MESSAGE" 
    android:protectionLevel="signature"/> 

<uses-permission android:name="com.six30labs.cms.permission.C2D_MESSAGE" /> 


<application 
    android:name="com.six30labs.cms.general.VolleyRequestQueue" 
    android:allowBackup="true" 
    android:icon="@mipmap/cms_launch_icon" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 

    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity> 

    <activity android:name=".SplashScreen"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 


    <meta-data android:name="com.google.android.gms.version" 
     android:value="@integer/google_play_services_version" /> 

    <activity android:name=".LoginActivity" /> 
    <activity android:name=".ForgotPassword" /> 
    <activity android:name=".NoInternet" /> 
    <activity android:name=".HomeActivity"/> 
    <activity android:name=".ComplaintDetailsSupervisor" /> 
    <activity android:name=".ComplaintDetailsEmployee" /> 
    <activity android:name=".NavBarProfile" /> 
    <activity android:name=".ComplaintDetailsWorker" /> 
    <activity android:name=".AssignedDetailSupervisor" /> 
    <activity android:name=".AcceptedComplaintDetailsWorker" /> 
    <activity android:name=".VerifyDetailSupervisor"/> 
    <activity android:name=".ManagerComplaintListActivity"/> 

    <!--<service android:name="com.six30labs.cms.storage.RegistrationIntentService" 
     android:exported="false"/>--> 

    <receiver 
     android:name="com.six30labs.cms.general.GcmBroadcastReceiver" 
     android:exported="true" 
     android:permission="com.google.android.c2dm.permission.SEND"> 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
      <category android:name="com.six30labs.cms"/> 
     </intent-filter> 
    </receiver> 

    <!-- Register Service --> 

    <service android:name="com.six30labs.cms.general.NotificationService" 
     android:exported="false" > 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
     </intent-filter> 
    </service> 

</application> 

стороне сервера скрипт

public class GCMNotification 
{ 
    private CMSEntities db = new CMSEntities(); 
    static string gcmid = "AIzaSyB7HSIF1RIvkyCnpP6KtYiy6wQ-s6YBscY"; 

    public void AssignEmpNotification(string employeeid) 
    { 
     long id = Convert.ToInt64(employeeid); 
     PushBroker pushBroker = new PushBroker(); 
     pushBroker.RegisterGcmService(new GcmPushChannelSettings(gcmid)); 
     pushBroker.QueueNotification(new GcmNotification().ForDeviceRegistrationId("APA91bGElkVodLyubuMM90TEnfUMab0Fs6JudsjXcgIUrTrT8Zk3GezKYWc9w2gGs6pzLLq_nPSZCXU30M5iYKdRJcKZnkafWuwhnihZQ88vcwUrKhiQn6eWSqGrLCeHFblVT09IR7jy") 
      .WithJson(@"{""message"":""Hi Hello" + "wsfdasd" + @""",""title"":""title" + "vendorBids" + @""",""Bidsid"":""" + "1" + @""",""Eventdate"":""" + "2/2/2016" + @""",""vendorname"":""" + "name" + @"""}")); 

     pushBroker.StopAllServices(); 
    } 

} 
+0

Я просто хочу жесткий код токена и получать уведомления на мой мобильный телефон, как только я достигну, что, чем я буду кодировать, когда уведомление должно быть отправлено на сервере боковая сторона. – Rakesh

+0

опубликуйте свой код на стороне сервера, поскольку он будет отвечать за отправку gcm через облако Google. –

+0

Сэр, мы используем GCMNotification.cs ... – Rakesh

ответ

0

Начало регистрации в ответ, что сервер при получении после отправки уведомления полезной нагрузки на серверы Google. Если есть проблема с токеном устройства, вы получите подробную ошибку, например «Not Registered».

Если в токене нет проблем, сервер google ответит вам с успехом и идентификатором сообщения.

После того, как вы уверены, что с токеном устройства нет проблем, мы можем подумать о проблемах в коде устройства.

Другая вероятная проблема. Я могу думать, что хэш SHA, который вы добавили в консоль разработчика Google, не соответствует хешам SHA хранилища ключей, с которым вы подписали приложение. Добавьте SHA-хэш файла debug.keystore, а также хранилище ключей для подписания продукции.

+0

Привет, сэр, я пробовал регистрировать ответ, но ответ с сервера становится неудачным, он дает как [GCM mismatchSenderId], хотя я использую правильный идентификатор отправителя, и у меня также есть попробовал повторное создание другого проекта на консоли разработчика Google и зарегистрировал мой мобильный телефон и получил новый ключ [токен], но все же он показывает то же сообщение об ошибке .. Пожалуйста, помогите С уважением, Rakesh – Rakesh

1
  1. Сервер должен отправить запрос HTTP после в «https://android.googleapis.com/gcm/send» вместе со списком регистрации идентификаторов и сообщения как данные тела.

    Данные тела представляют собой комбинацию: a. идентификаторы регистрации (который является списком массива) b. сообщение

    Заголовок представляет собой комбинацию из следующих ссылок: a. Content-Type b.Авторизация (ключ: id проекта)

    1. Список regIds = new ArrayList(); // добавить regIds в этот список: regIds.add ("value"); Данные JSONObject = новый JSONObject(); data.put ("registration_ids", regIds); data.put («Сообщение», «Привет»);

    2. ApiKey - это ценность, которую мы получили во время проекта, созданного в магазине google. Карты заголовки = новый HashMap(); headers.put («Content-Type», «application/json»); header.put («Авторизация», «ключ = ApiKey»);

    3. После отправки запроса на отправку по электронной почте. Сервер gcm google отправит сообщение всем пользователям, регистрационный идентификатор которых указан в запросе http .

    4. Андроида мобильная получит уведомление с сервера gcm как ответ , который будет обработан GCMBroadcastReceiver. Теперь будет вызван класс NotificationService, который будет округлен IntentService. В этом классе @Override защищенная пустота onHandleIntent (намерение намерения) { Bundle extras = intent.getExtras(); GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance (this); Строка messageType = gcm.getMessageType (намерение);

      если { showNotification (intent.getStringExtra ("Message")) (extras.isEmpty() & & GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals (MessageType)!); } GcmBroadcastReceiver.completeWakefulIntent (намерение); }

    5. Этот метод вызывает метод showNotification, который имеет параметр . Используйте это сообщение и покажите его в уведомлении с помощью NotificationManager.

Надеется, что это помогает :)

+0

Как получить подтверждение, получил ли сервер GCM сообщение отправлено с моего сервера? Я получаю выход Success на моем сервере, но я сомневаюсь, что он получен сервером GCM ... – Rakesh

+0

Если ответ имеет успех, неудачу, результаты. Это означает, что сервер ответил на запрос. В столбце «Успешность» указано, сколько идентификаторов получено сообщение и отказ, указывает, сколько из них не удалось. Не могли бы вы вставить ответ от GCMServer. Чтобы проверить больше, запрос на завивку может быть использован для отправки GCMNotification. –

+0

Из командной строки используйте запрос curl как: curl --header «Authorization: key = API_KEY» - header Тип содержимого: «application/json» https: //android.googleapis.com/gcm/send -d "{\" data \ ": {\" Message \ ": \" Добро пожаловать для push-уведомлений \ "} \" registration_ids \ ": [\" regId \ "]}" –

Смежные вопросы