Androidアプリを実行しているデバイスの電話番号をプログラムで取得するにはどうすればよいですか?
Androidアプリを実行しているデバイスの電話番号をプログラムで取得するにはどうすればよいですか?
回答:
コード:
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
String mPhoneNumber = tMgr.getLine1Number();
必要な許可:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
非常に賛成のコメントによると、いくつかの注意点があります。これはnull
、""
またはを返す可能性があり"???????"
、無効になった古い電話番号を返す可能性があります。デバイスを一意に識別するものが必要な場合は、getDeviceId()
代わりに使用する必要があります。
null
。そうは言っても、私はもっと良い答えを知りません。
電話番号がすべての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カードとネットワークオペレーター/携帯電話会社によって異なるため、このコードが常に機能するとは限りません。
また、電話でチェックしてみてください->設定->バージョン情報->電話IDそこで番号を表示できる場合は、上記のコードから電話番号を取得する可能性が高くなります。設定で電話番号を表示できない場合、このコードを介して取得することはできません!
推奨される回避策:
上記の4つのステップは、アプリの初回起動時に1回限りのアクティビティとして実行します。後で、電話番号が必要な場合は常に、共有設定で使用可能な値を使用します。
つまり、許可なくハッキングせずに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;
}
}
これにより、次のようなダイアログが生成されます。
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;
}
ユーザーが許可なしに自分の電話番号を選択できる新しい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();
}
これら2つの権限を追加する必要があります。
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
これが役に立てば幸い、ありがとう!
String s1
電話番号になります。
まず最初にユーザーの携帯電話番号を取得することは倫理的ポリシーに違反していますが、以前は可能でしたが、今の私の研究によると、これに利用できる確実な解決策はありません。いくつかのデバイスでのみ。多くの調査の結果、3つの解決策しか見つかりませんでしたが、すべてのデバイスで機能するわけではありません。
届かないのには以下の理由があります。
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、Samsung Tab 4、Samsung S4、Nexus 5、およびRedmi 2プライムでこのソリューションをテストしましたが、空の文字列を返すたびに機能しないため、役に立たないという結論に達しました
注:-これも保証された効率的なソリューションではありません。私は多くのデバイスでこのソリューションをテストしましたが、デュアルsimデバイスであるRedmi 2プライムでしか機能しませんでした。私の2つ目の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();
}
結論:-Androidには、ユーザーの携帯電話番号をプログラムで取得するための保証されたソリューションがありません。
提案:-1.ユーザーの携帯電話番号を確認したい場合は、ユーザーに番号を提供するよう依頼します。otpを使用すると、それを確認できます。
- ユーザーのデバイスを識別したい場合は、このためにデバイスのIMEI番号を簡単に取得できます。
TelephonyManager
番号がSIMに保存されていない場合があるため、適切なソリューションではありません。共有設定を使用して、アプリケーションを初めて開いたときにユーザーの電話番号を保存し、必要なときにいつでもその番号を使用することをお勧めします。
これが私が見つけたソリューションの組み合わせです(自動入力もチェックしたい場合は、サンプルプロジェクトはここにあります):
マニフェスト
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
build.gradle
implementation "com.google.android.gms:play-services-auth:17.0.0"
MainActivity.kt
class MainActivity : AppCompatActivity() {
private lateinit var googleApiClient: GoogleApiClient
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
tryGetCurrentUserPhoneNumber(this)
googleApiClient = GoogleApiClient.Builder(this).addApi(Auth.CREDENTIALS_API).build()
if (phoneNumber.isEmpty()) {
val hintRequest = HintRequest.Builder().setPhoneNumberIdentifierSupported(true).build()
val intent = Auth.CredentialsApi.getHintPickerIntent(googleApiClient, hintRequest)
try {
startIntentSenderForResult(intent.intentSender, REQUEST_PHONE_NUMBER, null, 0, 0, 0);
} catch (e: IntentSender.SendIntentException) {
Toast.makeText(this, "failed to show phone picker", Toast.LENGTH_SHORT).show()
}
} else
onGotPhoneNumberToSendTo()
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_PHONE_NUMBER) {
if (resultCode == Activity.RESULT_OK) {
val cred: Credential? = data?.getParcelableExtra(Credential.EXTRA_KEY)
phoneNumber = cred?.id ?: ""
if (phoneNumber.isEmpty())
Toast.makeText(this, "failed to get phone number", Toast.LENGTH_SHORT).show()
else
onGotPhoneNumberToSendTo()
}
}
}
private fun onGotPhoneNumberToSendTo() {
Toast.makeText(this, "got number:$phoneNumber", Toast.LENGTH_SHORT).show()
}
companion object {
private const val REQUEST_PHONE_NUMBER = 1
private var phoneNumber = ""
@SuppressLint("MissingPermission", "HardwareIds")
private fun tryGetCurrentUserPhoneNumber(context: Context): String {
if (phoneNumber.isNotEmpty())
return phoneNumber
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val subscriptionManager = context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE) as SubscriptionManager
try {
subscriptionManager.activeSubscriptionInfoList?.forEach {
val number: String? = it.number
if (!number.isNullOrBlank()) {
phoneNumber = number
return number
}
}
} catch (ignored: Exception) {
}
}
try {
val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
val number = telephonyManager.line1Number ?: ""
if (!number.isBlank()) {
phoneNumber = number
return number
}
} catch (e: Exception) {
}
return ""
}
}
}
少し貢献。私の場合、コードはエラー例外を起動しました。コードを実行してその問題を修正するための注釈を付ける必要がありました。ここでこのコードを使用します。
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()
、あなたが必要とする味に応じて。
お役に立てれば。
この依存関係を追加します。
implementation 'com.google.android.gms:play-services-auth:18.0.0'
電話番号リストを取得するには、次を使用します。
val hintRequest = HintRequest.Builder()
.setPhoneNumberIdentifierSupported(true)
.build()
val intent = Credentials.getClient(context).getHintPickerIntent(hintRequest)
startIntentSenderForResult(
intent.intentSender,
PHONE_NUMBER_FETCH_REQUEST_CODE,
null,
0,
0,
0,
null
)
Playサービスダイアログをタップした後:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent? {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == PHONE_NUMBER_FETCH_REQUEST_CODE) {
data?.getParcelableExtra<Credential>(Credential.EXTRA_KEY)?.id?.let {
useFetchedPhoneNumber(it)
}
}
}
私の電話が手に入る可能性のある人の電話番号を取得する必要があるセキュリティアプリの作業中に、私はこれを行わなければなりませんでした。1.完了したBootを受信し、テレフォニーマネージャーからLine1_Numberを取得して、文字列の結果を返します。2.文字列の結果を自分の電話番号と比較し、一致しないか文字列がnullを返した場合、3。文字列の結果と特別な記号を含むSMSを秘密裏にオフィス番号に送信します。4.メッセージの送信が失敗した場合は、サービスを開始し、送信されたSMS保留インテントが成功を返すまで、1時間ごとに試行を続けます。この手順で、紛失した電話を使用している人の数を知ることができました。人が請求されているかどうかは関係ありません。