USSD в Android

USSD (Unstructured Supplementary Service Data)— стандартный сервис в сетях GSM, позволяющий организовать интерактивное взаимодействие между абонентом сети и сервисным приложением в режиме передачи коротких сообщений.
Как известно, Android не имеет API для чтения USSD сообщений, далее я расскажу как решить эту проблему.

Как то столкнулся с задачей отослать команду и принять USSD сообщение. Оказывается USSD ответ сохраняется в буфере BufferedReader и существует сторонний класс USSD, для парсинга информации из этого буфера.

Сам класс можно скопировать тут

Теперь рассмотрим саму реализацию использования класса:
Для начала создадим интерфейс приложения, у нас будет AutoCompleteTextView, TextView, Button:

<!--?xml version="1.0" encoding="utf-8"?-->
<linearlayout xmlns:android="schemas.android.com/apk/res/android" 
   android:orientation="vertical" 
   android:layout_width="fill_parent" 
   android:layout_height="fill_parent">
<autocompletetextview 
       android:layout_width="fill_parent" 
       android:text="" 
       android:layout_height="wrap_content" 
       android:inputtype="phone|textUri"
       android:id="@+id/Text1">
<requestfocus></requestfocus>
</autocompletetextview>
<textview 
       android:layout_width="fill_parent" 
       android:id="@+id/Text2" 
       android:layout_height="wrap_content">
</textview>
<button 
       android:text="@string/send"
       android:id="@+id/button1" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content">
</button>
</linearlayout>


Вот такой интерфейс у нас должен получиться:

image

Теперь предадим жизни приложению, напишем сам код получения результата USSD.

// не пишу все импорты, напишу только то, что не забудьте подключить класс USSD
import com.example.android.UssdMessage.USSD;
 
public class UssdmessageActivity extends Activity implements OnClickListener {
/** Called when the activity is first created. */
private TextView view;
private AutoCompleteTextView number;
 
Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(this);
this.view = (TextView) findViewById(R.id.Text2);
this.number = (AutoCompleteTextView) findViewById(R.id.Text1);
}
 
Override
public void onClick(View arg0) {
String encodedHash = Uri.encode(«#»);
call(«*» + number.getText() + encodedHash);
this.view.setText(«»);
}
 
protected void call(String phoneNumber) {
try {
startActivityForResult(
new Intent(«android.intent.action.CALL», Uri.parse(«tel:»
+ phoneNumber))1);
} catch (Exception eExcept) {
this.view.append(«nn » + «n« + eExcept.toString());
}
}
 
Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
USSD ussd = new USSD(4000,4000); // передается два параметра, задержка до и после (ms) создания сообщения
if (ussd.IsFound())
this.view.append(«n«+ussd.getMsg());
else
this.view.append(«»+R.string.error_ussd_msg);
}
 
}


Так же не забудьте добавить следующие разрешения (иначе не заработает):

<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
<uses-permission android:name="android.permission.CALL_PRIVILEGED"></uses-permission>
<uses-permission android:name="android.permission.READ_LOGS"></uses-permission>


Скриншот работы приложения:

image

Добавлю то, что класс написан так, что выводит в logcat отладочную информацию.
На мой взгляд не сложный и удобный класс, который может помочь в решении Ваших задач.
Спасибо за внимание.

