web-dev-qa-db-ja.com

プログラムでAndroid携帯の電話番号を取得する

Androidアプリを実行しているデバイスの電話番号をプログラムで取得する方法を教えてください。

403
jkap

コード:

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

必要な許可:

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

警告:

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

467
Alex Volovoy

電話番号がすべてのSIMカードに物理的に格納されているわけでも、ネットワークから電話にブロードキャストされているわけでもないため、この問題に対する保証された解決策はありません。これは、物理アドレスの検証が必要な国では特に当てはまります。番号の割り当ては後で行われるだけです。電話番号の割り当てはネットワーク上で行われ、SIMカードやデバイスを変更することなく変更できます(たとえば、これは移植のサポート方法です)。

私はそれが痛みであることを知っています、しかしたぶん最も良い解決策はただ彼/彼女の電話番号を一度入力してそれを保存するようにユーザーに頼むことです。

145
Johan

更新: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をインストールしなかった場合はもちろん、あなたはそれを取得できないかもしれませんが、とにかく試してみる価値があります。そして、あなたは常にユーザーに確認を求めるべきです。

40
Chor Wai Chun

私の 以前の回答に掲載されているように

以下のコードを使用してください。

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

AndroidManifest.xmlで、次の権限を付与します。

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

ただし、携帯電話番号はSIMカードとネットワーク事業者/携帯電話会社に依存しているため、このコードは常に機能するわけではありません。

また、Phone - > Settings - > About - > Phone Identityをチェックインしてみてください。そこに番号が表示されている場合は、電話番号が上記のコードは高いです。あなたが設定で電話番号を見ることができないならば、あなたはこのコードを通して得ることができないでしょう!

推奨される回避策:

  1. ユーザーからの手動入力としてユーザーの電話番号を取得します。
  2. SMSでユーザーの携帯電話番号にコードを送信してください。
  3. 電話番号を確認するためのコードを入力するようにユーザーに依頼してください。
  4. 共有設定に番号を保存します。

アプリの初回起動時に、上記の4つの手順を1回限りのアクティビティとして実行します。その後、電話番号が必要なときはいつでも、共有設定で利用可能な値を使用します。

30
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-phone-number から取得したコード

13
Emil Hajric

上記の回答の上記の説明に、ここに少し追加してください。これは他の人にとっても時間を節約します。

私の場合、このメソッドは携帯電話番号を返さず、空の文字列が返されました。私が自分の番号を新しいシムに移植したことが原因でした。だから、私が設定>電話について>ステータス>私の電話番号の順に進むと、それは私に "Unknown"と表示します。

8
user_CC

ユーザーが許可を必要とせずに自分の電話番号を選択できるようにする新しい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);
} 
8
Wirling

時には、以下のコードは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();
}

これら2つの権限を追加する必要があります。

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

これが役立つことを願っています、ありがとう!

8
activesince93

そのため、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

5
Dmide

これはもっと簡単な答えです。

public String getMyPhoneNumber()
{
    return ((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
            .getLine1Number();
}
4
E P Lewis

TelephonyManagerは適切なソリューションではありません。場合によっては、番号がSIMに保存されないため、アプリケーションを最初に開いたときに共有設定を使用してユーザーの電話番号を保存する必要があります。あなたはアプリケーションに必要です。

3
Naveed Ahmad

最初にすべてのユーザーに携帯電話番号を取得することは倫理的方針に違反していましたが、以前は可能でしたが、現在のところ、これを解決するための解決策はありません。いくつかのデバイスでのみ。多くの研究の結果、私は3つの解決策しか見つけられなかったが、それらはすべての装置では機能していない。

我々が得られない理由は以下の通りです。

1.Androidデバイスと新しい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、Samsung Tab 4、Samsung S4、Nexus 5およびRedmi 2プライムでテストしましたが、空の文字列が返されるたびに機能するわけではないので結論は役に立ちません

  1. このメソッドはRedmi 2の素数でのみ機能していますが、このためにはマニフェストに読み取り連絡許可を追加する必要があります。

注: - これも保証された効率的な解決策ではない、私は多くのデバイスでこのソリューションをテストしましたが、それは私に2つの携帯電話番号を与えますそれは私が使用していない私のいくつかの古いSIMカードに属している私の2番目のシムに属していません。

 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.ユーザーの携帯電話番号を確認したい場合は、otpを使用してユーザーに携帯電話番号の入力を依頼します。

  1. ユーザーのデバイスを識別したい場合は、これでデバイスのIMEI番号を簡単に取得できます。
3

ちょっとした貢献。私の場合、コードはエラー例外を発生させました。コードを実行してその問題を修正するための注釈を入れる必要がありました。ここに私はこのコードをさせました。

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

お役に立てれば。

0
Jim