Pergunta

Como posso obter programaticamente o número de telefone do dispositivo que está executando meu aplicativo Android?

Foi útil?

Solução

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"/> 

Ressalvas:

De acordo com os comentários altamente votados, existem algumas advertências a serem cientes. Isso pode retornar null ou "" ou até "???????", e pode retornar um número de telefone obsoleto que não é mais válido. Se você quer algo que identifique exclusivamente o dispositivo, você deve usar getDeviceId() em vez de.

Outras dicas

Não existe uma solução garantida para esse problema porque o número de telefone não é fisicamente armazenado em todos os SIMs ou transmitido da rede para o telefone. Isso é especialmente verdadeiro em alguns países que exigem verificação de endereços físicos, com a atribuição de números apenas acontecendo depois. A atribuição de número de telefone acontece na rede - e pode ser alterada sem alterar o cartão ou dispositivo SIM (por exemplo, é assim que a portagem é suportada).

Sei que é dor, mas provavelmente a melhor solução é apenas pedir ao usuário para inserir seu número de telefone uma vez e armazená -lo.

ATUALIZAÇÃO: Esta resposta não está mais disponível, pois o WhatsApp parou de expor o número de telefone como nome da conta, por favor, desconsidere essa resposta.

Na verdade, existe uma solução alternativa que você pode considerar, se não conseguir obtê -lo 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 este aplicativo instalado e se você não conseguir obter o número de telefone via TelephonyManager, você pode dar uma chance.

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

Verificar actype para conta do WhatsApp

if(actype.equals("com.whatsapp")){
    String phoneNumber = ac.name;
}

É claro que você pode não obtê -lo se o usuário não instalar o WhatsApp, mas vale a pena tentar de qualquer maneira. E lembre -se de que você deve sempre pedir confirmação ao usuário.

Como postado no meu 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 telefone celular depende do cartão SIM e do operador de rede / operadora de telefone celular.

Além disso, tente verificar Telefone-> Configurações-> Sobre-> Identidade do telefone, Se você puder visualizar o número lá, a probabilidade de obter o número de telefone acima do código será maior. Se você não conseguir visualizar o número de telefone nas configurações, não poderá obter através deste código!

Solução alternativa sugerida:

  1. Obtenha o número de telefone do usuário como entrada manual do usuário.
  2. Envie um código para o número de celular do usuário via SMS.
  3. Peça ao usuário que insira o código para confirmar o número de telefone.
  4. Salve o número no SharedPreference.

Faça as 4 etapas acima como atividade única durante o primeiro lançamento do aplicativo. Posteriormente, sempre que o número de telefone for necessário, use o valor disponível na preferência compartilhada.

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 tirado de http://www.androidsnippets.com/get-my-phone-number

É assim que você solicita um número de telefone através da API de serviços de reprodução sem a permissão e os hacks. Fonte e Exemplo completo.

Em seu Build.gradle (versão 10.2.x e superior exigido):

compile "com.google.android.gms:play-services-auth:$gms_version"

Em 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 gerará uma caixa de diálogo como esta:

enter image description here

Há uma nova API do Android que permite ao usuário selecionar seu número de telefone sem a necessidade de uma 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 havia portado meu número no novo SIM. Então, se eu entrar nas configurações> Sobre o telefone> Status> meu número de telefone, ele me mostra "desconhecido".

Às vezes, o código abaixo retorna null ou corda 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"/>

Há 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 está funcionando 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!

Esta é uma resposta mais simplificada:

public String getMyPhoneNumber()
{
    return ((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
            .getLine1Number();
}

Antes de tudo, 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á solução sólida disponível para isso, usando algum código, é possível obter o número de celular, mas nenhuma garantia pode ser apenas em poucos dispositivos. Depois de muita pesquisa, encontrei apenas três soluções, mas elas não estão trabalhando em todos os dispositivos.

Há a seguinte razão pela qual não estamos recebendo.

1. Android Disposition e novo cartão SIM Não armazenando o número do 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 houver um cartão SIM antigo com número de celular, usando o gerenciador de telefonia, podemos obter o número outro Sábio, 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:- Eu testei esta solução no seguinte dispositivo Moto X, Samsung Tab 4, Samsung S4, Nexus 5 e Redmi 2 Prime, mas não funciona toda vez que retorna a sequência vazia, então a conclusão é inútil

  1. Este método está funcionando apenas no Redmi 2 Prime, mas para essa necessidade de adicionar a permissão de contato de leitura no manifesto.

Nota:- Essa também não é a solução garantida e eficiente, testei essa solução em muitos dispositivos, mas funcionou apenas no Redmi 2 Prime, que é o dispositivo SIM duplo, ele me dá dois números de celular primeiro, mas o segundo não é Pertencem ao meu segundo sim, ele pertence 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();
    }
  1. Na minha pesquisa, descobri anteriormente que era possível obter o número de celular usando a conta do WhatsApp, mas agora a nova versão do WhatsApp não armazenando o número de celular do usuário.

Conclusão:- O Android não possui nenhuma solução garantida para obter o número de celular do usuário programaticamente.

Sugestão:- 1. Se você deseja verificar o número do celular do usuário, peça ao usuário para fornecer seu número, usando o OTP, você pode verificar isso.

  1. Se você deseja identificar o dispositivo do usuário, para isso, poderá facilmente obter 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, o aplicativo está aberto e o número será usado sempre que você precisar.

Uma pequena contribuição. No meu caso, o código lançou uma exceção de erro. Eu precisei colocar uma anotação de que, para o código, seja executado e corrija esse problema. Aqui eu deixei este 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 do seu próprio número, as operadoras o percorreram para o correio de voz. Então, TelephonyManager.getVoiceMailNumber() ou TelephonyManager.getCompleteVoiceMailNumber(), dependendo do sabor que você precisa.

Espero que isto ajude.

Enquanto trabalhava em um aplicativo de segurança que precisava obter o número de telefone de quem sempre meu telefone poderia entrar em suas mãos, eu tinha que fazer isso; 1. Receba a inicialização concluída e tente obter o Line1_Number no TelefonyManager, que retorna um resultado da string. 2. Compare o resultado da string com meu próprio número de telefone e, se eles não corresponderem ou retornarem a string nulos, 3. Envie secretamente um SMS contendo o resultado da string mais 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 o SMS enviado pendente de retorno de retorno bem -sucedido. Com essas etapas, eu poderia obter o número de pessoa usando meu telefone perdido. Não importa se a pessoa é cobrada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top