0

Here i'm calling USSD code and then i'm trying to read that corresponding response by extending AccessibilityService. This process is working fine. But my problem is when i'm trying to transfer that corresponding data (or value) using LocalBroadCast Manager to activity say(MainActivity.java) BroadcastReceiver not even being called.

Can anyone help me to transfer data using LocalBroadcastManager to activity ?

Please find my java classes below.

MainActivity.java

public class MainActivity extends AppCompatActivity {

EditText edt_ussd;
String callstring = "";
Button btn_call;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    edt_ussd = (EditText) findViewById(R.id.editText);
    btn_call = (Button) findViewById(R.id.btn_call);
    btn_call.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startService(new Intent(MainActivity.this, UssdDemo.class));
            call_Ussd(edt_ussd.getText().toString().trim());
        }
    });

    LocalBroadcastManager.getInstance(MainActivity.this).registerReceiver(mMsgReceiver,
            new IntentFilter("test_ussd.twinkletech.org.ussd_test.LBroadCst"));

}


public void call_Ussd(String ussd) {

    String s = edt_ussd.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");
        System.out.println("==== output  :  " + callstring);

    } else {
        callstring = s;
        Log.d("CALL TYPE---------->", "Not a USSD CALL");
    }

    System.out.println("==== callstring  :  " + callstring);
    Intent i = new Intent(android.content.Intent.ACTION_CALL, Uri.parse("tel:" + callstring));
    startActivity(i);
}




@Override
protected void onResume() {
    super.onResume();

    System.out.println("--Coming inside onResume--");
    LocalBroadcastManager.getInstance(MainActivity.this).registerReceiver(mMsgReceiver, new IntentFilter("test_ussd.twinkletech.org.ussd_test.LBroadCst"));
}

@Override
protected void onPause() {
    super.onPause();
    System.out.println("--Coming inside onPause--");
    LocalBroadcastManager.getInstance(MainActivity.this).unregisterReceiver(mMsgReceiver);

}

private BroadcastReceiver mMsgReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

        System.out.println("-->> Msg  received  from LOCAL broadcast receiver MainActivity  >>>>>>>>>>");

        System.out.println("-->> Get actiion : "+intent.getAction());

        System.out.println("-->> Intent value : "+intent.getStringExtra("response_msg"));

    }
} ;

@Override
protected void onDestroy() {
    super.onDestroy();
    // Unregister since the activity is about to be closed
    LocalBroadcastManager.getInstance(MainActivity.this).unregisterReceiver(mMsgReceiver);

}
}

UssdDemo.java

public class UssdDemo extends AccessibilityService {

public static String TAG = "UssdDemo";

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {

    System.out.println("<<< onAccessbltyEvent");
    String text = event.getText().toString();
    System.out.println("<<< --- :  " + text);

    if (event.getClassName().equals("android.app.AlertDialog")) {
        performGlobalAction(GLOBAL_ACTION_BACK);
        System.out.println("<<< Return value : " + text);
        Intent intent = new Intent();
        intent.setAction("test_ussd.twinkletech.org.ussd_test.LBroadCst");
        intent.putExtra("response_msg", text);

        // write a broad cast receiver and call sendbroadcast() from here, if you want to parse the message for balance, date
            LocalBroadcastManager.getInstance(UssdDemo.this).sendBroadcast(intent);
    }
}

@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);
}}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="test_ussd.twinkletech.org.ussd_test.MainActivity"
tools:showIn="@layout/activity_main">

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center|top">



<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
android:orientation="vertical"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
    >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="5dp"
        android:text="Enter USSD code"
        android:textSize="30sp"
        android:layout_marginTop="10dp"
        android:gravity="center"
        android:textStyle="bold"
        android:textColor="@color/colorPrimary"
        android:shadowColor="#806A6A"
        android:shadowDx="7"
        android:shadowDy="7"
        android:shadowRadius="10"
        android:layout_marginBottom="20dp"
        />

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="10dp"
        android:paddingLeft="5dp"
        android:paddingBottom="10dp"
        android:layout_marginTop="30dp"
        android:hint="ussd code"
        android:inputType="phone" />

    <Button
        android:id="@+id/btn_call"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="@color/colorPrimary"
        android:text="CALL"
        android:layout_marginTop="10dp"
        android:textColor="@android:color/white"
        />



    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center|left"
        android:layout_marginTop="20dp">
    <TextView

        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="RESPONSE : "
        android:textSize="16dp"
        android:textColor="@color/colorPrimaryDark"
        android:textStyle="bold"

        />

        <TextView
            android:id="@+id/txt_talkBal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:textColor="@android:color/black"
            android:text=""
            />

    </LinearLayout>

</LinearLayout>

</ScrollView></LinearLayout>

Manifest.xml

<service android:name=".UssdDemo"
        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" />


    </service>
manick k
  • 25
  • 10
  • @MikeM. can u plz tell me if you have any other idea to overcome this issue? – manick k Apr 07 '16 at 13:47
  • @MikeM. But when im calling ussd i cant able to use startActivityForResult() instead startActivity(intent) – manick k Apr 07 '16 at 14:32
  • @MikeM. I think we cant able to do startActivityForResult(intent); when we are calling android.content.Intent.ACTION_CALL – manick k Apr 07 '16 at 14:36
  • yes, when i'm using startActivityForResult() its not taking – manick k Apr 07 '16 at 14:52
  • in MainActivity.java class there is one method called "call_ussd", in that method im calling Intent i = new Intent(android.content.Intent.ACTION_CALL, Uri.parse("tel:" + callstring)); startActivity(i); here i can't able to use startActivityForResult() instead startAcitivity(); – manick k Apr 07 '16 at 14:58
  • but im my case its not taking that method..its just asking me to create that one as a new method, i dont know why – manick k Apr 07 '16 at 15:08
  • actually, if i gave like how did u say startActivityForResult(intent,0);, the onActivityResult will be called too early before that ussd alert gets closed – manick k Apr 07 '16 at 15:17
  • @MikeM. any other solutions? – manick k Apr 07 '16 at 15:31

1 Answers1

0

Just register and unregister your BroadcastReceiver in OnResume() and OnPause() lifecycles of the activity.No need to register and unregister in OnCreate() and OnDestroy().Also check for Action in BroadcastReciver's onReceive() like

if(intent.getAction().equals("your action")){
      //do something for that action
   }

Also check whether the sendBroadcast is called in your service.

Ravi Theja
  • 3,371
  • 1
  • 22
  • 34