Когда-то, помнится, я упоминал, как можно получить номер телефона (симки) буквально двумя строчками кода:

1
2
3
TelephonyManager tMgr =
           (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
  mPhoneNumber = tMgr.getLine1Number();
Но тут есть одно но. Этот способ убдет работать далеко не всегда, а точнее, далеко не со всеми SIM-картами. Дело в том, что физически номер хранится не на всех SIM-картах. Аутентифицируются они своими способами в сети, что позволяет сменить номер телефона без смены SIM. Поэтому, если у вас в приложении очень многое завязано на номере телефона, то лучше подстраховаться и с нужный момент попросить пользователя ввести номер вручную (естественно, снабдив это все верификациями и тд) или же есть еще один способ, который может стоить 1 SMS. Примерно такой: если вышеописанный код таки возвразает null – можно сгенерировать какой-то код, отослать его в SMS-сообщении на свой номер ( номер таки прийдется спросить у пользователя) и повесить ресивер на SMS, в котором проанализоировать текст сообщения и если он совпадает со сгенеренным – то взять ноемр, с которого оно, сообщение, пришло, и использовать уже его. Причем тут также стоит потрудиться и привести его к полному формату +ххх-хх-хх-хххх , тоесть с кодом страны и т.д., так как замечено, что, скажем, в штатах, у которых код +1, SMS может таки приходить от номера без кода. Далее – удалить сообщение. Недостаток – все сообщения будут проверяться этим кодом.