Intereting Posts
Правильный способ реализации onMeasure () и onLayout () в пользовательском AdapterView Android-приложение для установки полной версии приложений не отображается в приложении для Android-игр google Как добавить эффект скручивания в представлении пейджер Как изменить пользовательский агент по умолчанию в медиаплеере андроида Уникальный идентификатор для каждого пользователя в Android WebView необходимо загрузить дважды, чтобы правильно загрузить Android gradle buildTypes: Дублировать класс ОШИБКА: должен реализовать OnFragmentInteractionListener Как использовать два курсора и CursorJoiner в LoaderManager в android Android studio nullpointer предупреждения / уведомление в виде кода Наличие вертикальной прокрутки страниц в ViewPager Отправка html-писем на Kindle Fire Android. Как взять EditText (числа), затем преобразовать его в целое число, чтобы использовать его для математики? Имя applicationInfo.name PackageManager всегда равно нулю Поле ввода HTML: автоматически отображает числовой метод ввода

Можно ли прочитать историю затрат на звонки из диалога, поднятого после окончания предоплаченного вызова?

Существует ли возможность обработки данных, отображаемых в диалоговом окне стоимости вызова, полученном предоплаченным пользователем. Я хочу сохранить все снижение баланса в течение продолжительности вызова в моем sqlite db.

Введите описание изображения здесь

Как мы узнаем из уже известного сообщения в блоге

Для начала рассмотрим класс PhoneUtils в исходном коде Android. […] В частности, глядя на строку 217, создается намерение с именем «com.android.ussd.IExtendedNetworkService» . Так что вам нужно сделать, это реализовать свой собственный сервис, который отвечает на это намерение . Служба должна быть реализована в соответствии с IExtendedNetworkService.aidl, которая является частью платформы Android.

С чего начать? Лучше всего следовать этому еще более известному сообщению в блоге

Прежде всего, мы понимаем основы:

  1. Нам нужна служба, которая реализует интерфейс IExtendedNetworkService .
  2. Службе будет известно о намерении "com.android.ussd.IExtendedNetworkService" , поэтому в манифесте приложения он будет иметь фильтр соответствия требованиям.
  3. Мы знаем, что com.android.phone.PhoneUtils свяжется с этой услугой. (Если вы не знаете, что связывает услугу, см. Здесь )
  4. На Bind мы возвращаем связующее, которое связывает функции, которые PhoneUtils действительно вызовет
  5. Служба должна быть запущена, поэтому мы начнем ее при перезагрузке системы. Для этого нам нужен широковещательный приемник. (Если вы не знаете, что это такое, и вы хотите понять все это лучше, см. Здесь )

Давайте войдем в это.

Во-первых, приемник, это легкая часть. Мы создаем файл BootReceiver.java с этим содержимым.

 package com.android.ussdcodes; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Log.d("USSDService", context.getString(R.string.service_started)); context.startService(new Intent(context,USSDDumbExtendedNetworkService.class)); } } 

Теперь это сервис. Я не пробовал это сам, но я прочитал здесь код, чтобы найти объяснения методов, которые я добавил в комментарии. Также я редактировал некоторые вещи.

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

 public class USSDDumbExtendedNetworkService extends Service { public static final String TAG = "ExtNetService"; public static CharSequence mRetVal = null; public static boolean mActive = true; private boolean change = false; private String msgUssdRunning = null; private final IExtendedNetworkService.Stub mBinder = new IExtendedNetworkService.Stub() { //Set a MMI/USSD command to ExtendedNetworkService for further process. This should be called when a MMI command is placed from panel. //we don't need it in this case @Override public void setMmiString(String number) throws RemoteException { } //return the specific string which is used to prompt MMI/USSD is running @Override public CharSequence getMmiRunningText() throws RemoteException { return msgUssdRunning; } //Get specific message which should be displayed on pop-up dialog. Parameters: text original MMI/USSD message response from framework Returns: specific user message correspond to text. null stands for no pop-up dialog need to show. @Override public CharSequence getUserMessage(CharSequence text) throws RemoteException { return text; } //Clear pre-set MMI/USSD command. This should be called when user cancel a pre-dialed MMI command. //we don't need it in this case @Override public void clearMmiString() throws RemoteException { } }; @Override public IBinder onBind(Intent intent) { msgUssdRunning = "Some text to show"; return mBinder; } public IBinder asBinder() { return mBinder; } @Override public boolean onUnbind(Intent intent) { return super.onUnbind(intent); }} 

И последняя часть, манифест. Вам необходимо зарегистрировать услугу, а трансляция

 <receiver android:name="com.android.ussdcodes.BootReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> /intent-filter> </receiver> <service android:name=".USSDDumbExtendedNetworkService" > <intent-filter android:icon="@drawable/ic_launcher"> <action android:name="com.android.ussd.IExtendedNetworkService" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service>