title: Prevent USSD dialog and read USSD response?
body: <p>i did many research about ussd but I can't read USSD respone and how can I prevent ussd dialog like this application.</p>
  
  <p><a href="https://play.google.com/store/apps/details?id=com.iba.ussdchecker&amp;hl=en" rel="noreferrer">https://play.google.com/store/apps/details?id=com.iba.ussdchecker&amp;hl=en</a></p>
  
  <p>i install this <a href="https://github.com/alaasalman/ussdinterceptor" rel="noreferrer">https://github.com/alaasalman/ussdinterceptor</a> restart my phone (S2 android 4.0.3), send ussd code but nothing happen, someone tell me that I have to read the log, but how can i do that.</p>
  
  <p>i try these code to read USSD from log</p>
  
  <p>USSD.java</p>
  
  <pre><code>    package com.example.ussd;
  
      import java.io.BufferedReader;
      import java.io.IOException;
      import java.io.InputStreamReader;
      import java.util.Calendar;
      import java.util.Date;
      import java.text.ParseException;
      import java.text.SimpleDateFormat;
  
      import android.util.Log;
  
      public class USSD {
  
          private static String startmsg = "displayMMIComplete"; // start msg to look
                                                                  // for
          private static String endmsg = "MMI code has finished running"; // stop msg
          private static String trimmsg = "- using text from MMI message: '"; // a msg
                                                                              // to
                                                                              // remove
                                                                              // from
                                                                              // the
                                                                              // text
  
          private long before = 3000; // delay (ms) before creation of the class
                                      // before a msg (USDD) is valid (use timestamp)
          private long after = 3000; // delay (ms) after creation of the class that a
                                      // msg (USDD) is valid (wait after ms)
  
          private String msg = ""; // the USSD message
          private boolean found = false;
          private long t = -1; // timestamp of the found log
  
          public USSD() {
              this(3000, 3000);
          }
  
          // USSD in log : example
          public USSD(long before_creation, long after_creation) {
              before = before_creation;
              after = after_creation;
              long timestamp = System.currentTimeMillis(); // creation of the class
                                                              // --&gt; look for the USSD
                                                              // msg in the logs
              Log.d("USSDClass",
                      "Class creation - timestamp: " + String.valueOf(timestamp));
              try {
                  // sample code taken from alogcat ...
                  Process logcatProc = Runtime.getRuntime().exec(
                          "logcat -v time -b main PhoneUtils:D"); // get PhoneUtils
                                                                  // debug log with
                                                                  // time information
                  BufferedReader mReader = new BufferedReader(new InputStreamReader(
                          logcatProc.getInputStream()), 1024);
                  String line = "";
                  boolean tostop = false;
                  long stop = timestamp + after; // to stop the while after "after" ms
                  while (((line = mReader.readLine()) != null)
                          &amp;&amp; (System.currentTimeMillis() &lt; stop) &amp;&amp; (tostop == false)) {
                      if (line.length() &gt; 19) // the line should be at least with a
                                              // length of a timestamp (19) !
                      {
                          if (line.contains(startmsg)) // check if it is a USSD msg
                          {
                              // log example :
                              // "12-10 20:36:39.321 D/PhoneUtils(  178): displayMMIComplete: state=COMPLETE"
                              t = extracttimestamp(line); // extract the timestamp of
                                                          // thie msg
                              Log.d("USSDClass", "Found line at timestamp : "
                                      + String.valueOf(t));
                              if (t &gt;= timestamp - before)
                                  found = true; // start of an USDD is found &amp; is
                                                  // recent !
                          } else if (found) {
                              // log example :
                              // "12-10 20:36:39.321 D/PhoneUtils(  178): displayMMIComplete: state=COMPLETE"
                              if (line.contains(endmsg))
                                  tostop = true;
                              else {
                                  // log example :
                                  // "12-10 20:36:39.321 D/PhoneUtils(  178): - using text from MMI message: 'Your USSD message with one or several lines"
                                  Log.d("USSDClass", "Line content : " + line);
                                  String[] v = line.split("\\): "); // doesn't need
                                                                      // log
                                                                      // information
                                                                      // --&gt; split
                                                                      // with "): "
                                                                      // separator
                                  if (v.length &gt; 1)
                                      msg += v[1].replace(trimmsg, "").trim() + "\n";
  
                              }
                          }
                      }
                  }
              } catch (IOException e) {
                  Log.d("USSDClass", "Exception:" + e.toString());
              }
          }
  
          public boolean IsFound() {
              return found;
          }
  
          public String getMsg() {
              return msg;
          }
  
          // extract timestamp from a log line with format
          // "MM-dd HH:mm:ss.ms Level/App:msg" Example : 12-10 20:36:39.321
          // Note : known bug : happy new year check will not work !!!
          private long extracttimestamp(String line) {
              long timestamp = -1; // default value if no timestamp is found
              String[] v = line.split(" ");
              if (v.length &gt; 1) // check if there is space
              {
                  Calendar C = Calendar.getInstance();
                  int y = C.get(Calendar.YEAR);
                  String txt = v[0] + "-" + y + " " + v[1]; // transform in format
                                                              // "MM-dd-yyyy HH:mm:ss"
                  SimpleDateFormat formatter = new SimpleDateFormat(
                          "MM-dd-yyyy HH:mm:ss");
                  try {
                      Date tmp = formatter.parse(txt);
                      timestamp = tmp.getTime();
                      String[] ms = v[1].split("."); // get ms
                      if (ms.length &gt; 1)
                          timestamp += Integer.getInteger(ms[1]);
  
                  } catch (ParseException e) {
                      Log.d("USSDClass",
                              "USDD.extractimestamp exception:" + e.toString());
                  }
              }
              return timestamp;
  
          }
  
      }
  </code></pre>
  
  <p>UssdActivity.java</p>
  
  <pre><code>package com.example.ussd;
  
  import android.app.Activity;
  import android.content.Intent;
  import android.net.Uri;
  import android.os.Bundle;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.widget.AutoCompleteTextView;
  import android.widget.Button;
  import android.widget.TextView;
  
  public class UssdActivity extends Activity implements OnClickListener {
      /** Called when the activity is first created. */
      private TextView view;
      private AutoCompleteTextView number;
  
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main);
          Button button = (Button) findViewById(R.id.button1);
          button.setOnClickListener(this);
          this.view = (TextView) findViewById(R.id.Text2);
          this.number = (AutoCompleteTextView) findViewById(R.id.Text1);
      }
  
      @Override
      public void onClick(View arg0) {
          String encodedHash = Uri.encode("#");
          call("*" + number.getText() + encodedHash);
          this.view.setText("");
      }
  
      protected void call(String phoneNumber) {
          try {
              startActivityForResult(
                      new Intent("android.intent.action.CALL", Uri.parse("tel:"
                              + phoneNumber)), 1);
          } catch (Exception eExcept) {
              this.view.append("\n\n " + "\n" + eExcept.toString());
          }
      }
  
      @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          USSD ussd = new USSD(4000, 4000);
          if (ussd.IsFound())
              this.view.append("\n test" + ussd.getMsg());
          else
              this.view.append("" + R.string.error_ussd_msg);
      }
  
  }
  </code></pre>
  
  <p>and output is something like this: </p>
  
  <pre><code>com.sec.android.app.callsetting.allcalls:com.sec.android.callsetting.allcalls.AllCallsProvider Terminated ALSA PLAYBACK device hifi
  </code></pre>