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

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

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

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

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

Для начала рассмотрим класс 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>