Programaticamente obter o número de telefone do telefone Android

Como posso programaticamente obter o número de telefone do dispositivo que está a rodar a minha aplicação android?

Author: bluish, 2010-03-19

15 answers

Código:

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

Autorização Requerida:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 

Advertências:

De acordo com os comentários altamente votados, há algumas reservas a ter em conta. Isto pode retornar null ou "" ou mesmo "???????", e pode retornar um número de telefone obsoleto que já não é válido. Se quiser algo que identifique o dispositivo de forma única, deve usar getDeviceId() em vez disso.
 451
Author: Alex Volovoy, 2016-07-21 12:44:47

Não há uma solução garantida para este 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. Isto é especialmente verdadeiro em alguns países que exigem verificação física de endereço, com atribuição de Número apenas acontecendo depois. A atribuição de números de telefone acontece na rede-e pode ser alterado sem alterar o cartão SIM ou dispositivo (por exemplo, é assim que o porting é suportado).

Eu sei que é dor, mas ... muito provavelmente a melhor solução é apenas pedir ao Usuário para digitar seu número de telefone uma vez e armazená-lo.
 140
Author: Johan, 2011-07-22 23:50:39

Actualização: esta resposta já não está disponível porque o Whatsapp deixou de expor o número de telefone como nome da conta, por favor ignore esta resposta.

Na verdade, há uma solução alternativa que você pode querer considerar, se você não conseguir obtê-la através do serviço de telefonia.

A partir de hoje, você pode confiar em outra grande aplicação Whatsapp, usando AccountManager. Milhões de dispositivos têm este aplicativo instalado e se você não pode obter o número de telefone através de Telefonymanager, você pode experimenta isto.

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 o actype para a conta whatsapp

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

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

 39
Author: Chor Wai Chun, 2014-12-09 09:46:33
Como postado na minha resposta anterior

Utilizar o código abaixo:

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

Em AndroidManifest.xml, dê a seguinte permissão:

 <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 

Mas lembre-se, este código nem sempre funciona, uma vez que o número de telemóvel depende do cartão SIM e do operador de rede / operadora de telemóvel.

Além disso, tente fazer o check-in. Phone-- > Settings -- > About -- > Phone Identity, Se você é capaz de ver o número lá, a probabilidade de obter o o número de telefone de cima do código é maior. Se você não for capaz de ver o número de telefone nas configurações, então você não será capaz de obter através deste código!

Solução De Trabalho Sugerida:

  1. obter o número de telefone do utilizador como entrada manual do utilizador.
  2. envie um código para o número de telemóvel do Utilizador via SMS.
  3. peça ao utilizador para introduzir o código para confirmar o número de telefone.
  4. guarda o número na conferência de partilha.

Faça os 4 passos acima como uma vez actividade durante o primeiro lançamento da aplicação. Mais tarde, sempre que o número de telefone for necessário, use o valor disponível em preferência compartilhada.

 27
Author: Nishanthi Grashia, 2017-05-23 11:33:26
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 retirado de http://www.androidsnippets.com/get-my-phone-number

 13
Author: Emil Hajric, 2014-09-09 07:29:51

Às vezes, por baixo do Código devolve null ou texto Em Branco.

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

Com a permissão abaixo

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Há outra forma de conseguir o seu número de telefone, não testei isto em vários dispositivos, mas acima do código não funciona sempre.

Tente abaixo do Código:

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

Terá de adicionar estas duas permissões.

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
Espero que isto ajude., Obrigado!
 8
Author: activesince93, 2017-01-11 08:47:11

Só quero adicionar um pouco aqui para as explicações acima nas respostas acima. O que poupará tempo para os outros também.

No meu caso, este método não devolveu nenhum número de telemóvel, foi devolvido um texto vazio. Foi devido ao caso que eu tinha portado o meu número no novo sim. Então, se eu entrar na configuração > Sobre telefone>Status>meu número de telefone ele me mostra "desconhecido".

 7
Author: user_CC, 2012-05-20 22:48:41

Existe uma nova api do Android que permite ao utilizador seleccionar o seu número de telefone sem a necessidade de uma autorização. Dê uma olhada: 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);
} 
 6
Author: Wirling, 2017-10-19 12:46:36