.apk файл Скачать
исходники Скачать
Поделиться публикацией
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама
Комментарии 42
  • +6
    Отправка / прием происходят полностью в фоне или на экране все равно отображается отправка и принимаемое сообщение?
    • +1
      Все равно появляется сообщение «Выполняется запрос USSD», и ответ тоже появляется в окне. Возможно можно перехватить или подавить, не вникал.
      • 0
        Чтобы подавить, нужны root права у приложения.
        • 0
          Чтобы подавить окно ответа, оставив окно выполнения запроса, рут не нужен. Правда, работать будет далеко не на всех девайсах, впрочем, как и способ, описанный в данной статье.
          Для полного подавления, действительно, нужен рут, и весьма нетривиальная организация перехвата сообщений от ril. Реализовано, например, в Prepay Widget.
      • 0
        Данная статья с большой бородой. Я видел ее в песочнице еще в начале сентября. Сейчас каким-то образом опять туда попала.
        • +5
          я эту статьи и писал… еще в те бородатые сентябрьские дни…
          • +3
            Тогда с почином вас! :)
            • +1
              Спасибо :)
              • +1
                Спасибо :)
                • 0
                  Да, и подключите это ваше «Горячее ТВ для взрослых в телефоне» ((=
                  • 0
                    не интересует ))
                • 0
                  А эту ajc.su/mobilnye-os/android-mobilnye-os/ussd-v-android/ статью тоже Вы писали?
                  • +2
                    вы же знаете что такое интернет, видимо из песочницы её скопипастили на другой ресурс…
                    смотрите, строка
                    «Сам класс можно скачать тут»
                    если перейти по ссылке, то посмотрите кем размещен код класса :)
                    в той статье даже опечатки мои сохранены xD
                    «На ой взгляд не сложный»
                    • +3
                      если надо, могу приложить apk и исходники?
                      • +1
                        Спасибо! Я всего лишь спросил.
                        На том ресурсе статься точь-в-точь такая же от 5ого сентября, авторства не указано. Спасибо еще раз, что прояснили ситуацию.
                        А по поводу минусов: спасибо и за это, странное место хабр, я считаю -если есть какие-то вопросы: не нужно стесняться из задавать. Я никого ни в чем не обвинял, просто привел линк. Я думаю, что не зря, теперь автор может обратиться к админам ajc.su на предмет воровства чужой статьи.
                        • 0
                          Я думаю, минус был за то, что ваша ссылка пойдет тому сайту в плюс.
                          • 0
                            Не пойдет она тому сайту в плюсы, а как раз все выведет на чистую воду. См.коммент автора ниже.
                            Предыстория: к примеру, даю я линк на эту статью людям, а мне вопрос: «мы где-то видели подобную» и линк дали уже на другой сайт.
                            Я к тому, что многие на хабре боятся лишнее слово сказать. А вдруг минуснут? А друг еще чего. А потому и гуляют по инету всякие левые ссылки…
                          • 0
                            Написать то им хочется, но что то пока не нашел я куда там писать…
                            Спасибо за линк.
                            p.s. там не только мой пост, но и еще с хабра куча…
                        • +1
                          Все нормально, вот она с указанием источника
                          habr-sandbox.livejournal.com/379031.html
                    • 0
                      Я может быть пропустил, а где само приложение можно скачать?
                      • +1
                        сейчас выложу apk и исходники
                      • 0
                        В эта бага висит 3 года уже.
                        Гугл, похоже, не особо заботят подобные вещи, поэтому появляются такие велосипеды.
                        • 0
                          видимо они не видят в этом приоритетную задачу…
                        • 0
                          Прикрутите регулярочку, чтобы вывод был без рекламы. :-)
                          • 0
                            Реклама? Вы ко мне обращаетесь?
                            • 0
                              "… ТВ взрослых в телефоне..."
                              • 0
                                Задача была вывести USSD, можно и регулярку, что бы баланс был, тут уж насколько фантазии хватит.
                                Это ответ мегафона на запрос баланса.
                          • +1
                            Обновил пост, забыл про разрешения, обратите внимание — это важно.
                            • +1
                              и добавил ссылки на скачку файлов: .apk и исходники
                            • 0
                              Я ме разбираюсь в этих технических деталях, но у меня разрыв шаблона. Есть Андроид таблетка, в ней стоит симка. EDGE, SMS великолепно работают. Не понимаю почему проблема с USSD? Я тупо не могу посмотреть баланс средств на моей симке. Что же мне ее теперь каждый раз вынимать и встaвлять в другой аппарат?

                              Установил вашу программу. Запускается, но в ответ на любой USSD номер на экране высвечиавется какое-то число. Galaxy Tab 10.1
                              • 0
                                была похожая проблема на каком то другом устройстве, однако на моем acer s120 повторить не удалось…
                                • 0
                                  В чем принципиальная суть проблемы? Я понимаю, когда в таблетках отключают голосовые функции. Но почему вместе с ними пропадает и USSD? Я сначала думал, что проблема в отсутствии штатной номеронабиралки, но никакие сторонние приложения не помогли. Вроде бы USSD напрямую никак не свазан с голосом.
                              • 0
                                Когда же на моём Motorola Droid 2 Global заработают USSD?! :( Ваша статья как соль на рану.
                                • 0
                                  в некоторых случаях USSD можно заменить на отправку бесплатного SMS, так сейчас и делают программы по работе с балансом например.
                                  • 0
                                    Я облазил весь сайт МТС Украина, но не нашёл, как проверить баланс sms-кой. В поддержку было влом писать.
                                • 0
                                  жалко на моем I5500 не работает… Хотя USSD Checker работает без сбоев.
                                  • 0
                                    номер следует вводить без * и # как на скриншоте последнем
                                    • 0
                                      я понимаю, что без * и # — ответ на запрос высвечивается, но ussd.IsFound() дает false.
                                      • 0
                                        это как? если ussd.IsFound() false то будет ошибка с сообщением типа не чего не найдено.
                                        if (ussd.IsFound())
                                            this.view.append("\n"+ussd.getMsg()); // полученное ussd сообщение
                                        else
                                            this.view.append(""+R.string.error_ussd_msg); //сообщение об ошибке
                                        

                                        попробуйте убрать аргументы
                                        USSD ussd = new USSD(); // по умолчанию 3000,3000
                                        
                                        • 0
                                          я немного видоизменил концовку — поэтому ничего. А так вечером попробую разобраться.
                                          • 0
                                            Да, цифры как раз — это и есть сообщение об ошибке.
                                      • 0
                                        В LogCat ничего не сыпется просто…
                                        Насколько я понял из дискуссии code.google.com/p/android/issues/detail?id=1285#c121 этот способ будет работать только при компиляции с режимом дебагинга. Нашел еще вот это commandus.com/blog/?p=58, но еще не побывал. Так как программист из меня мало мальский я предлагаю попробовать Вам.

                                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.