2015-12-27 2 views
0

Я пытаюсь добиться чего-то похожего на приложение «Найти мой телефон», то есть отправлять SMS-сообщения на свой телефон и получать ответ по SMS, рассказывая, где находится мой телефон. Требование этого приложения является открытым исходным кодом.Автоматический ответ SMS от Android-приложения

Я видел, что этот вид приложения уже существует в репозитории F-Droid, называется FindMyPhone. Однако, когда телефон получает SMS, его ответ отображается в приложении обмена мгновенными сообщениями как ответ на контакт, но не отправляется эффективно. Это не ожидаемое поведение, и я мог видеть в коде хранилище, что автор пытался исправлять это, а затем дал в 2013 году

Я посмотрел в код и увидел, что метод он использует это straigthforward:

   try { 
       SmsManager smsManager = SmsManager.getDefault(); 
       // ********* SENDING SMS HERE ******* 
       smsManager.sendTextMessage(currentFromAddress, null, txt, null, null); 
       // ********* SENDING SMS HERE ******* 
       Log.d(FindMyPhoneHelper.LOG_TAG, "Sent SMS"); 
       Thread.sleep(5000); 
       Log.d(FindMyPhoneHelper.LOG_TAG, "Slept 5000ms"); 
      } catch(Exception e) { 
       Log.d(FindMyPhoneHelper.LOG_TAG, "Failed SMS: " + e.getMessage()); 
       e.printStackTrace(); 
      } 

(link to the code in sourceforge)

Этот код выполняется в классе реализации LocationListener, названный в новой нити с помощью службы.

Любой намек на причину такого поведения? Почему сообщение отображается, но не отправляется? Я просмотрел другую аналогичную заявку: https://f-droid.org/repository/browse/?fdid=com.teamdc.stephendiniz.autoaway

Это нормально работает и отвечает на SMS-сообщения, как ожидалось. Основное его различие заключается в том, что это приложение работает в службе, которая постоянно прослушивает новые сообщения и регистрирует приемник «на лету», а не объявляет его в манифесте. Для меня это не будет большой проблемой, но я бы предпочел, чтобы сервис не работал.

Заранее благодарим за помощь.

ответ

0

Узнал, в чем проблема, это не имеет никакого отношения к API-интерфейсу обмена сообщениями.

В BroadcastReceiver реагирует на SMS прибытия, номер телефона отправителя был передан в службу фактически отправляет ответное SMS по Намерение данных как этот

locationIntent.setData(Uri.parse("?destinationAddress=" + from)); 

Как «от» адрес был URI закодированы, символ + (плюс) в международном префиксе был потерян. Приложение Messaging могло бы жить с этим, поэтому оно могло отображать сообщение, но это не было отправлено.

Использование Intent Extras вместо Data сделало трюк, так как этот номер телефона не будет проходить через какую-либо кодировку.

Все лучшие

0

Одной из причин SMS неисправного для отправки может быть то, что приложение проходит нуль как SMS сервис-центр в sendTextMessage, в то время как он должен получать его от провайдера SMS, например:

public static String getSmsServiceCenterForConversation(final DatabaseWrapper dbWrapper, 
     final String conversationId) { 
    Assert.isNotMainThread(); 
    Cursor cursor = null; 
    try { 
     cursor = dbWrapper.query(DatabaseHelper.CONVERSATIONS_TABLE, 
       new String[] { ConversationColumns.SMS_SERVICE_CENTER }, 
       ConversationColumns._ID + "=?", 
       new String[] { conversationId }, 
       null, null, null); 
     Assert.inRange(cursor.getCount(), 0, 1); 
     if (cursor.moveToFirst()) { 
      return cursor.getString(0); 
     } 
    } finally { 
     if (cursor != null) { 
      cursor.close(); 
     } 
    } 
    return null; 
} 

Ссылка: https://android.googlesource.com/platform/packages/apps/Messaging/+/master/src/com/android/messaging/datamodel/BugleDatabaseOperations.java#917

Вы должны зарегистрировать приемник вещания, прослушивающий SMS_RECEIVED в манифесте, - нет необходимости регистрировать приемник на лету. Приемник должен разгружать работу на службу, хотя, например, IntentService, поскольку время выполнения, затраченное на onReceive, должно быть сокращено.

+0

Спасибо за ответ, но я боюсь, что это не причина моей проблемы: автоответ, приложение, которое правильно отправки SMS-сообщений, выполняет то же вызов sendTextMessage, передавая «нулевой» как центр обслуживания SMS. –

+0

Регистры FindMyPhone реагируют на SMS_RECEIVED в манифесте. Реакция на самом деле происходит, но SMS отображается только в моем приложении для обмена сообщениями и в любом случае не отправляется. –

+0

Я не мог сказать, почему он не отправляется, не глядя на журналы (adb logcat -b radio), но если он появляется в приложении обмена запасами как отправленное (отправленное, поставленное в очередь или не отправленное?), То это означает, что Android Framework сохранил его в базе данных SMS/MMS, и это происходит после того, как сообщение было отправлено (или не удалось отправить) в https://android.googlesource.com/platform/frameworks/opt/telephony/+/master/src /java/com/android/internal/telephony/SMSDispatcher.java#1408. – fejd

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

  • Нет связанных вопросов^_^