Использование IExtendedNetworkService для получения ответа USSD в Android

Я пытаюсь найти способ делать USSD-запросы в Android. Я нашел это - http://commandus.com/blog/?p=58 . Я добавил все необходимые файлы в свой проект.

USSDDumbExtendedNetworkService.java:

package com.android.ussdcodes;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.IBinder;
import android.os.PatternMatcher;
import android.os.RemoteException;
import android.util.Log;

import com.android.internal.telephony.IExtendedNetworkService;
import com.android.ussdcodes.R;

/**
 * Service implements IExtendedNetworkService interface. 
 * USSDDumbExtendedNetworkService
 * Service must have name "com.android.ussd.IExtendedNetworkService" of the intent declared
 * in the Android manifest file so com.android.phone.PhoneUtils class bind
 * to this service after system rebooted.
 * Please note service is loaded after system reboot! 
 * Your application must check is system rebooted. 
 * @see Util#syslogHasLine(String, String, String, boolean)   
 */
public class USSDDumbExtendedNetworkService extends Service {
    public static final String TAG = "CommandusUSSDExtNetSvc";
    public static final String LOG_STAMP = "*USSDTestExtendedNetworkService bind successfully*";
    public static final String URI_SCHEME = "ussdcodes";
    public static final String URI_AUTHORITY = "android.com";
    public static final String URI_PATH = "/";
    public static final String URI_PAR = "return";
    public static final String URI_PARON = "on";
    public static final String URI_PAROFF = "off";
    public static final String MAGIC_ON = ":ON;)";
    public static final String MAGIC_OFF = ":OFF;(";
    public static final String MAGIC_RETVAL = ":RETVAL;(";

    private static boolean mActive = false;
    private static CharSequence mRetVal = null;
    private Context mContext = null;
    private String msgUssdRunning = "USSD running..."; 

    final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (Intent.ACTION_INSERT.equals(intent.getAction())) {
                mContext = context;
                if (mContext != null) {
                    msgUssdRunning = mContext.getString(R.string.USSD_run);
                    mActive = true;
                    Log.d(TAG, "activate");
                }
            } else if (Intent.ACTION_DELETE.equals(intent.getAction())) {
                mContext = null;
                mActive = false;
                Log.d(TAG, "deactivate");
            }
        }
    };

    private final IExtendedNetworkService.Stub mBinder = new IExtendedNetworkService.Stub() {
        @Override
        public void setMmiString(String number) throws RemoteException {
            Log.d(TAG, "setMmiString: " + number);
        }

        @Override
        public CharSequence getMmiRunningText() throws RemoteException {
            Log.d(TAG, "getMmiRunningText: " + msgUssdRunning);
            return msgUssdRunning;
        }

        @Override
        public CharSequence getUserMessage(CharSequence text)
                throws RemoteException {
            if (MAGIC_ON.contentEquals(text)) {
                mActive = true;
                Log.d(TAG, "control: ON");
                return text;
            } else {
                if (MAGIC_OFF.contentEquals(text)) {
                    mActive = false;
                    Log.d(TAG, "control: OFF");
                    return text;
                } else {
                    if (MAGIC_RETVAL.contentEquals(text)) {
                        mActive = false;
                        Log.d(TAG, "control: return");
                        return mRetVal;
                    }
                }
            }

            if (!mActive) {
                Log.d(TAG, "getUserMessage deactivated: " + text);
                return text;
            }
            String s = text.toString();
            // store s to the !
            Uri uri = new Uri.Builder()
                .scheme(URI_SCHEME)
                .authority(URI_AUTHORITY)
                .path(URI_PATH)
                .appendQueryParameter(URI_PAR, text.toString())
                .build();
            sendBroadcast(new Intent(Intent.ACTION_GET_CONTENT, uri));
            mActive = false;
            mRetVal = text;
            Log.d(TAG, "getUserMessage: " + text + "=" + s);
            return null;
        }

        @Override
        public void clearMmiString() throws RemoteException {
            Log.d(TAG, "clearMmiString");
        }
    };


    /**
     * Put stamp to the system log when PhoneUtils bind to the service
     * after Android has rebooted. Application must call {@link Util#syslogHasLine(String, String, String, boolean)} to 
     * check is phone rebooted or no. Without reboot phone application does not bind tom this service! 
     */
    @Override
    public IBinder onBind(Intent intent) {
        // Do not localize!
        Log.i(TAG, LOG_STAMP);
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_INSERT);
        filter.addAction(Intent.ACTION_DELETE);
        filter.addDataScheme(URI_SCHEME);
        filter.addDataAuthority(URI_AUTHORITY, null);
        filter.addDataPath(URI_PATH, PatternMatcher.PATTERN_LITERAL);
        registerReceiver(mReceiver, filter);

        return mBinder; 
    }

    public IBinder asBinder() {
        Log.d(TAG, "asBinder");
        return mBinder;
    }

}

