Назовите (и получите ответ) USSD-код, в фоновом режиме? - PullRequest
16 голосов
/ 16 ноября 2010

Я хочу написать виджет, отображающий баланс предоплаты пользователей, оставшиеся данные и т. Д.

Я подумываю об автоматическом вызове кода USSD, который возвращает эти данные (нужно будет указать регулярное выражение длякаждая сеть), с интервалами (не часто, чтобы сэкономить батарею).Это должно быть сделано в фоновом режиме.В настоящее время у меня есть приложение, которое запускает код ussd и возвращает результат, поэтому я думаю, что это возможно, но я не уверен, как это будет сделано в фоновом режиме.

Я виделнамерения для вызова номера, но я не уверен, как получить результат, и я также думаю, что это намерение приведет к тому, что экран вызова выйдет на передний план?

Другой вариант:чтобы получить данные путем скрининга результатов с веб-сайта оператора /, возможно, wap-сайта, но это приведет к потере данных для пользователя, поэтому я бы предпочел решение с использованием кода USSD.

Заранее спасибо залюбая помощь - только начал работать над пониманием Android сегодня, так что получил довольно много, чтобы узнать :))

Ответы [ 6 ]

14 голосов
/ 21 ноября 2010

USSD еще не поддерживается на Android. Для этого есть запрос: http://code.google.com/p/android/issues/detail?id=1285

6 голосов
/ 23 февраля 2012

Вы можете использовать следующий код для вызова ussd-кодов на телефон Android, чтобы проверить баланс и т. Д. ......

   String s=calledittext.getText.toString();//calledittext is editText on the 
  //screen   from  which  can get the number
          if((s.startsWith("*"))&&(s.endsWith("#"))){
            //if true then it is a USSD call----
            callstring=s.substring(0, s.length()-1);
            callstring=callstring+Uri.encode("#");

    Log.d("CALL TYPE---------->", "USSD CALL"); 
        }else{
            callstring=s;   
    Log.d("CALL TYPE---------->", "Not a USSD CALL");   
    //Intent i=new Intent(android.content.Intent.ACTION_CALL,Uri.parse("tel:"+output.getText().toString()));
    //startActivity(i);
        }
    Intent i=new Intent(android.content.Intent.ACTION_CALL,Uri.parse("tel:"+callstring));
    startActivity(i);
5 голосов
/ 06 января 2017

Вы можете отправить USSD-код по указанному ниже коду, а также вам нужно добавить разрешение (Это должно быть разрешение во время выполнения после обновления Marshmallow)

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

    String code = "*" + Uri.encode("#") + 456 + Uri.encode("#");
    startActivity(new Intent("android.intent.action.CALL", Uri.parse("tel:" + code)));

И вы можете читать USSD-коды с помощью AccessibilityService

Вот пример:

Служба:

public class USSDService extends AccessibilityService {
    private static final String TAG = "USSDService";

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        Log.d(TAG, "onAccessibilityEvent");
        String text = event.getText().toString();
        Log.d(TAG, text);
        }
    }

    @Override
    public void onInterrupt() {

    }

    @Override
    protected void onServiceConnected() {
        super.onServiceConnected();
        Log.d(TAG, "onServiceConnected");
        AccessibilityServiceInfo info = new AccessibilityServiceInfo();
        info.flags = AccessibilityServiceInfo.DEFAULT;
        info.packageNames = new String[]{"com.android.phone"};
        info.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
        info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
        setServiceInfo(info);
    }
}

AndroidManifest.xml:

<service android:name=".services.USSDService"
                android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService" />
    </intent-filter>
    <meta-data android:name="android.accessibilityservice"
                    android:resource="@xml/config_service" /> // created below
</service>

res / xml / config_service.xml:

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFeedbackType="feedbackSpoken"
    android:accessibilityFlags="flagDefault"
    android:canRetrieveWindowContent="true"
    android:description="@string/accessibility_description"
    android:notificationTimeout="100"
    android:packageNames="com.cootf.sims"
    android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity" />

Запустите код -> Включить доступ через Настройки -> Специальные возможности -> [Имя вашего приложения] -> Включить.Работа выполнена!

5 голосов
/ 20 апреля 2012

Я не совсем уверен, но я думаю, что USSD еще не поддерживается на Android, однако вы можете попробовать этот обходной путь:

startActivity(new Intent("android.intent.action.CALL",Uri.parse("tel:*123" + Uri.encode("#")));
1 голос
/ 01 декабря 2018

Android O (уровень API 26) добавляет метод sendUssdRequest к TelephonyManager, который также включает обратный вызов для получения результата запроса.

Документы .

1 голос
/ 28 мая 2015

USSD вызов Android

пока не поддерживается
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...