Search code examples
androidandroid-asynctasksmstelephonyandroid-broadcast

How to check user entered own phone number in EditText?


Mobile number will be entered in an edittext by user on registration page in my Android application. How can I check that user entered his/her mobile number not other's ?

I've tried this :

TelephonyManager tMgr =(TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
  mPhoneNumber = tMgr.getLine1Number();

And compare this variable with edittext's text. But mPhoneNumber returns NULL in my case. Is there any other options? How to solve this ?

Any help would be appreciable.

I have tried this : Check source code :

     public class MainActivity extends Activity{    

    Button submit;
    EditText contact;
    String phNo;
    ProgressDialog progress;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        contact = (EditText)findViewById(R.id.mobileNumber);
        submit = (Button) findViewById(R.id.button1);

        submit.setOnClickListener(new OnClickListener()
        {
                public void onClick(View v)
                {
                    phNo = contact.getText().toString();
                    new CheckOwnMobileNumber().execute();
                    Toast.makeText(getApplicationContext(), phNo, Toast.LENGTH_LONG).show();
                }
        });



    }

    private class CheckOwnMobileNumber extends AsyncTask<String, Void, String>
    {
        @Override
        protected void onPostExecute(String result)
        {
            // TODO Auto-generated method stub
            if(progress.isShowing())
            {
                progress.dismiss();
                // Check SMS Received or not after that open dialog date
                /*if(SMSReceiver.str.equals(phNo))
                {
                    Toast.makeText(getApplicationContext(), "Thanks for providing your number.", Toast.LENGTH_LONG).show();
                }
                else
                {
                    Toast.makeText(getApplicationContext(), "Provide your own mobile number please.", Toast.LENGTH_LONG).show();
                    return;
                }*/

            }
        }

        @Override
        protected String doInBackground(String... params)
        {
            // TODO Auto-generated method stub
            String msg = phNo;
            try
            {
                sendSMS(phNo, msg);
            }
            catch(Exception ex)
            {
                Log.v("Exception :", ""+ex);
            }
            return null;
        }

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            progress = ProgressDialog.show(MainActivity.this, "","Checking Mobile Number...");
            progress.setIndeterminate(true);
            progress.getWindow().setLayout(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
            super.onPreExecute();
        }

}

    private void sendSMS(String phoneNumber, String message)
        {        
            //PendingIntent pi = PendingIntent.getActivity(getApplicationContext(), 0, new Intent(getApplicationContext(), MainActivity.class), 0);                
            SmsManager sms = SmsManager.getDefault();
            sms.sendTextMessage(phoneNumber, null, message, null, null);        
        }
}

Receiver to listen SMS received or not ?

public class SMSReceiver extends BroadcastReceiver
{
private static final String ACTION_SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
Context mContext;
private Intent mIntent;
static String address, str = null;

// Retrieve SMS
public void onReceive(Context context, Intent intent) {
    mContext = context;
    mIntent = intent;

    String action = intent.getAction();

    if(action.equals(ACTION_SMS_RECEIVED))
    {
        SmsMessage[] msgs = getMessagesFromIntent(mIntent);
        if (msgs != null)
        {
            for (int i = 0; i < msgs.length; i++)
            {
                address = msgs[i].getOriginatingAddress();
                str = msgs[i].getMessageBody().toString();
            }
        }   

        // ---send a broadcast intent to update the SMS received in the
        // activity---
        Intent broadcastIntent = new Intent();
        broadcastIntent.setAction("SMS_RECEIVED_ACTION");
        broadcastIntent.putExtra("sms", str);
        context.sendBroadcast(broadcastIntent);
    }

}

public static SmsMessage[] getMessagesFromIntent(Intent intent)
{
    Object[] messages = (Object[]) intent.getSerializableExtra("pdus");
    byte[][] pduObjs = new byte[messages.length][];

    for (int i = 0; i < messages.length; i++)
    {
        pduObjs[i] = (byte[]) messages[i];
    }

    byte[][] pdus = new byte[pduObjs.length][];
    int pduCount = pdus.length;
    SmsMessage[] msgs = new SmsMessage[pduCount];
    for (int i = 0; i < pduCount; i++)
    {
        pdus[i] = pduObjs[i];
        msgs[i] = SmsMessage.createFromPdu(pdus[i]);
    }
    return msgs;
}
}

LOGCAT :

03-13 17:31:02.049: E/ActivityManager(161): ANR in com.example.test
03-13 17:31:02.049: E/ActivityManager(161): Reason: Broadcast of Intent { act=android.provider.Telephony.SMS_RECEIVED cmp=com.example.test/.SMSReceiver (has extras) }
03-13 17:31:02.049: E/ActivityManager(161):   54% 3732/com.example.test: 54% user + 0% kernel / faults: 21 minor
03-13 17:31:02.049: E/ActivityManager(161):   40% 3732/com.example.test: 40% user + 0% kernel / faults: 2 minor
03-13 17:31:30.699: I/ActivityManager(161): Killing com.example.test (pid=3732): user's request
03-13 17:31:30.799: I/ActivityManager(161): Process com.example.test (pid 3732) has died.
03-13 17:31:30.799: I/WindowManager(161): WIN DEATH: Window{40992f50 com.example.test/com.example.test.MainActivity paused=false}
03-13 17:31:30.819: E/InputDispatcher(161): channel '40818670 com.example.test/com.example.test.MainActivity (server)' ~ Consumer closed input channel or an error occurred.  events=0x8
03-13 17:31:30.819: E/InputDispatcher(161): channel '40818670 com.example.test/com.example.test.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
03-13 17:34:59.649: I/ActivityManager(161): Start proc com.example.test for broadcast com.example.test/.SMSReceiver: pid=4037 uid=10098 gids={}

