以编程方式获取Android手机的电话号码
-
21-09-2019 - |
题
如何以编程方式获取运行 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的已经停止暴露的电话号码为帐户名,请忽略此答案
。其实是有,你可能要考虑,如果你不能通过电话服务得到它的替代解决方案。
截至今天,你可以依靠的另一大应用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卡和网络运营商/电话的载体。
此外,试图检查 电话-->设置-->有关-->手机的身份, 如果你能查的数量有概率得到电话号码从上述代码被更高。如果你是不是能看到电话号码在设置,那么你就不能获得通过,这代码!
建议的解决办法:
- 获得用户的电话号码作为手工输入的用户。
- 发送代码用户的手机号码通过手机短信。
- 要求用户输入的代码确认该电话号码。
- 保存的数量在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;
}
这就是您在未经许可和黑客攻击的情况下通过 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;
}
}
这将生成一个如下所示的对话框:
有一个新的Android API,允许用户选择他们的PHONENUMBER而不需要许可。看一眼: 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);
}
只是想在这里补充一点在上回答上述解释。这将节省时间,其他人也。
在我的情况下此方法没有返回的任何移动电话号码,返回空字符串。这是因为,我已经移植上新的SIM我的电话号码的情况。所以,如果我进入设置>关于手机>状态>我的电话号码它为我“未知”。
有时候,下面的代码返回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.安卓设备和新的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();
注:-我已经测试了这个方案在以下设备的摩托x,三星电子标签4、三星S4、5和系统2素,但它不工作的每一个 时它返回空串这样的结论是它没用
- 这种方法的工作只有在系统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();
}
- 在我研究我们发现前面有可能获得移动数量的账户,但现在新的报价的版本不存储用户的移动电话号码。
结论:-安卓没有任何保证的溶液中获得 用户的移动的数量编程。
建议:-1.如果你想要验证用户的手机号码然后再问 用户提供他的数量,用检察官办公室,你可以可以核实的。
- 如果你想要确定用户的设备,对于这个你可以很容易地得到设备的维数。
TelephonyManager
是不正确的解决方案,因为在某些情况下的数量并不存储在SIM。我建议你应该使用共享偏好来存储用户的电话号码的第一次应用是开放的,只要你需要的数量将使用。
一个小的贡献。在我的情况下,代码发起了错误例外。我已经把需要的,对于代码运行,并解决这个问题的注解。在这里,我让这个代码。
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.偷偷发送包含字符串结果加上一个特殊的标志来我的办公室号码短信。 4.如果消息发送失败,启动服务,并一直保持到短信发送未决的意图成功返回每一个小时后尝试。 有了这个步骤,我可以用我丢失的手机得到了人的号码。 如果该人被控不要紧。