以编程方式获取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()
来代替。
对于这个问题没有保证的解决scheme,因为电话号码没有物理存储在所有SIM卡上,或者从networking广播到电话。 在一些需要物理地址validation的国家尤其如此,号码分配只在事后进行。 电话号码分配发生在networking上 – 可以在不更改SIM卡或设备的情况下进行更改(例如,如何支持移植)。
我知道这很痛苦,但最有可能的最好的解决办法就是要求用户input一次他/她的电话号码并存储。
更新:由于Whatsapp已经停止将电话号码显示为帐户名称,因此此答案不再可用,请不要理会此答案。
实际上,如果无法通过电话服务获得,您可能需要考虑其他解决scheme。
截至今天,你可以依靠另一个大的应用程序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); }
检查whatsapp帐户的操作types
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卡和networking运营商/手机运营商。
此外,请尝试检查电话 – >设置 – >关于 – >电话身份 ,如果你能够在那里查看号码,从上面的代码得到电话号码的可能性更高。 如果您无法在设置中查看电话号码,则无法通过此代码获取!
build议的解决方法:
- 从用户手动input用户的电话号码。
- 通过短信向用户的手机号码发送密码。
- 要求用户input密码以确认电话号码。
- 将该号码保存在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; }
只是想在这里添加一下上面的解释在上面的答案。 这将为其他人节省时间。
在我的情况下,这个方法没有返回任何手机号码,一个空string被返回。 这是因为我在新模拟器上移植了我的号码。 所以如果我进入设置>关于手机>状态>我的电话号码,它显示我“未知”。
有时,下面的代码返回null
或空string。
TelephonyManager tMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE); String mPhoneNumber = tMgr.getLine1Number();
有了下面的许可
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
还有另外一种方法,你将能够得到你的电话号码,我还没有在多个设备上testing过,但是上面的代码并不是每次都在工作。
尝试下面的代码:
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(); }
TelephonyManager是不正确的解决scheme,因为在某些情况下,号码不存储在SIM卡,由于我的build议,您应该使用共享首选项存储用户的电话号码第一次应用程序是打开的,之后,号码将用于每当你需要申请。
首先获得用户手机号码是违背道德的政策,早些时候是可能的,但现在根据我的研究,没有可靠的解决scheme可用于此,通过使用一些代码是可能的手机号码,但不能保证可能会工作只有很less的设备。 经过大量的研究,我发现只有三个解决scheme,但他们不是在所有的设备工作。
我们没有得到以下原因。
1.Android设备和新的SIM卡没有存储手机号码,如果手机号码不可用在设备和SIM卡,那么如何可能获得号码,如果任何旧手机SIM卡有手机号码,然后使用电话pipe理器,我们可以得到其他号码明智的是它会返回“null”或“”或“??????”
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> TelephonyManager tel= (TelephonyManager)this.getSystemService(Context. TELEPHONY_SERVICE); String PhoneNumber = tel.getLine1Number();
注意: – 我已经testing了以下设备的Moto x,三星标签4,三星S4,Nexus 5和红米2总理这个解决scheme,但它不工作,每次它返回空string,所以结论是没用的
- 此方法仅在Redmi 2素数中使用,但是需要在清单中添加读取联系人权限。
注意: – 这也不是有保证和有效的解决scheme,我已经在许多设备上testing过这个解决scheme,但它只能在Redmi 2 prime中使用,这是双卡模式,它给了我两个手机号码,第一个是正确的,属于我的第二个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(); }
- 在我的研究中,我发现早些时候有可能使用WhatsApp帐户获得手机号码,但现在新的Whatsapp版本不存储用户的手机号码。
结论 : – Android没有任何有保证的解决scheme,以编程方式获取用户的手机号码。
build议 :1.如果你想validation用户的手机号码,然后要求用户提供他的号码,使用otp你可以validation。
- 如果你想识别用户的设备,为此你可以很容易地获得设备的IMEI号码。
尽pipe可能有多个语音邮件帐号,但是当您从自己的号码拨打电话时,运营商会将您路由到语音邮件。 所以, TelephonyManager.getVoiceMailNumber()
或TelephonyManager.getCompleteVoiceMailNumber()
,取决于你需要的口味。
希望这可以帮助。
有一个新的Android API,允许用户select他们的电话号码,而不需要许可。 看看: 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); }
而在一个安全应用程序,需要得到谁的电话号码,以便我的手机可能会得到他们的手中,我不得不这样做; 1.接收Boot完成,然后尝试从telephonyManager获取Line1_Number,它返回一个string结果。 2.将string结果与我自己的电话号码进行比较,如果不匹配或string返回null,3.秘密发送包含string结果的短信加一个特殊符号到我的办公室号码。 4.如果消息发送失败,则启动服务并在每小时后继续尝试,直到发送的SMS挂起的意图返回成功。 通过这个步骤,我可以得到使用我丢失手机的人的号码。 这个人是否被指控并不重要。
下面是你应该怎么做这个postM世界:
private void getPhoneInfo() { if(ContextCompat.checkSelfPermission(getBaseContext(), "android.permission.READ_SMS") == PackageManager.PERMISSION_GRANTED) { TelephonyManager tMgr = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE); Log.e(LOGGING_TAG, "PHONE NUMBER = " + tMgr.getLine1Number()); } else { final int REQUEST_CODE_ASK_PERMISSIONS = 123; ActivityCompat.requestPermissions(this, new String[]{"android.permission.READ_SMS"}, REQUEST_CODE_ASK_PERMISSIONS); } }
确保您显示请求使用READ_SMS状态的权限
<uses-permission android:name="android.permission.READ_SMS"/>