如何使用android studio获取电话号码或sim卡信息?

如何使用android studio获取电话号码或sim卡信息?,android,telephonymanager,Android,Telephonymanager,如何使用android studio获取电话号码或sim卡信息?(SIM卡1或2) 我使用了以下代码: TelephonyManager tMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); phone_number.setText(tMgr.getLine1Number()); 我还在AndroidManifest中添加了权限: <uses-permission android:name="andr

如何使用android studio获取电话号码或sim卡信息?(SIM卡1或2)

我使用了以下代码:

TelephonyManager tMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
phone_number.setText(tMgr.getLine1Number());
我还在AndroidManifest中添加了权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

没有可靠的方法从SIM卡获取电话号码。TelephonyManager从SIM卡中读取电话号码,但由电信运营商将此信息添加到SIM卡中

大多数电信运营商没有在SIM卡中添加这些信息,因此其可靠性不够

有一种方法可以使用Google Play服务获取电话号码,但它也不能保证100%返回电话号码。你可以这样做

build.gradle
中添加以下依赖项:

dependencies {
    ...
    compile 'com.google.android.gms:play-services:11.6.0'
    compile 'com.google.android.gms:play-services-auth:11.6.0'
}
MainActivity.java
中创建两个常量:

private static final int PHONE_NUMBER_HINT = 100;
private final int PERMISSION_REQ_CODE = 200;
在按钮的
onclick
中添加以下内容:

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

try {
  final GoogleApiClient googleApiClient =
    new GoogleApiClient.Builder(MainActivity.this).addApi(Auth.CREDENTIALS_API).build();

  final PendingIntent pendingIntent =
    Auth.CredentialsApi.getHintPickerIntent(googleApiClient, hintRequest);

  startIntentSenderForResult(
    pendingIntent.getIntentSender(),
    PHONE_NUMBER_HINT,
    null,
    0,
    0,
    0
  );
} catch (Exception e) {
    e.printStackTrace();
}
添加活动结果

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PHONE_NUMBER_HINT && resultCode == RESULT_OK) {
        Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
        final String phoneNumber = credential.getId();
    }
}

您可以使用以下几种方法:

mTelephonyMgr = (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);

String countryiso=mTelephonyMgr.getSimCountryIso();

String simOperator=mTelephonyMgr.getSimOperator();

String  simOperatorName=mTelephonyMgr.getSimOperatorName();

String  simSerialNo=mTelephonyMgr.getSimSerialNumber();

int     simState=mTelephonyMgr.getSimState();

String  subscriberID=mTelephonyMgr.getSubscriberId();
编辑

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PHONE_NUMBER_HINT && resultCode == RESULT_OK) {
        Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
        final String phoneNumber = credential.getId();
    }
}
更多

这一许可也是必要的


我希望这会有所帮助。

我认为您需要在运行时请求此权限,因为根据文档(取决于您使用的android版本设备运行时)它的保护级别是危险的,它会返回null,因为它不可用,并且在大多数情况下情况相同,因此,如果您需要根据sim卡执行操作(除了调用),那么您应该使用
getSimSerialNumber()
@x0r如何在运行时创建权限您的意思是?@Sam.如何使用getSimSerialNumber()?
TelephonyManager tm=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);字符串simID=tm.getSimSerialNumber()
抱歉,此代码与我使用的代码相同,但我想要的电话号码保持为空。此代码与我使用的代码相同,我想要的电话号码保持为空。请从头检查,我在开始时做了一些更改,并在我的设备上进行了检查,它返回正确的输出,据我所知,该号码由您的sim卡提供运算符。如果运算符不返回该信息,您将始终得到null。每个运算符都有不同的mono-poly。@dyantbI已为该代码调整了所有代码,并将其保持为null(mAppContext)我有一个错误?那么问题出在提供商身上?像facebook、阿里巴巴和其他在线商店这样的应用程序是如何处理的?@dyantb您可以用
getApplicationContext()替换mAppContext
。很抱歉,您的代码没有在我身上运行,我也不明白,在emulator或real中运行时,请帮助我不要编译phone@dyantb您是否已更新应用程序级别的build.gradle?@dyantb只需清理并重新生成。请确保您具有internet连接以下载库。您将收到编译错误,因为库为not下载正确您的代码成功,但为什么每个都只显示一个电话号码?我的手机使用2张sim卡,我有4张不同的sim卡,可交换,但始终只显示其中一张sim卡,尽管未安装sim卡。(示例:1.provider A=3G,2.provider B=4G,3.provider C=4G,4.provider D=4G,始终显示为provider A)
  String mPhoneNumber = mTelephonyMgr.getLine1Number();