Como posso obter programaticamente o número de telefone do dispositivo que está executando meu aplicativo Android?
Como posso obter programaticamente o número de telefone do dispositivo que está executando meu aplicativo Android?
Respostas:
Código:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
Permissão necessária:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
De acordo com os comentários altamente votados, há algumas ressalvas a serem observadas. Isso pode retornar null
ou ""
até mesmo "???????"
, e pode retornar um número de telefone obsoleto que não é mais válido. Se você deseja algo que identifique exclusivamente o dispositivo, use-o getDeviceId()
.
null
. Dito isto, não estou ciente de uma resposta melhor.
Não há solução garantida para esse problema porque o número de telefone não está fisicamente armazenado em todos os cartões SIM ou transmitido da rede para o telefone. Isso é especialmente verdadeiro em alguns países que exigem verificação de endereço físico, com a atribuição de números somente depois. A atribuição do número de telefone acontece na rede - e pode ser alterada sem a alteração do cartão ou dispositivo SIM (por exemplo, é assim que a porta é suportada).
Sei que é doloroso, mas provavelmente a melhor solução é pedir ao usuário para digitar seu número de telefone uma vez e armazená-lo.
Na verdade, você pode considerar uma solução alternativa, se não conseguir obtê-la através do serviço de telefonia.
A partir de hoje, você pode confiar em outro grande aplicativo WhatsApp, usando AccountManager
. Milhões de dispositivos têm esse aplicativo instalado e, se você não conseguir obter o número de telefone TelephonyManager
, poderá tentar.
Permissão:
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
Código:
AccountManager am = AccountManager.get(this);
Account[] accounts = am.getAccounts();
for (Account ac : accounts) {
String acname = ac.name;
String actype = ac.type;
// Take your time to look at all available accounts
System.out.println("Accounts : " + acname + ", " + actype);
}
Verifique actype
a conta do WhatsApp
if(actype.equals("com.whatsapp")){
String phoneNumber = ac.name;
}
Claro que você pode não conseguir se o usuário não instalou o WhatsApp, mas vale a pena tentar de qualquer maneira. E lembre-se de que você deve sempre pedir confirmação ao usuário.
Conforme publicado na minha resposta anterior
Use o código abaixo:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
No AndroidManifest.xml, dê a seguinte permissão:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Mas lembre-se, esse código nem sempre funciona, pois o número do celular depende do cartão SIM e da operadora de rede / operadora de celular.
Além disso, tente verificar Telefone -> Configurações -> Sobre -> Identidade do telefone . Se você conseguir visualizar o número lá, a probabilidade de obter o número de telefone do código acima é maior. Se você não conseguir visualizar o número de telefone nas configurações, não poderá obter esse código!
Solução sugerida:
Execute as 4 etapas acima como uma atividade única durante o primeiro lançamento do aplicativo. Posteriormente, sempre que for necessário um número de telefone, use o valor disponível na preferência compartilhada.
É assim que você solicita um número de telefone por meio da API do Play Services sem a permissão e os hacks. Fonte e exemplo completo .
No seu build.gradle (versão 10.2.xe superior):
compile "com.google.android.gms:play-services-auth:$gms_version"
Na sua atividade (o código é simplificado):
@Override
protected void onCreate(Bundle savedInstanceState) {
// ...
googleApiClient = new GoogleApiClient.Builder(this)
.addApi(Auth.CREDENTIALS_API)
.build();
requestPhoneNumber(result -> {
phoneET.setText(result);
});
}
public void requestPhoneNumber(SimpleCallback<String> callback) {
phoneNumberCallback = callback;
HintRequest hintRequest = new HintRequest.Builder()
.setPhoneNumberIdentifierSupported(true)
.build();
PendingIntent intent = Auth.CredentialsApi.getHintPickerIntent(googleApiClient, hintRequest);
try {
startIntentSenderForResult(intent.getIntentSender(), PHONE_NUMBER_RC, null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
Logs.e(TAG, "Could not start hint picker Intent", e);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PHONE_NUMBER_RC) {
if (resultCode == RESULT_OK) {
Credential cred = data.getParcelableExtra(Credential.EXTRA_KEY);
if (phoneNumberCallback != null){
phoneNumberCallback.onSuccess(cred.getId());
}
}
phoneNumberCallback = null;
}
}
Isso irá gerar um diálogo como este:
private String getMyPhoneNumber(){
TelephonyManager mTelephonyMgr;
mTelephonyMgr = (TelephonyManager)
getSystemService(Context.TELEPHONY_SERVICE);
return mTelephonyMgr.getLine1Number();
}
private String getMy10DigitPhoneNumber(){
String s = getMyPhoneNumber();
return s != null && s.length() > 2 ? s.substring(2) : null;
}
Código extraído de http://www.androidsnippets.com/get-my-phone-number
Existe uma nova API do Android que permite ao usuário selecionar seu número de telefone sem a necessidade de permissão. Dê uma olhada em: https://android-developers.googleblog.com/2017/10/effective-phone-number-verification.html
// Construct a request for phone numbers and show the picker
private void requestHint() {
HintRequest hintRequest = new HintRequest.Builder()
.setPhoneNumberIdentifierSupported(true)
.build();
PendingIntent intent = Auth.CredentialsApi.getHintPickerIntent(
apiClient, hintRequest);
startIntentSenderForResult(intent.getIntentSender(),
RESOLVE_HINT, null, 0, 0, 0);
}
Só quero adicionar um pouco aqui às explicações acima nas respostas acima. O que economizará tempo para os outros também.
No meu caso, esse método não retornou nenhum número de celular, uma string vazia foi retornada. Foi devido ao caso que eu tinha portado meu número no novo sim. Portanto, se eu entrar em Configurações> Sobre o telefone> Status> Meu número de telefone, ele me mostrará "Desconhecido".
Às vezes, o código abaixo retorna null
ou string em branco.
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
Com permissão abaixo
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Existe outra maneira de obter seu número de telefone. Eu não testei isso em vários dispositivos, mas o código acima não funciona sempre.
Experimente o código abaixo:
String main_data[] = {"data1", "is_primary", "data3", "data2", "data1", "is_primary", "photo_uri", "mimetype"};
Object object = getContentResolver().query(Uri.withAppendedPath(android.provider.ContactsContract.Profile.CONTENT_URI, "data"),
main_data, "mimetype=?",
new String[]{"vnd.android.cursor.item/phone_v2"},
"is_primary DESC");
if (object != null) {
do {
if (!((Cursor) (object)).moveToNext())
break;
// This is the phoneNumber
String s1 = ((Cursor) (object)).getString(4);
} while (true);
((Cursor) (object)).close();
}
Você precisará adicionar essas duas permissões.
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
Espero que isso ajude, obrigado!
String s1
será o número de telefone.
Em primeiro lugar, obter o número de celular dos usuários é contra a política ética, antes era possível, mas agora, de acordo com minha pesquisa, não há uma solução sólida disponível para isso. Ao usar algum código, é possível obter o número de celular, mas não há garantia de que funcione. apenas em alguns dispositivos. Após muita pesquisa, encontrei apenas três soluções, mas elas não estão funcionando em todos os dispositivos.
Existe a seguinte razão pela qual não estamos recebendo.
1.O dispositivo Android e o novo cartão SIM não armazenam número de celular se o número do celular não estiver disponível no dispositivo e no sim, como é possível obter o número, se algum cartão SIM antigo tiver número de celular e usar o gerenciador de telefonia, podemos obter o número outro sábio, ele retornará o "nulo" ou "" ou "??????"
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
TelephonyManager tel= (TelephonyManager)this.getSystemService(Context.
TELEPHONY_SERVICE);
String PhoneNumber = tel.getLine1Number();
Nota: - Testei esta solução nos seguintes dispositivos Moto x, Samsung Tab 4, Samsung S4, Nexus 5 e Redmi 2 prime, mas não funciona toda vez que retorna uma string vazia, portanto, a conclusão é inútil
Nota: - Esta também não é a solução garantida e eficiente; testei esta solução em muitos dispositivos, mas funcionou apenas no Redmi 2 prime, que é um dispositivo dual sim, me dá dois números de celular, o primeiro está correto, mas o segundo não. pertencem ao meu segundo sim, pertencem ao meu cartão sim antigo, que não estou usando.
String main_data[] = {"data1", "is_primary", "data3", "data2", "data1",
"is_primary", "photo_uri", "mimetype"};
Object object = getContentResolver().
query(Uri.withAppendedPath(android.provider.ContactsContract.Profile.CONTENT_URI, "data"),
main_data, "mimetype=?",
new String[]{"vnd.android.cursor.item/phone_v2"},
"is_primary DESC");
String s1="";
if (object != null) {
do {
if (!((Cursor) (object)).moveToNext())
break;
// This is the phoneNumber
s1 =s1+"---"+ ((Cursor) (object)).getString(4);
} while (true);
((Cursor) (object)).close();
}
Conclusão : - O Android não possui solução garantida para obter o número de celular do usuário programaticamente.
Sugestão : - 1. Se você deseja verificar o número de celular do usuário, peça ao usuário que forneça o número dele, usando otp, você pode verificar isso.
- Se você deseja identificar o dispositivo do usuário, para isso, pode obter facilmente o número IMEI do dispositivo.
TelephonyManager
não é a solução certa, porque em alguns casos o número não é armazenado no SIM. Sugiro que você use a preferência compartilhada para armazenar o número de telefone do usuário pela primeira vez que o aplicativo estiver aberto e o número será usado sempre que você precisar.
Aqui está uma combinação das soluções que encontrei (exemplo de projeto aqui , se você também quiser verificar o preenchimento automático):
manifesto
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
build.gradle
implementation "com.google.android.gms:play-services-auth:17.0.0"
MainActivity.kt
class MainActivity : AppCompatActivity() {
private lateinit var googleApiClient: GoogleApiClient
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
tryGetCurrentUserPhoneNumber(this)
googleApiClient = GoogleApiClient.Builder(this).addApi(Auth.CREDENTIALS_API).build()
if (phoneNumber.isEmpty()) {
val hintRequest = HintRequest.Builder().setPhoneNumberIdentifierSupported(true).build()
val intent = Auth.CredentialsApi.getHintPickerIntent(googleApiClient, hintRequest)
try {
startIntentSenderForResult(intent.intentSender, REQUEST_PHONE_NUMBER, null, 0, 0, 0);
} catch (e: IntentSender.SendIntentException) {
Toast.makeText(this, "failed to show phone picker", Toast.LENGTH_SHORT).show()
}
} else
onGotPhoneNumberToSendTo()
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_PHONE_NUMBER) {
if (resultCode == Activity.RESULT_OK) {
val cred: Credential? = data?.getParcelableExtra(Credential.EXTRA_KEY)
phoneNumber = cred?.id ?: ""
if (phoneNumber.isEmpty())
Toast.makeText(this, "failed to get phone number", Toast.LENGTH_SHORT).show()
else
onGotPhoneNumberToSendTo()
}
}
}
private fun onGotPhoneNumberToSendTo() {
Toast.makeText(this, "got number:$phoneNumber", Toast.LENGTH_SHORT).show()
}
companion object {
private const val REQUEST_PHONE_NUMBER = 1
private var phoneNumber = ""
@SuppressLint("MissingPermission", "HardwareIds")
private fun tryGetCurrentUserPhoneNumber(context: Context): String {
if (phoneNumber.isNotEmpty())
return phoneNumber
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val subscriptionManager = context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE) as SubscriptionManager
try {
subscriptionManager.activeSubscriptionInfoList?.forEach {
val number: String? = it.number
if (!number.isNullOrBlank()) {
phoneNumber = number
return number
}
}
} catch (ignored: Exception) {
}
}
try {
val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
val number = telephonyManager.line1Number ?: ""
if (!number.isBlank()) {
phoneNumber = number
return number
}
} catch (e: Exception) {
}
return ""
}
}
}
Uma pequena contribuição. No meu caso, o código lançou uma exceção de erro. Eu precisava colocar uma anotação para que o código fosse executado e corrija esse problema. Aqui deixo esse código.
public static String getLineNumberPhone(Context scenario) {
TelephonyManager tMgr = (TelephonyManager) scenario.getSystemService(Context.TELEPHONY_SERVICE);
@SuppressLint("MissingPermission") String mPhoneNumber = tMgr.getLine1Number();
return mPhoneNumber;
}
Embora seja possível ter várias contas de correio de voz, ao ligar a partir do seu próprio número, as operadoras o encaminham para o correio de voz. Então, TelephonyManager.getVoiceMailNumber()
ou TelephonyManager.getCompleteVoiceMailNumber()
, dependendo do sabor que você precisa.
Espero que isto ajude.
Adicione esta dependência:
implementation 'com.google.android.gms:play-services-auth:18.0.0'
Para buscar a lista de números de telefone, use este:
val hintRequest = HintRequest.Builder()
.setPhoneNumberIdentifierSupported(true)
.build()
val intent = Credentials.getClient(context).getHintPickerIntent(hintRequest)
startIntentSenderForResult(
intent.intentSender,
PHONE_NUMBER_FETCH_REQUEST_CODE,
null,
0,
0,
0,
null
)
Depois de tocar na caixa de diálogo "play services":
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent? {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == PHONE_NUMBER_FETCH_REQUEST_CODE) {
data?.getParcelableExtra<Credential>(Credential.EXTRA_KEY)?.id?.let {
useFetchedPhoneNumber(it)
}
}
}
enquanto trabalhava em um aplicativo de segurança que precisava obter o número de telefone de quem quer que meu telefone estivesse em suas mãos, eu tive que fazer isso; 1. receba a inicialização concluída e tente obter o Line1_Number do telephonyManager, que retorna um resultado de sequência. 2. compare o resultado da String com o meu próprio número de telefone e, se eles não corresponderem ou retornarem nulos, 3. envie secretamente um SMS contendo o resultado da string, além de um sinal especial para o número do meu escritório. 4. Se o envio da mensagem falhar, inicie um serviço e continue tentando após cada hora até que a intenção pendente do SMS enviado retorne com êxito. Com essas etapas, eu poderia obter o número da pessoa usando meu telefone perdido. não importa se a pessoa é cobrada.