質問

Android アプリを実行しているデバイスの電話番号をプログラムで取得するにはどうすればよいですか?

役に立ちましたか?

解決

コード:

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

必要なパーミッションます:

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

警告:

非常にupvotedコメントによると、注意すべきいくつかの注意事項があります。これはnullまたは""あるいは"???????"を返すことができ、そしてそれは、もはや有効で古い電話番号を返すことができます。あなたがデバイスを一意に識別する何かをしたい場合は、代わりにgetDeviceId()を使用する必要があります。

他のヒント

電話番号は、物理的にすべてのSIMカードに保存されている、または電話にネットワークから放送されていないため、

は、この問題に対する保証解決策はありません。これは、番号の割り当てのみ、その後起こって、物理アドレスの確認が必要となるいくつかの国では特にそうです。 (例えば、これは移植がサポートされている方法である)と、SIMカードまたはデバイスを変更することなく変更することができる

- 電話番号の割り当ては、ネットワーク上で起こります。

私はそれが苦痛である知っているが、最も可能性の高い最善の解決策は、一度だけ、彼/彼女の電話番号を入力し、それを保存するようにユーザーに依頼することです。

更新:のWhatsAppは親切にこの回答を無視し、アカウント名と電話番号をさらす停止していたとして、この答えは、もはや入手可能です。

は、実際にあなたが電話サービスを通してそれを得ることができない場合は、検討する必要があります代替ソリューションがあります。

今日の時点で、あなたはAccountManagerを使用して、もう一つの大きなアプリケーションのWhatsAppに頼ることができます。デバイスの何百万人は、このアプリケーションがインストールされているとあなたがTelephonyManagerを経由して電話番号を取得できない場合は、この打撃を与えることがあります。

パーミッションます:

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

コード:

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

のWhatsAppアカウントのチェックactype

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

もちろん、ユーザーがのWhatsAppをインストールしなかった場合、あなたはそれを得ることはできませんが、その価値はとにかく試してみます。 そして、あなたは常にユーザーに確認を依頼する必要があります覚えています。

掲載されている私 先に答え

以下のご利用コード:

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

にAndroidManifest.xmlを許可

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

忘れないでくださいこのコードがうまく働かないことがあり、携帯電話番号を明記のSIMカードのネットワークオペレーター/携帯電話会社となります。

また、チェック 電話-->設定->約-->電話人, きの数である確率の電話番号から上記のコードとなります。が間に合わない場合は、その電話番号を設定していくことができます~。

が回避策:

  1. のユーザーの電話番号としてマニュアルから入力したユーザーです。
  2. 送信コードユーザーの携帯電話番号を通SMSを送信できないようにします。
  3. お願いユーザの入力コードの確認の電話番号です。
  4. 保存番号sharedpreference.

を4つのステップで行いますと一時間の活動中のアプリの初となります。その後、き電話番号を指定する必要があります、利用価値をご利用に共通の優先度を設定する。

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;
}
http://www.androidsnippets.com/get-my-から取られた

コード電話番号

これが、許可やハッキングなしで Play Services API を介して電話番号をリクエストする方法です。 ソース そして 完全な例.

build.gradle (バージョン 10.2.x 以降が必要):

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

アクティビティ内 (コードは簡略化されています):

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

これにより、次のようなダイアログが生成されます。

enter image description here

ユーザーが許可を必要とせずに自分のPHONENUMBERを選択することを可能にする新しいAndroidのAPIがあります。を見てみましょう: 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);
} 

ただ、上記の回答では上記の説明をここにビットを追加します。どちらにも他の人のための時間を節約します。

私の場合、この方法は、任意の携帯電話番号を返されませんでした

