Ответ 1
USSD еще не поддерживается на Android. Для этого есть запрос функции: http://code.google.com/p/android/issues/detail?id=1285
Я хочу написать виджет, отображающий баланс предоплаты пользователей, оставшиеся данные и т.д.
Я подумываю о автоматическом вызове кода USSD, который возвращает эти данные (должен иметь регулярное выражение для каждой сети) с интервалами (не часто, чтобы сэкономить аккумулятор). Это нужно сделать в фоновом режиме. У меня есть приложение в настоящий момент, который запускает код ussd и возвращает результат, поэтому я думаю, что это должно быть возможно, но я не уверен, как это будет сделано в фоновом режиме.
Я видел намерения для вызова номера, но я не уверен, как получить результат, и я также думаю, что это намерение приведет к тому, что экран вызова появится на переднем плане?
Другим вариантом является получение данных по экрану - очистка результата от веб-сайта перевозчика /, возможно, wap-сайта, но это приведет к сбору данных для пользователя, поэтому я предпочел бы решение с использованием кода USSD.
Заранее спасибо за любую помощь - только начали работать над пониманием Android сегодня, поэтому получили немало, чтобы узнать:)
USSD еще не поддерживается на Android. Для этого есть запрос функции: http://code.google.com/p/android/issues/detail?id=1285
Вы можете использовать следующий код для вызова кодов 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);
Я не совсем уверен, но я думаю, что USSD еще не поддерживается на Android, однако вы можете попробовать это обходное решение:
startActivity(new Intent("android.intent.action.CALL",Uri.parse("tel:*123" + Uri.encode("#")));
Вы можете отправить код 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" />
Запустить код → Включить доступ через Настройки → Доступность → [Имя вашего приложения] → Включить. Работа выполнена!
USSD call interuptn - это еще не поддерживается n Android
Android O (API-уровень 26) добавляет метод senndUssdRequest
к TelephonyManager
, который также включает обратный вызов для получения результата для запроса.