如何以编程方式获取我设备的手机号码?

Huz*_*sif 6 java android phone-number telephonymanager android-subscriptionmanager

我曾尝试使用 2 种方法来检索我的电话号码,但它们都不起作用。我用了:

  1. 电话经理
  2. 订阅管理器

我确实得到了网络名称、国家/地区 iso 和 IMEI,但是每当我尝试返回 Number 时,它什么都不返回。

我还为这些添加了所有必需的权限!我的清单看起来像:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
Run Code Online (Sandbox Code Playgroud)

使用TelephonyManager 的代码:

TelephonyManager phoneMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
phoneMgr.getLine1Number()
Run Code Online (Sandbox Code Playgroud)

使用SubscriptionManager 的代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        List<SubscriptionInfo> subscription = SubscriptionManager.from(getApplicationContext()).getActiveSubscriptionInfoList();
        for (int i = 0; i < subscription.size(); i++) {
            SubscriptionInfo info = subscription.get(i);
            Log.e("TAG", "number " + info.getNumber());
            Log.e("TAG", "network name : " + info.getCarrierName());
            Log.e("TAG", "country iso " + info.getCountryIso());
        }
    }
Run Code Online (Sandbox Code Playgroud)

在两次尝试中,我都一无所获!

有没有其他方法可以获取电话号码,或者我做错了什么?

Bho*_*tel 8

如今,TelephonyManager这对我们没有帮助。未经许可的 Play Services API 是一个很好的解决方案。

此依赖项对此很有用

 implementation 'com.google.android.gms:play-services-auth:16.0.1'
Run Code Online (Sandbox Code Playgroud)

现在在您的Activity.java 中

GoogleApiClient  mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(Auth.CREDENTIALS_API)
                .build();

        if (mGoogleApiClient != null) {
            mGoogleApiClient.connect();
        }
Run Code Online (Sandbox Code Playgroud)

在此之后请求电话号码

 HintRequest hintRequest = new HintRequest.Builder()
                .setPhoneNumberIdentifierSupported(true)
                .build();

        PendingIntent intent = Auth.CredentialsApi.getHintPickerIntent(mGoogleApiClient, hintRequest);
        try {
            startIntentSenderForResult(intent.getIntentSender(), 1008, null, 0, 0, 0, null);
        } catch (IntentSender.SendIntentException e) {
            Log.e("", "Could not start hint picker Intent", e);
        }
Run Code Online (Sandbox Code Playgroud)

现在你需要onActivityResult像这样处理响应:

    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
            case 1008:
                if (resultCode == RESULT_OK) {
                    Credential cred = data.getParcelableExtra(Credential.EXTRA_KEY);
//                    cred.getId====: ====+919*******
                    Log.e("cred.getId", cred.getId());
                    userMob = cred.getId();


                } else {
                    // Sim Card not found!
                    Log.e("cred.getId", "1008 else");

                    return;
                }


                break;
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 它显示 GoogleApiClient 已被弃用。我应该使用什么? (5认同)
  • mGoogleApiClient 将返回您注册的任何号码,而不是其他任何号码。 (2认同)