Esta é uma resposta mais simplificada:

public String getMyPhoneNumber()
{
    return ((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
            .getLine1Number();
}
 4
Author: E P Lewis, 2011-09-19 18:31:15

Telefonymanager não é a solução certa, porque em alguns casos o número não é armazenado no SIM, devido à minha sugestão,você deve usar a preferência compartilhada para armazenar o número de telefone do usuário da primeira vez que a aplicação está aberta, e depois disso o número será usado sempre que você precisar na aplicação.

 3
Author: Naveed Ahmad, 2014-01-07 08:40:54

Em primeiro lugar, obter o número móvel dos usuários é contra a política ética, mais cedo foi possível, mas agora, de acordo com a 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 que ele vai funcionar apenas em poucos dispositivos. Depois de muita pesquisa eu encontrei apenas três soluções, mas eles não estão trabalhando em todos os dispositivos.

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

1.Dispositivo Android e Novo Cartão Sim não armazenar número de celular se o número de celular não está disponível no dispositivo e sim, então como é possível obter o número, se qualquer sim cartão com o número de telefone celular, em seguida, usando o gerenciador de Telefonia podemos obter o número de outra forma ele irá 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 cada está na hora de voltar ao Texto vazio, por isso a conclusão é que é inútil.

  1. este método está a funcionar apenas em redmi 2 prime, mas para esta necessidade de adicionar leiam a permissão de contacto no manifesto.

Nota: - Esta também não é a solução garantida e eficiente, Eu testei esta solução em muitos dispositivos, mas ele trabalhou apenas em Redmi 2 prime que é um dispositivo duplo sim. dá - me dois telemóveis. o primeiro é ... correcto, mas o segundo não pertence ao meu segundo sim. o meu velho cartão sim que eu sou não consumir.

 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 telemóvel usando a conta WhatsApp, mas agora a nova versão do Whatsapp não guarda o número de telemóvel do utilizador.

Conclusão : - o Android não tem nenhuma solução garantida para obter número de telemóvel do utilizador programaticamente.

Sugestão : - 1. Se você quiser verificar o número de celular do usuário, em seguida, pedir para Usuário para fornecer o seu número, usando otp você posso confirmar isso.

  1. Se você quiser identificar o dispositivo do Usuário, para isso você pode facilmente obter o número IMEI do dispositivo.
 3
Author: ramkrishna kushwaha, 2017-01-19 13:10:33
Então é assim que se pede um número de telefone através da API Play Services sem a permissão e hacks. Fonte e exemplo Completo.

Na tua Constituição.gradle (version 10.2.X e superior necessário):

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

Na sua actividade (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;
    }
}

Isto irá gerar uma janela como esta:

enter image description here

 2
Author: Dmide, 2018-01-11 15:06:36
Embora seja possível ter várias contas de voicemail, ao ligar do seu próprio número, os transportadores encaminham-no para o voicemail. Então, {[[0]} ou TelephonyManager.getCompleteVoiceMailNumber(), dependendo do sabor que você precisa. Espero que isto ajude.
 0
Author: Jim, 2011-06-06 06:11:23
Uma pequena contribuição. No meu caso, o código lançou uma excepção de erro. Eu preciso colocar uma anotação que para o Código ser executado e corrigir esse problema. Aqui deixo 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;
}
 0
Author: Ariel Alejandro Wagner, 2018-07-06 16:26:51
Enquanto trabalhava numa aplicação de segurança que precisava de ter o número de telefone de quem o meu telemóvel podia ter nas mãos, tive de fazer isto.; 1. receba o Boot completo e, em seguida, tente obter o Line1_ number do telefononymanager que retorna um resultado de string. 2. compare o resultado de texto com o meu próprio número de telefone e se eles não coincidem ou string retorna nulo então, 3. secretamente enviar um SMS contendo o resultado string mais um sinal especial para o meu número de escritório. 4. se o envio da mensagem falhar, iniciar um serviço e continuar a tentar após cada hora até enviar SMS pendentes intenção retorna bem sucedido. Com estes passos eu poderia obter o número da pessoa usando o meu telefone perdido. não importa se a pessoa é acusada.
 -5
Author: Ray, 2016-12-21 20:14:14