0

Я сделал приложение для Android, которое sms и звонит в приложение и без приложения (GSM или другой номер телефона). Если я отправить смс из приложения в приложение, GCMBroadcastreceiver называется, но если я пошлю смс с GSM на мое приложение, GCMBroadcastreceiver не называется, вот мой код:GCMBroadcastreceiver не вызывается, если вы получаете sms из не-приложения Android

GCMBroadcastreceiver.java:

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver { 

    private static final String TAG = GcmBroadcastReceiver.class.getSimpleName(); 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(TAG, "receive wakeful broadcast"); 
     ComponentName comp = new ComponentName(context.getPackageName(), GcmIntentService.class.getName()); 
     startWakefulService(context, (intent.setComponent(comp))); 
     //setResultCode(Activity.RESULT_OK); 
    } 

} 

GcmIntentService. Java:

public class GcmIntentService extends IntentService { 

    private static final String TAG = GcmIntentService.class.getSimpleName(); 
    private static final int NOTIFICATION_ID = 2; 

    private long[] vibratePattern = { 
      0, 500, 500, 500 
    }; 

    private NotificationManager notificationManager; 
    private AddressBookManager addressBookManager; 

    public GcmIntentService() { 
     super(TAG); 
     addressBookManager = AddressBookManager.getInstance(); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     Bundle extras = intent.getExtras(); 
     GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); 

     Intent messageIntent = new Intent(this, GetMessageService.class); 
     startService(messageIntent); 

     String messageType = gcm.getMessageType(intent); 
     Log.d(TAG, "messageType: " + messageType); 
     if(!extras.isEmpty()){ 
      Log.d(TAG, "2.extras: " + extras); 
      if(GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)){ 

      } 

      if(GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)){ 

      } 

      if(GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)){ 
       String extrasMessage = extras.getString("message"); 
       Log.d(TAG, "message: " + extrasMessage); 

       if (extrasMessage!=null){ 
        try { 
         JSONArray arrayJson = new JSONArray(extrasMessage); 
         if (arrayJson!=null){ 
          for(int i = 0; i < arrayJson.length(); i++){ 
           JSONObject json = arrayJson.getJSONObject(i); 
           String type = json.getString("type"); 
           String from = json.getString("from"); 
           String message = json.getString("message"); 
           sendNotification(type, from, message); 
          } 
         } 

        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
       else { 
        //Google Cloud Messaging Data is null 
        //sendNotification(null, null, null); 
       } 

      } 
     }  

     GcmBroadcastReceiver.completeWakefulIntent(intent); 
    } 

    private void sendNotification(String type, String msisdn, String message){ 
     String title = msisdn; 
     notificationManager = (NotificationManager)this.getSystemService(Context.NOTIFICATION_SERVICE); 
     Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_message_man); 

     if(addressBookManager.hasUser(msisdn)){ 
      User user = addressBookManager.getUser(msisdn); 

      if(!StringUtil.isEmpty(user.getContact().displayName)){ 
       title = user.getContact().displayName; 
      } 

      if(!StringUtil.isEmpty(user.getContact().photoThumbUri)){ 
       try { 
        bitmap = Media.getBitmap(getContentResolver(), Uri.parse(user.getContact().photoThumbUri)); 
       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 

      if(!StringUtil.isEmpty(user.getAvatarFile())){ 
       Bitmap fileBitmap = ImageTools.readFromFile(user.getAvatarFile()); 
       if(fileBitmap != null){ 
        bitmap = fileBitmap; 
       } 
      } 
     } 

     if("multi_sender".equals(type)){ 
      bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_message_multi);         
     } 

     NotificationCompat.Builder builder = new NotificationCompat.Builder(this) 
     .setSmallIcon(R.drawable.ic_notif) 
     .setLargeIcon(bitmap) 
     .setContentTitle(title) 
     .setVibrate(vibratePattern) 
     .setStyle(new NotificationCompat.BigTextStyle().bigText(message)) 
     .setAutoCancel(true) 
     .setContentText(message);  

     Intent resultIntent = new Intent(this, ConversationActivity.class); 
     char c = msisdn.charAt(0); 
     if (msisdn.startsWith("+") || (c >= 'A' && c <= 'Z')|| (c >= 'a' && c <= 'z') || msisdn.startsWith("0")) { 
      resultIntent.putExtra("msisdn", msisdn); 
     } 
     else { 
      //Tambah + di depan msisdn agar sama dengan msisdn di MessageActivity (History Message bisa dipanggil) 
      String msisdns = "+"+msisdn; 
      resultIntent.putExtra("msisdn", msisdns); 
     } 

     TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
     stackBuilder.addParentStack(MainActivity.class); 
     stackBuilder.addNextIntent(resultIntent); 

     PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 
     builder.setContentIntent(pendingIntent); 

     notificationManager.notify(NOTIFICATION_ID, builder.build());  
    } 
} 

Manifest:

<!-- receivers --> 
     <receiver 
      android:name=".gcm.GcmBroadcastReceiver" 
      android:permission="com.google.android.c2dm.permission.SEND" > 
      <intent-filter> 
       <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
       <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 
       <category android:name="com.marlinmedia.tkitalk" /> 
      </intent-filter> 
     </receiver> 

     <!-- services --> 
     <service android:name=".gcm.GcmIntentService" /> 

есть что-то не так с моим кодом или чем-то еще?

+0

Не могли бы вы пояснить, как вы отправляете sms-сообщения? –

+0

Я отправляю sms с помощью приложения для Android, которое я сделал с помощью библиотеки linphone, если я отправлю приложение в приложение, уведомление будет показано, но если я отправлю sms с телефона (не из моего приложения) с использованием номера gsm в мое приложение, уведомление не будет показано – Redturbo

ответ

0

Вы можете напрямую отправлять SMS из своего приложения в другое приложение без использования GCM. Архитектура GCM предназначена для отправки push-уведомления через Интернет через сервер GCM.

Вы можете использовать SMS Manager и последующего разрешения для отправки SMS из одного приложения к другому.

<uses-permission android:name="android.permission.SEND_SMS" /> 

Для получения более подробной информации, посмотрите на эту tutorial.