2010-11-16 4 views
16

Я хочу написать виджет, отображающий баланс предоплаты пользователей, оставшиеся данные и т. Д.Звоните (и получите ответ) код USSD, в фоновом режиме?

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

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

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

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

+0

На самом деле я даже не уверен. Если я могу позвонить из службы - я попытался создать намерение ACTION.CALL и отправить его с помощью startActivity(), но это заставляет силу закрыть, даже если я установил флаг FLAG_ACTIVITY_NEW_TASK , – Jords

+0

Глупо меня, Просто не было прав. Фактически он называет код USSD сейчас, но не в фоновом режиме. Я предполагаю, что вы не можете сделать андроид-вызов, не дожидаясь дозвона, отображающего его интерфейс - вам придется пойти с веб-вариантом, я думаю. – Jords

+0

Hi Jords, я вижу, что этот вопрос задавали 2 года назад, поэтому я надеюсь, что с тех пор все изменилось. Я пишу подобное приложение (как часть моего диплома). Не могли бы вы помочь мне с задачей USSD. Как и вам, мне нужно выполнить вызов USSD и получить результат (если возможно, в фоновом режиме) ... Я буду признателен, если вы поделитесь с ним некоторым рабочим кодом. Спасибо – vach

ответ

13

USSD пока не поддерживаются на Android. Существует запрос функция для него: http://code.google.com/p/android/issues/detail?id=1285

+0

Спасибо, это не совсем тот ответ, который я собирался, но, по крайней мере, отвечает на мой вопрос, и, надеюсь, он будет в Gingerbread. Я удивлен, что никогда не нашел этого из моих поисков! – Jords

+0

И у нас его еще нет – gkiko

+0

Посмотрите на ответ от Пикасо и Агарвала Шанкара, теперь это возможно – Musa

7

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

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

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

startActivity(new Intent("android.intent.action.CALL",Uri.parse("tel:*123" + Uri.encode("#"))); 
+4

и где вы получите ответ ? – Bellash

1

USSD вызов interuptn является не поддерживается п Android

5

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

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

Рез/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" /> 

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