Wie kann man die eingegebene eigene Telefonnummer in EditText überprüfen?

Mobile-Nummer wird in einem Edittext von Benutzer auf Registrierungsseite in meiner Android-Anwendung eingetragen. Wie kann ich überprüfen, dass der Benutzer seine Handy-Nummer nicht anders eingegeben hat?

Ich habe das versucht:

  • Einstellung der Systemzeit von ROOTED Telefon
  • Wie man EditText mit abgerundeten Ecken erstellt?
  • JVM-Unit-Test mit Mockito zum Testen von Retrofit2 und RxJava für Netzwerkanforderungen
  • Android 6.0 Marshmallow. Kann nicht auf SD-Karte schreiben
  • CookieSyncManager ist jetzt veraltet, was kann ich stattdessen verwenden?
  • Sortieransicht mit Arrayadapter sortieren
  • TelephonyManager tMgr =(TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE); mPhoneNumber = tMgr.getLine1Number(); 

    Und vergleiche diese Variable mit dem Text von edittext. Aber mPhoneNumber gibt NULL in meinem Fall zurück. Gibt es noch andere Optionen? Wie kann man das lösen?

    Jede Hilfe wäre spürbar.

    Ich habe das versucht: Quellcode überprüfen:

      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 zu hören SMS empfangen oder nicht?

     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={} 

  • XML ziehbar aus png und Overlay
  • Bilder mit: nopm: im Dateinamen
  • ActivityTestRule - wie man Code nennt, bevor Application onCreate
  • Was bedeutet Ellipse bedeuten in Android?
  • JQuery funktioniert nicht bei WebView
  • Google Maps V2 zeigt leeren Bildschirm auf Android 2.2
  • 5 Solutions collect form web for “Wie kann man die eingegebene eigene Telefonnummer in EditText überprüfen?”

    Es ist nicht garantiert, dass tMgr.getLine1Number(); Wird immer die Nummer Ihrer SIM-Karte zurückgeben. Denn es hängt von der Verfügbarkeit der Nummer auf der SIM-Karte ab. Wie in meinem Fall enthält meine Tre-Schweden SIM-Karte keine Telefonnummer.

    Aber wenn du die SIM-Karte in ein altes SonyEricsson oder Nokia Handy steckst, dann bekommst du eine Option, diese Nummer (auf SIM) zu bearbeiten. Sobald es fertig ist, wird das Android-Gerät die Nummer erkennen und zeigt Ihnen.

    Außerdem, wenn Sie Ihre Telefonnummer durch den Code erhalten, dann ist der beste Weg, um zwei Zahlen zu vergleichen:

     boolean isSame = PhoneNumberUtils.compare(num1, num2); 

    Alternativ können Sie eine Art von Pin-Code-Verifikationslogik (wie Viber, WhatsApp oder andere Anwendung) implementieren, in der Sie den Benutzer bitten, ihre Telefonnummer während der Registrierung einzugeben. Später wird diese Telefonnummer an den Server gesendet und ein Pin-Code wird gegen diese Nummer generiert, die per SMS an den Benutzer gesendet wird. Schließlich muss der Benutzer diesen Pin-Code eingeben (erhalten in SMS), um die Registrierung abzuschließen.

    Oder

    Senden Sie einfach eine SMS vom Benutzergerät (mit Zustimmung) an Ihren Server / Gerät und lernen Sie die Telefonnummer kennen.

    Die Telefonnummer mit getLine1Number() ist nicht sicher und sicher .

    Es ist allgemein akzeptiert, weil diese ganze "bekommen die Telefonnummer" ist der Zusammenstoß von mehreren Fragen wie Benutzer Privatsphäre, Träger-Branding und sogar der Verkäufer.

    Wie auch immer, im Gegensatz zu ios, android's android.provider.Telephony.SMS_RECEIVED macht den ganzen Prozess sehr bequem und scheinbar für den Benutzer: Sie erhalten, um die sms zu erfassen und lesen Sie es ohne Notwendigkeit der Benutzerintervention.

    Was ist eine Möglichkeit, es zu tun?

    Auf Ihrem Server, nach Erhalt der Anfrage, um eine Telefonnummer zu überprüfen, sollten Sie einen geheimen Code, TokenSent erstellen und senden Sie es an die App. Nun sollte Ihr Server diesen Code per SMS an die angegebene Telefonnummer senden. Die App sollte jetzt einen registrierten Empfänger hören für die android.provider.Telephony.SMS_RECEIVED Absicht. Einmal erhalten, überprüft die App, dass das tokenSent identisch ist mit dem, was es vom Server erhalten hat. An dieser Stelle erfolgt die Telefonregistrierung und der Server kann benachrichtigt werden.

    Was könnte schiefgehen?

    Im Allgemeinen sind solche Apps in der Regel bezahlten Apps und es ist nicht der Benutzer gut, etwas zu versuchen. Dennoch kann der Benutzer eine falsche Nummer eingeben, die er gerade hat. Dann, wenn er die Sms empfing, konnte er es an das Handy weiterleiten, wo sich die App registriert hat. Die App wird dann die TokenSent empfangen und die Telefonnummer falsch überprüfen.

    Wie können wir das anpacken?

    Die Machbarkeit der Lösung hängt davon ab, ob der sms-Provider Ihrem Server erlaubt, die Telefonnummer des Absenders zu kennen. Das ist wohl (AFAIK) wird nicht passieren, aber wenn es dann ist, dann hast du Glück? Auf diese Weise kann die App nach dem Empfang der tokenSent sie mit dem Absender der sms an den Server zurückschicken. Der Server kann dann überprüfen, dass dies die SMS ist, die von Ihrem Diensteanbieter stammt.

    Noch möglichere Lösung? (Wenn ich wirklich paranoid bin)

    In diesem Fall wäre die beste Lösung, glaube ich, ein tokenSent von Ihrem Server anzufordern . Der Server speichert ein generiertes tokenSent zusammen mit der eingegebenen Telefonnummer und sendet dieses Token an die App. Die App benachrichtigt den Benutzer, dass die Registrierung ihn 1 sms kostet. Sobald der Benutzer akzeptiert, können Sie ganz einfach eine SMS im Hintergrund mit diesem TokenSent zu einem bestimmten Dienst senden. Der Server, der einmal dieses Token empfängt, überprüft den Benutzer mit dem Token und dem Absender der SMS. Natürlich kann dies ein bisschen belästigen und verletzen, um den Benutzer, aber es ist der sicherste Weg vor allem für eine solche paranoide (Lesen dieses Teils).

    Formalitäten: P

    Add Permissions in Manifest

     <uses-permission android:name="android.permission.RECEIVE_SMS"> 

    Register the receiver (machen Sie dies kurz bevor Sie die SMS ans Telefon senden)

     registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getExtras() != null) { Object[] pdus = (Object[]) intent.getExtras().get("pdus"); SmsMessage[] msgs = new SmsMessage[pdus.length]; for (int i=0; i<msgs.length; i++){ msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]); String from = msgs[i].getOriginatingAddress(); String body = msgs[i].getMessageBody().toString(); //here is the body //... unregisterReceiver(this); //If you are done with verification } } } }, new IntentFilter("android.provider.Telephony.SMS_RECEIVED")); 

    Ich habe es selbst gelöst. Hier ist mein Arbeitscode. MainActivity Klasse:

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

    Kein ANR gefunden

     public class MainActivity extends Activity{ Button submit; EditText contact; String phNo; ProgressDialog progress; Boolean wasMyOwnNumber = false; Boolean workDone = false; @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(); wasMyOwnNumber=true;workDone=true; } else { Toast.makeText(getApplicationContext(), "Provide your own mobile number please.", Toast.LENGTH_LONG).show(); wasMyOwnNumber=false;workDone=true; return; }*/ } } @Override protected String doInBackground(String... params) { // TODO Auto-generated method stub String msg = phNo; try { sendSMS(phNo, msg); int count=0; while(!workDone) {count++;} } 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); } 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--- workDone=true; 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; } } } 

    Ich möchte nur ein bisschen hier oben Erklärungen in den obigen Antworten hinzufügen. Das wird auch für andere Zeit sparen.

    In meinem Fall gab diese Methode keine Mobilnummer zurück, eine leere Zeichenfolge wurde zurückgegeben. Es war wegen des Falles, dass ich meine Nummer auf die neue Sim portiert hatte. Also, wenn ich in die Einstellungen> Über Telefon> Status> Meine Telefonnummer gehe, zeigt es mir "Unbekannt".

    Dies ist wahrscheinlich, weil Sie die Nummer von einem Netzwerk zu anderen portiert haben.

    Wenn Sie nicht in der Lage sind, die Nummer von API zu überprüfen, dann:

    Eine Möglichkeit, das zu tun, ist, dass du eine Textnachricht an die Nummer generierst und eine zufällige generierte Nr. An die Mobilnummer sendest. Sie müssen den Benutzer bitten, diese zufällige generierte Nummer in Ihre Anwendung einzugeben. Sobald es in die Applikation eingetragen ist, können Sie es auf den Server senden, um zu überprüfen, ob die im Text übergebene Nummer korrekt ist oder nicht (welche Sie bereits auf dem Server gegen diese Mobilnummer gespeichert haben).

    Ich hoffe das macht Sinn.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.