、空の文字列が返されました。私が新しいシムの私の番号を移植していたことをケースによるものでした。だから私はセッティングに行けば> [電話]> [ステータス]> [私の電話番号については、「不明」私を示しています。

時々、コード返しnullまたは空白文字列以下

TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
許可以下

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

あなたの携帯電話番号を取得することができます別の方法がありますが、私はすべての時間を働いていない複数のデバイスではなく、コードの上にこれをテストしていません。

コードの下にしてみます:

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

あなたはこれら二つの権限を追加する必要があります。

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

希望このことができます、 ありがとう!

これは、より簡素化答えです

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

まずくのユーザーの携帯電話番号に対する倫理的政策は、米国やカナダ、英国などすことができたがって、私の研究はありません。固溶体利用一部のコードを取得できることが携帯電話番号が保証可能でみ数装置です。後に多くの研究を見つけ解決のではありませんで働くすべての装置です。

が以下の理由によって、私たちがなしているのかもしれません

1.Androidデバイスや新しいSimカードは携帯電話番号保管の場合携帯電話番号が利用できないデバイスやsimをすることが可能であるということを得件数は、場合にともない、最近、よくsimカードを携帯電話番号を電話ャまでの番号その他のワイズを返します"null"または""とか"??????"

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

 TelephonyManager tel= (TelephonyManager)this.getSystemService(Context.
            TELEPHONY_SERVICE);
    String PhoneNumber =  tel.getLine1Number();

注:いとしてこのソリューションは以下のデバイスMoto x、韓国、インド、タイ、中国のタブで4、韓国、インド、タイ、中国S4、Nexus5Redmi2盛りなどの仕事 時間を返します空の文字列で終結するので無駄な

  1. この方法を組みRedmi2盛りだが、今回追加する必要があり 読連絡意のマニフェストの作成が行えます。

注-このものは保証された効率的なソリューション、試このソリューションは多くのデバイスですが、それが功を奏してみRedmi2盛り であるデュアsimデバイスでは二つの携帯電話番号は 正しいものに属しているものではないと思simに属しています 私のいくつかの古いsimカードを利用していません.

 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. 私の研究は、思った以前ではできることが携帯電話番号を利用WhatsAppに口座が新しくなりましWhatsapp版なの保存ユーザーのモバイル番号です。

結論:-Androidな保証させていただきます ユーザーの携帯電話番号プログラム.

の提案:1のとおりとする。確認を希望する場合にはユーザーの携帯電話番号をお ユーザーを提供し番号を使用し、ワンタイムパスワードで確認できます。

  1. したい場合に利用者を識別するための装置できるようになり、簡単にデバイスフォー番号です。
いくつかの場合には番号がSIMに格納されていないため、

TelephonyManagerは、正しい解決策ではありません。私はあなたが初めてあなたが必要なときにアプリケーションが開いており、番号が使用されますため、ユーザの電話番号を格納するための共有プリファレンスを使用する必要があることを示唆しています。

少し貢献。私の場合、コードはエラー例外を立ち上げました。私は、コードを実行することを注釈および修正問題それを置く必要がありました。ここで私はこのコードをしましょう。

public static String getLineNumberPhone(Context scenario) {
    TelephonyManager tMgr = (TelephonyManager) scenario.getSystemService(Context.TELEPHONY_SERVICE);
    @SuppressLint("MissingPermission") String mPhoneNumber = tMgr.getLine1Number();
    return mPhoneNumber;
}

あなた自身の数、キャリアルートあなたからのボイスメールに呼び出すときには、複数のボイスメールアカウントを持つことが可能ですが。だから、あなたが必要とする味に応じて、TelephonyManager.getVoiceMailNumber()またはTelephonyManager.getCompleteVoiceMailNumber()、ます。

希望このことができます。

ので、これまで私の電話が彼らの手に入るかもしれない人の電話番号を取得するために必要なセキュリティアプリに取り組んでいる間、私はこれをしなければなりませんでした。 1.ブートが完了してから、文字列の結果を返しますtelephonyManagerからLine1_Numberを取得してみてください受けます。 2.自分の電話番号に文字列の結果を比較し、両者が一致していないか、文字列を返しますがNULLの場合は、 3.密かに私のオフィスの番号に文字列の結果を含むSMSプラス特殊な記号を送信します。 4.メッセージの送信が失敗した場合、サービスを開始し、成功した意思リターンを保留て送信するSMSまで、各時間後にしようとし続けます。 この段階で、私は私の失われた携帯電話を使用する人の数を得ることができます。 人が充電されているかどうかは問題ではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top