【问题标题】:How to get phone number or sim card information use android studio?如何使用 android studio 获取电话号码或 sim 卡信息?
【发布时间】:2018-10-27 10:11:59
【问题描述】:

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

我用过这段代码:

TelephonyManager tMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
phone_number.setText(tMgr.getLine1Number());

我还在 AndroidManifest 中添加了权限:

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

但我应用的所有小工具都无法获取电话号码或始终生成空值。

这是我使用的 build.gradle:

dependencies {
   implementation fileTree(dir: 'libs', include: ['*.jar'])
   //noinspection GradleCompatible
   implementation 'com.android.support:appcompat-v7:27.1.1'
   implementation 'com.android.support.constraint:constraint-layout:1.1.0'
   //noinspection GradleCompatible
   implementation 'com.google.android.gms:play-services-maps:15.0.1'
   implementation 'com.google.android.gms:play-services-location:15.0.1'
   testImplementation 'junit:junit:4.12'
   androidTestImplementation 'com.android.support.test:runner:1.0.2'
   androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

   //noinspection UseOfBundledGooglePlayServices
   implementation 'com.google.android.gms:play-services:12.0.1'
   implementation 'com.google.android.gms:play-services-auth:15.0.1'
}

【问题讨论】:

  • 我认为您需要在运行时请求此权限,因为根据文档,它的保护级别是危险的(取决于您使用的 android 版本设备运行)
  • 它返回null 导致它不可用,并且大多数情况下情况相同,因此,如果您需要根据sim执行操作(除了调用),那么您应该使用getSimSerialNumber()跨度>
  • @x0r 你的意思是如何在运行时创建权限?
  • @Sam。如何使用 getSimSerialNumber()?
  • TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); String simID = tm.getSimSerialNumber();

标签: android telephonymanager


【解决方案1】:

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

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();

编辑

  String mPhoneNumber = mTelephonyMgr.getLine1Number();

更多,visit here.

这个权限也是必须的。

&lt;uses-permission android:name="android.permission.READ_PHONE_STATE"/&gt;

我希望这会有所帮助。

【讨论】:

  • 对不起,这个代码和我用的一样,但是我要的电话号码仍然为空
  • 这个代码和我用的一样,我要的电话号码仍然为空
  • 请从头开始检查,我在开始时做了一些更改,我在我的设备上检查了它,它返回正确的输出,据我所知,该数字由您的 sim 运营商提供.如果操作员没有返回该信息,您将始终为空。每个运营商都有不同的单聚。 @dyantb
  • 我已经和你一起调整了所有代码,并保持它为空,对于这个代码(mAppContext)我有错误吗?所以问题出在提供商身上? facebook、alibaba 等网店等应用是如何处理的?
  • @dyantb 你可以用getApplicationContext()替换mAppContext。
【解决方案2】:

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

大多数电信运营商不会在 SIM 卡中添加此信息,因此它不够可靠。

有一种方法可以使用 Google-Play-Service 获取电话号码,但它也不能保证 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;

在您的 Button 的 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();
}

添加 onActivityResult

@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();
    }
}

【讨论】:

  • 对不起,你的代码没有在我身上运行,我也不明白,请帮助我
  • 在模拟器或真机上运行时无法编译
  • @dyantb 你更新了应用级别的 build.gradle 了吗?
  • @dyantb 只需清理并重建。确保您有 Internet 连接以下载库。您收到编译错误,因为未正确下载库
  • 你的code是成功的,但是为什么每一个都只出现1个电话号码呢?我的手机使用 2 张 sim 卡,我有 4 张不同的 sim 卡和可交换的,但总是只出现一张 sim 卡,虽然没有安装 sim 卡。 (例如:1.provider A = 3G, 2.provider B = 4G, 3.provider C = 4G, 4.provider D = 4G 并且总是出现provider a)
猜你喜欢
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
相关资源
最近更新 更多