Android アプリを実行しているデバイスの電話番号をプログラムで取得するにはどうすればよいですか?
20 に答える
コード:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
必要な許可:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
警告:
非常に支持されたコメントによると、注意すべきいくつかの注意事項があります。これはnull
または""
またはを返す"???????"
可能性があり、無効になった古い電話番号を返す可能性があります。デバイスを一意に識別するものが必要な場合は、getDeviceId()
代わりに使用する必要があります。
電話番号がすべての SIM カードに物理的に保存されたり、ネットワークから電話にブロードキャストされたりするわけではないため、この問題に対する確実な解決策はありません。これは、実際の住所の確認が必要な一部の国で特に当てはまり、番号の割り当ては後でのみ行われます。電話番号の割り当てはネットワーク上で行われ、SIM カードやデバイスを変更せずに変更できます (たとえば、これが移植のサポート方法です)。
面倒なことは承知していますが、おそらく最善の解決策は、ユーザーに電話番号を一度入力して保存するように依頼することです。
更新: Whatsapp が電話番号をアカウント名として公開することをやめたため、この回答は利用できなくなりました。この回答は無視してください。
テレフォニー サービスを利用できない場合は、別の解決策を検討することをお勧めします。
今日の時点で、AccountManager
. 何百万ものデバイスにこのアプリケーションがインストールされており、 経由で電話番号を取得できない場合は、これを試すことができ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);
}
actype
WhatsApp アカウントを確認する
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 カードとネットワーク オペレーター/携帯電話キャリアに依存するため、このコードは常に機能するとは限りません。
また、Phone--> Settings --> About --> Phone Identityで確認してみてください。そこに番号が表示されている場合は、上記のコードから電話番号を取得する可能性が高くなります。設定で電話番号を表示できない場合は、このコードを介して取得することはできません!
推奨される回避策:
- ユーザーからの手動入力として、ユーザーの電話番号を取得します。
- SMS 経由でユーザーの携帯電話番号にコードを送信します。
- 電話番号を確認するためにコードを入力するようにユーザーに依頼します。
- 番号を sharedpreference に保存します。
アプリの初回起動時に、上記の 4 つの手順を 1 回限りのアクティビティとして実行します。後で、電話番号が必要になるたびに、共有設定で使用可能な値を使用します。
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;
}
場合によっては、以下のコードが返される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" />
これが役立つことを願っています, ありがとう!
上記の回答の上記の説明に少し追加したいだけです。これにより、他の人も時間を節約できます。
私の場合、このメソッドは携帯電話番号を返さず、空の文字列が返されました。新しいSIMに自分の番号を移植したことが原因でした。そのため、設定>電話について>ステータス>私の電話番号に移動すると、「不明」と表示されます。
これはより単純化された答えです:
public String getMyPhoneNumber()
{
return ((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
.getLine1Number();
}
TelephonyManager
場合によっては番号が SIM に保存されないため、これは正しい解決策ではありません。共有設定を使用して、アプリケーションを初めて開いたときにユーザーの電話番号を保存することをお勧めします。番号は必要なときにいつでも使用されます。
同じことを投稿しているいくつかの回答に気付きました。まず、2021 年に変更されたものonActivityResult
は非推奨です。非推奨のソリューションは次のとおりです。
private fun requestHint() {
val hintRequest = HintRequest.Builder()
.setPhoneNumberIdentifierSupported(true)
.build()
val intent = Credentials.getClient(this).getHintPickerIntent(hintRequest)
val intentSender = IntentSenderRequest.Builder(intent.intentSender).build()
val resultLauncher = registerForActivityResult(
ActivityResultContracts.StartIntentSenderForResult()
) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val credential: Credential? = result.data?.getParcelableExtra(Credential.EXTRA_KEY)
// Phone number with country code
Log.i("mTag", "Selected phone No: ${credential?.id}")
}
}
resultLauncher.launch(intentSender)
}
注:多くの人は、これによりユーザーの携帯電話番号を取得できると考えています。通常はそうではありません。Google Play Services はいくつかの電話番号をキャッシュしており、ダイアログにはユーザーに属していない電話番号が表示されることがあります。
重要なインポートcom.google.android.gms.auth.api.credentials.Credential
リファレンス ドキュメントに詳細が記載されていますが、コードはやや非推奨になっています。
複数のボイスメール アカウントを持つことは可能ですが、自分の番号から発信すると、通信事業者はボイスメールに転送します。だから、TelephonyManager.getVoiceMailNumber()
またはTelephonyManager.getCompleteVoiceMailNumber()
必要なフレーバーに応じて。
お役に立てれば。
私の電話が誰の手に渡る可能性があるのか 、誰の電話番号を取得する必要があるセキュリティアプリに取り組んでいる間、私はこれをしなければなりませんでした。1. Boot completed を受け取り、文字列の結果を返す telephonyManager から Line1_Number を取得しようとします。2. String の結果を自分の電話番号と比較し、それらが一致しない場合、または string が null を返す場合、 3. String の結果と特別な記号を含む SMS をオフィス番号に密かに送信します。4. メッセージの送信に失敗した場合は、サービスを開始し、送信された SMS の保留中のインテントが成功するまで、1 時間ごとに試行を続けます。この手順で、紛失した電話を使用している人の番号を取得できました。その人が請求されているかどうかは関係ありません。