Loved the tool? Please consider donating πΈ to help it improve!
Usage | Extra Features | Cordova Plugin | Contributors
Target Development High Quality:
Interactive with ussd windows, remember the USSD interfaces depends on the System Operative and the manufacturer of Android devices.
Add the following dependency in your app's build.gradle
configuration file:
Repository | implementation | Status |
---|---|---|
jcenter() | 'com.romellfudi.ussdlibrary:ussd-library:1.1.i' | DEPRECATED |
jcenter() | 'com.romellfudi.ussdlibrary:kotlin-ussd-library:1.1.k' | DEPRECATED |
maven { url https://jitpack.io } |
'com.github.romellfudi.VoIpUSSD:ussd-library:1.2.f' | READY |
maven { url https://jitpack.io } |
'com.github.romellfudi.VoIpUSSD:kotlin-ussd-library:1.2.f' | READY |
- Writing a config xml file from here
to res/xml
folder (if necessary), this config file allow to link between Application and System Oerative:
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
.../>
Puts dependencies on manifest, into manifest put CALL_PHONE, READ_PHONE_STATE and SYSTEM_ALERT_WINDOW:
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Add service:
java
<service
android:name="com.romellfudi.ussdlibrary.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/ussd_service" />
</service>
kotlin
<service
android:name="com.romellfudi.ussdlibrary.USSDServiceKT"
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/ussd_service" />
</service>
First you need an hashMap from detect witch USSD' response contains the login and error messages
KEY MESSAGE | String Messages |
---|---|
KEY_LOGIN | "espere","waiting","loading","esperando",... |
KEY_ERROR | "problema","problem","error","null",... |
map = new HashMap<>();
map.put("KEY_LOGIN",new HashSet<>(Arrays.asList("espere", "waiting", "loading", "esperando")));
map.put("KEY_ERROR",new HashSet<>(Arrays.asList("problema", "problem", "error", "null")));
map = HashMap()
map["KEY_LOGIN"] = HashSet(Arrays.asList("espere", "waiting", "loading", "esperando"))
map["KEY_ERROR"] = HashSet(Arrays.asList("problema", "problem", "error", "null"))
Instance an object ussController with context
USSDApi ussdApi = USSDController.getInstance(context);
ussdApi.callUSSDInvoke(phoneNumber, map, new USSDController.CallbackInvoke() {
@Override
public void responseInvoke(String message) {
// message has the response string data
String dataToSend = "data"// <- send "data" into USSD's input text
ussdApi.send(dataToSend,new USSDController.CallbackMessage(){
@Override
public void responseMessage(String message) {
// message has the response string data from USSD
}
});
}
@Override
public void over(String message) {
// message has the response string data from USSD or error
// response no have input text, NOT SEND ANY DATA
}
});
ussdApi.callUSSDOverlayInvoke(phoneNumber, map, object : USSDController.CallbackInvoke {
override fun responseInvoke(message: String) {
// message has the response string data
var dataToSend = "data"// <- send "data" into USSD's input text
ussdApi.send("1") { // it: response String
// message has the response string data from USSD
}
}
override fun over(message: String) {
// message has the response string data from USSD or error
// response no have input text, NOT SEND ANY DATA
}
})
if you need work with your custom messages, use this structure:
ussdApi.callUSSDInvoke(phoneNumber, map, new USSDController.CallbackInvoke() {
@Override
public void responseInvoke(String message) {
// first option list - select option 1
ussdApi.send("1",new USSDController.CallbackMessage(){
@Override
public void responseMessage(String message) {
// second option list - select option 1
ussdApi.send("1",new USSDController.CallbackMessage(){
@Override
public void responseMessage(String message) {
...
}
});
}
});
}
@Override
public void over(String message) {
// message has the response string data from USSD
// response no have input text, NOT SEND ANY DATA
}
...
});
ussdApi.callUSSDOverlayInvoke(phoneNumber, map, object : USSDController.CallbackInvoke {
override fun responseInvoke(message: String) {
// first option list - select option 1
ussdApi.send("1") { // it: response response
// second option list - select option 1
ussdApi.send("1") { // it: response message
...
}
}
}
override fun over(message: String) {
// message has the response string data from USSD
// response no have input text, NOT SEND ANY DATA
}
...
})
for dual sim support
ussdApi.callUSSDInvoke(phoneNumber, simSlot, map, new USSDController.CallbackInvoke() {
...
}
ussdApi.callUSSDOverlayInvoke(phoneNumber, simSlot, map, object : USSDController.CallbackInvoke {
...
}
In case use at android >= M, you could check previusly permissions, callInvoke
and callUSSDOverlayInvoke
methods check eneble too:
# check if accessibility permissions is enabled or not
ussdApi.verifyAccesibilityAccess(Activity)
# check if overlay permissions is enabled or not
ussdApi.verifyOverLay(Activity)
A huge problem working with ussd is you can not invisible, disenable, resize or put on back in progressDialog But now on Android O, Google allow build a nw kind permission from overlay widget, my solution was a widget call OverlayShowingService: For use need add permissions at AndroidManifest:
<uses-permission android:name="android.permission.ACTION_MANAGE_OVERLAY_PERMISSION" />
Using the library you could use two ways:
Add Broadcast Service:
<service android:name="com.romellfudi.ussdlibrary.SplashLoadingService"
android:exported="false" />
Invoke like a normal service:
svc = new Intent(activity, SplashLoadingService.class);
// show layout
getActivity().startService();
ussdApi.callUSSDOverlayInvoke(phoneNumber, simSlot, map, new USSDController.CallbackInvoke() {
...
// dismiss layout
getActivity().stopService(svc);
...
}
svc = Intent(activity, OverlayShowingService::class.java)
// show layout
activity.startService(svc)
ussdApi.callUSSDOverlayInvoke(phoneNumber, map, object : USSDController.CallbackInvoke {
...
// dismiss layout
activity.stopService(svc)
...
}
In this section leave the lines to call to Telcom (ussd number) for connected it:
ussdPhoneNumber = ussdPhoneNumber.replace("#", uri);
Uri uriPhone = Uri.parse("tel:" + ussdPhoneNumber);
context.startActivity(new Intent(Intent.ACTION_CALL, uriPhone));
ussdPhoneNumber = ussdPhoneNumber.replace("#", uri)
val uriPhone = Uri.parse("tel:$ussdPhoneNumber")
context.startActivity(Intent(Intent.ACTION_CALL, uri))
Once initialized the call will begin to receive and send the famous USSD windows
- cordova-plugin-VoIpUSSD - Ramy Mokako
Thanks goes to these wonderful people (emoji key):
Romell D.Z. η¦θΏͺ π» |
Abdullahi Yusuf π» |
Mohamed Hamdy Hasan π» |
Mohamed Daahir π» |
Ramy Mokako π |
Md Mafizur Rahman π» |
GameDealz is a Free Software: You can use, study share and improve it at your will. Specifically you can redistribute and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.