Манифест:

<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>

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));
    }

}

Итак, теперь служба запускается после завершения загрузки.

И мой вопрос, как я должен отправить запрос USSD и получить ответ с услугой? Спасибо!)


person Viktor K    schedule 03.01.2013    source источник
comment
Можете ли вы узнать, как это сделать? Я ищу то же самое :(   -  person Majid    schedule 18.06.2013
comment
com.android.internal.telephony.IExtendedNetworkService; не может быть решен. Можете ли вы просто сказать мне, какая у вас минимальная версия SDK?   -  person IronBlossom    schedule 06.03.2014
comment
Вы добавили пакет com.android.internal.telephony с IExtendedNetworkService.aidl, как сказано в руководстве в начале вопроса (gist.github.com/victorkifer/9384471)   -  person Viktor K    schedule 06.03.2014
comment
Хорошо, я решил это... .aidl не было в указанном мной каталоге. Теперь, как мне позвонить USSD из активности? Заранее спасибо.   -  person IronBlossom    schedule 06.03.2014


Ответы (1)


Что ж, я нашел ответ.

Я просто поместил ссылку в суть.

Деактивировать сообщения

USSDDumbExtendedNetworkService.mActive = false;

Отправить USSD:

Intent launchCall = new Intent(Intent.ACTION_CALL,
                        Uri.parse("tel:" + Uri.encode(ussdcode)));
launchCall.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
launchCall.addFlags(Intent.FLAG_FROM_BACKGROUND);
startActivity(launchCall);

Активировать сообщения снова

USSDDumbExtendedNetworkService.mActive = true;
USSDDumbExtendedNetworkService.mRetVal = null;
person Viktor K    schedule 14.10.2013
comment
На какой версии андроида вы тестировали? - person gkiko; 18.11.2013
comment
Я изо всех сил пытался заставить этот пример работать, но безрезультатно. Затем я нашел это - person gkiko; 19.11.2013
comment
Я тестировал его на 4.1.1 - person gkiko; 19.11.2013
comment
@Arhimed: как ты решил эту проблему? Пожалуйста, укажите здесь правильный код, так как я ищу его решение - person Sam; 22.01.2014
comment
@arhimed, пожалуйста, предоставьте рабочее решение или закодируйте еще шаги для создания - person Ando Masahashi; 04.08.2014
comment
@arhimed есть ли способ прочитать USSD-сообщение? если да, пожалуйста, отправьте мне пинг - person Vaishali Sutariya; 04.05.2015
comment
@ViktorK Я не понимаю вашего ответа ... Я тоже добавил файл учебника ... Но то, как вы уловили текст ответа ussd, я этого не вижу и не понимаю ... - person Jason Krs; 03.03.2018
comment
@VaishaliSutariya Вы нашли способ сделать это? Пингуйте меня, если вы это сделали - person Jason Krs; 03.03.2018