我如何通过编程方式获得正在运行我的android应用程序的设备的电话号码?
当前回答
这个问题没有保证的解决方案,因为电话号码不是物理地存储在所有sim卡上,也不是从网络广播到电话上。在一些需要物理地址验证的国家尤其如此,只有在验证之后才会分配号码。电话号码分配是在网络上进行的,并且可以在不改变SIM卡或设备的情况下进行更改(例如,这就是支持移植的方式)。
我知道这很痛苦,但最有可能的最好的解决方案是让用户输入一次他/她的电话号码并存储它。
其他回答
一点小小的贡献。在我的例子中,代码启动了一个错误异常。我需要把一个注释,为代码运行和修复这个问题。这里我让这段代码。
public static String getLineNumberPhone(Context scenario) {
TelephonyManager tMgr = (TelephonyManager) scenario.getSystemService(Context.TELEPHONY_SERVICE);
@SuppressLint("MissingPermission") String mPhoneNumber = tMgr.getLine1Number();
return mPhoneNumber;
}
只是想在以上回答中对以上解释做一点补充。这也会为其他人节省时间。
在我的情况下,这个方法没有返回任何手机号码,返回一个空字符串。这是由于我把我的号码移植到新的sim卡上的情况。所以如果我进入设置>关于电话>状态>我的电话号码,它显示我“未知”。
虽然你可以有多个语音信箱帐号,但当你用自己的号码打电话时,运营商会把你转到语音信箱。因此,telephonymanager。getvoicemailnumber()或telephonymanager。getcompletevoicemailnumber(),这取决于你需要的风格。
希望这能有所帮助。
我注意到有几个回复都发了同样的东西。首先,从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)
}
注意:虽然很多人认为这可以让你检索用户的手机号码。通常情况并非如此。谷歌播放服务缓存了几个电话号码,有时对话框显示电话号码,其中不属于用户。
一个重要的导入。com.google.android.gms.auth.api.credentials.Credential
参考文档提供了详细信息,但代码有些不推荐。
首先,获取用户的手机号码是违反道德政策的,以前是可能的,但现在根据我的研究,没有可靠的解决方案,通过使用一些代码,有可能获得手机号码,但不能保证可能只在少数设备上工作。经过大量的研究,我发现只有三个解决方案,但他们不是在所有设备工作。
有以下原因,为什么我们没有得到。
1.Android设备和新的Sim卡没有存储手机号码,如果手机号码在设备和Sim卡中都不可用,那么如何获得号码,如果任何旧的Sim卡有手机号码,那么使用Telephony manager我们可以获得号码,否则它将返回“null”或“”或“??????”
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
TelephonyManager tel= (TelephonyManager)this.getSystemService(Context.
TELEPHONY_SERVICE);
String PhoneNumber = tel.getLine1Number();
注:-我已经在以下设备Moto x,三星Tab 4,三星S4, Nexus 5和红米2 prime上测试了这个解决方案,但它并不是每一个都有效 Time返回空字符串,所以结论是没有用的
此方法仅适用于红米2 ',但为此需要添加 读取清单中的联系人权限。
注意:-这也不是保证和有效的解决方案,我已经在许多设备上测试了这个解决方案,但它只在红米2撇中工作 哪个是双卡设备它给了我两个手机号码第一个是 正确,但第二个不属于我的第二个模拟,它属于 我的一些旧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();
}
在我的研究中,我发现之前使用WhatsApp账户可以获得手机号码,但现在新的WhatsApp版本不存储用户的手机号码。
结论:Android没有任何可靠的解决方案 用户的手机号码。 建议:- 1。如果你想验证用户的手机号码,请问 用户提供他的号码,使用otp可以验证。 如果你想识别用户的设备,你可以很容易地获得设备IMEI号。
推荐文章
- Android SDK管理器无法打开
- 如何将DecimalFormat的小数分隔符从逗号更改为点/点?
- Android谷歌maps java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/ProtocolVersion
- android中textview的圆角
- 在Android中,对话框被取消或被取消有什么区别?
- 在ScrollView触摸处理中的HorizontalScrollView
- 何时在Android中使用RxJava,何时使用Android架构组件中的LiveData ?
- 如何在Android项目中使用ThreeTenABP
- 指定的子节点已经有一个父节点。你必须先在子对象的父对象上调用removeView() (Android)
- 我的Android设备没有出现在adb设备列表中
- 在没有安装apk的情况下获取Android .apk文件的VersionName或VersionCode
- Fragment onResume() & onPause()不会在backstack上被调用
- 如何设置基线对齐为假提高性能在线性布局?
- 如何获得当前屏幕方向?
- 如何在Android中渲染PDF文件