I Want to make a ussd extension that dial ussd, get Responce, and reply to it
The code is below:
package ussd.ext.kodular;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.AsyncTask;
import android.telephony.TelephonyManager;
import android.util.Log;
import com.google.appinventor.components.annotations.*;
import com.google.appinventor.components.common.ComponentCategory;
import com.google.appinventor.components.runtime.AndroidNonvisibleComponent;
import com.google.appinventor.components.runtime.ComponentContainer;
import com.google.appinventor.components.runtime.EventDispatcher;
@DesignerComponent(
version = 1,
description = "Perform Ussd Functions",
category = ComponentCategory.EXTENSION,
nonVisible = true,
iconName = "")
@SimpleObject(external = true)
public class UssdExt extends AndroidNonvisibleComponent {
//Activity and Context
private Context context;
private Activity activity;
public UssdExt(ComponentContainer container){
super(container.$form());
this.activity = container.$context();
this.context = container.$context();
}
@SimpleFunction(description = "Dial a USSD code and get the response")
public void dialUssdCode(final String ussdCode){
if (hasPermissions()) {
new AsyncTask<Void, Void, Void>() {
protected Void doInBackground(Void... params) {
try {
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
if (telephonyManager != null) {
telephonyManager.sendUssdRequest(ussdCode, new TelephonyManager.UssdResponseCallback() {
public void onReceiveUssdResponse(final CharSequence response) {
Log.d("USSD Response", response.toString());
// Trigger an event to pass the response back to the app
activity.runOnUiThread(new Runnable() {
public void run() {
UssdResponseReceived(response.toString());
}
});
}
public void onReceiveUssdResponseFailed(int failureCode) {
Log.d("USSD Response", "Failed with code: " + failureCode);
// Trigger an event to indicate the failure
UssdResponseFailed(failureCode);
}
}, null);
}
} catch (SecurityException e) {
e.printStackTrace();
}
return null;
}
}.execute();
} else {
Log.d("USSD Response", "Permissions not granted");
}
}
private boolean hasPermissions() {
return (activity.checkSelfPermission(android.Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED &&
activity.checkSelfPermission(android.Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED);
}
@SimpleEvent(description = "Event triggered when a USSD response is received")
public void UssdResponseReceived(String response){
EventDispatcher.dispatchEvent(this, "UssdResponseReceived", response);
}
@SimpleEvent(description = "Event triggered when a USSD request fails")
public void UssdResponseFailed(int errorCode){
EventDispatcher.dispatchEvent(this, "UssdResponseFailed", errorCode);
}
@SimpleFunction(description = "Reply to a USSD message")
public void replyToUssd(String message){
// Implement reply functionality here
}
}
But its not working. I dont know why. Can any one help me please?