Solution

  • I solved it my self. Here is my working code. MainActivity Class :

       public class MainActivity extends Activity
    {    
        Button submit;
        EditText contact;
        static String phNo;
        ProgressDialog progress;
        static Boolean wasMyOwnNumber;
        static Boolean workDone;
        final static int SMS_ROUNDTRIP_TIMOUT = 30000;
    
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            contact = (EditText)findViewById(R.id.mobileNumber);
            submit = (Button) findViewById(R.id.button1);
            wasMyOwnNumber = false;
            workDone = false;
            submit.setOnClickListener(new OnClickListener()
            {
                    public void onClick(View v)
                    {
                        phNo = contact.getText().toString();
                        new CheckOwnMobileNumber().execute();
                    }
            });
        }
    
        private class CheckOwnMobileNumber extends AsyncTask<String, Void, String>
        {
            @Override
            protected void onPostExecute(String result)
            {
                // TODO Auto-generated method stub
                if(progress.isShowing())
                {
                    progress.dismiss();
                    if(wasMyOwnNumber)
                    {
                        Toast.makeText(getApplicationContext(), "Number matched.", Toast.LENGTH_LONG).show();
                        wasMyOwnNumber = false;
                        workDone = false;
                    }
                    else
                    {
                        Toast.makeText(getApplicationContext(), "Wrong number.", Toast.LENGTH_LONG).show();
                        wasMyOwnNumber = false;
                        workDone = false;
                        return;
                    }
                }
                super.onPostExecute(result);
            }
    
            @Override
            protected String doInBackground(String... params)
            {
                // TODO Auto-generated method stub
                String msg = phNo;
                try
                {
                    SmsManager sms = SmsManager.getDefault();
                    sms.sendTextMessage(phNo, null, msg, null, null);
                    timeout();
                }
                catch(Exception ex)
                {
                    Log.v("Exception :", ""+ex);
                }
                return null;
            }
    
            @Override
            protected void onPreExecute() 
            {
                // TODO Auto-generated method stub
                progress = ProgressDialog.show(MainActivity.this, "","Checking Mobile Number...");
                progress.setIndeterminate(true);
                progress.getWindow().setLayout(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
                super.onPreExecute();
            }
        }
    
        private boolean timeout()
        {
               int waited = 0;
               while (waited < SMS_ROUNDTRIP_TIMOUT)
               {
                  try
                  {
                    Thread.sleep(100);
                  }
                  catch (InterruptedException e)
                  {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                  }
                  waited += 100;
                  if(phoneNumberConfirmationReceived())
                  {
                      waited=SMS_ROUNDTRIP_TIMOUT;
                      workDone = true;
                  }
               }
               /*Log.v("MainActivity:timeout2: Waited: " , ""+waited);
               Log.v("MainActivity:timeout2:Comparision: ", ""+ phoneNumberConfirmationReceived());
               Log.v("MainActivity:timeout2: WorkDone value after wait complete : ", ""+workDone);*/
            return workDone;
        }
    
        private boolean phoneNumberConfirmationReceived()
        {
            if(wasMyOwnNumber)
            {
                workDone = true;
            }
            return workDone;
        }
    }
    

    SMSReceiver Code :

     public class SMSReceiver extends BroadcastReceiver
    {
        private static final String ACTION_SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
        Context mContext;
        private Intent mIntent;
        static String address, str = null;
        boolean isSame;
    
        // Retrieve SMS
        public void onReceive(Context context, Intent intent)
        {
            mContext = context;
            mIntent = intent;
            String action = intent.getAction();
            if(action.equals(ACTION_SMS_RECEIVED))
            {
                SmsMessage[] msgs = getMessagesFromIntent(mIntent);
                if (msgs != null)
                {
                    for (int i = 0; i < msgs.length; i++)
                    {
                        address = msgs[i].getOriginatingAddress();
                        str = msgs[i].getMessageBody().toString();
                    }
                }
                Log.v("Originating Address : Sender :", ""+address);
                Log.v("Message from sender :", ""+str);
                isSame = PhoneNumberUtils.compare(str, MainActivity.phNo);
                Log.v("Comparison :", "Yes this true. "+isSame);
                if(isSame)
                {
                     MainActivity.wasMyOwnNumber = isSame;
                     MainActivity.workDone=true;
                }
    
                // ---send a broadcast intent to update the SMS received in the
                // activity---
                Intent broadcastIntent = new Intent();
                broadcastIntent.setAction("SMS_RECEIVED_ACTION");
                broadcastIntent.putExtra("sms", str);
                context.sendBroadcast(broadcastIntent);
            }
        }
    
        public static SmsMessage[] getMessagesFromIntent(Intent intent)
        {
            Object[] messages = (Object[]) intent.getSerializableExtra("pdus");
            byte[][] pduObjs = new byte[messages.length][];
    
            for (int i = 0; i < messages.length; i++)
            {
                pduObjs[i] = (byte[]) messages[i];
            }
    
            byte[][] pdus = new byte[pduObjs.length][];
            int pduCount = pdus.length;
            SmsMessage[] msgs = new SmsMessage[pduCount];
            for (int i = 0; i < pduCount; i++)
            {
                pdus[i] = pduObjs[i];
                msgs[i] = SmsMessage.createFromPdu(pdus[i]);
            }
            return msgs;
        }
    }
    

    No ANR found.