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

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

enter image description here

Ответ 1

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

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

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

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

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

Давайте войдем в него.

Во-первых, приемник, это легкая часть. Мы создаем файл 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>