问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Android开发实战:使用TelephonyManager获取IMSI详解

创作时间:
作者:
@小白创作中心

Android开发实战:使用TelephonyManager获取IMSI详解

引用
CSDN
11
来源
1.
https://blog.csdn.net/ansondroider/article/details/128975045
2.
https://blog.csdn.net/qiuchangyong/article/details/121168431
3.
https://blog.csdn.net/nodonoidea/article/details/118461676
4.
https://blog.51cto.com/u_16213428/12032628
5.
https://blog.csdn.net/P876643136/article/details/88686313
6.
https://blog.csdn.net/zisuchen/article/details/139857372
7.
https://blog.51cto.com/u_16175512/8003418
8.
https://blog.51cto.com/u_16213629/8816443
9.
https://blog.csdn.net/niyingxunzong/article/details/77188040
10.
https://www.cnblogs.com/linjiqin/archive/2011/02/26/1965682.html
11.
https://www.crifan.org/imsi_msin_obtained_by_code_android_10_mi_9/

在Android开发中,获取IMSI(国际移动用户识别码)是许多应用场景的基础需求,比如设备管理、用户身份验证等。本文将详细介绍如何使用TelephonyManager安全高效地读取IMSI,并提供完整的代码示例。

IMSI简介

IMSI(International Mobile Subscriber Identity)是用于识别特定用户在移动网络中身份的数字,通常由15位数字组成。它包含以下部分:

  • MCC(Mobile Country Code):移动国家码,标识用户所在的国家
  • MNC(Mobile Network Code):移动网络码,标识用户所连接的移动网络
  • MSIN(Mobile Subscriber Identification Number):移动用户识别码

权限申请

在Android中,获取IMSI需要申请READ_PHONE_STATE权限。从Android 6.0(API 23)开始,还需要在运行时动态申请该权限。

在AndroidManifest.xml中声明权限

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

运行时动态申请权限

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
        != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_CODE_PERMISSION);
} else {
    getIMSI();
}

获取IMSI的具体实现

单卡手机

对于单卡手机,可以直接使用TelephonyManagergetSubscriberId()方法获取IMSI。

private void getIMSI() {
    TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
    String imsi = telephonyManager.getSubscriberId(); // 获取IMSI
    textView.setText("IMSI: " + imsi);
}

双卡手机

双卡手机需要通过卡槽ID来区分不同的SIM卡。可以通过SubscriptionManager获取所有有效的订阅信息,然后根据订阅ID获取对应的IMSI。

SubscriptionManager subscriptionManager = SubscriptionManager.from(this);
List<SubscriptionInfo> subscriptionInfoList = subscriptionManager.getActiveSubscriptionInfoList();

if (subscriptionInfoList != null) {
    for (SubscriptionInfo subscriptionInfo : subscriptionInfoList) {
        int subId = subscriptionInfo.getSubscriptionId();
        String imsi = telephonyManager.getSubscriberId(subId);
        Log.d(TAG, "IMSI for subId " + subId + ": " + imsi);
    }
}

特殊情况处理

  1. SIM卡未插入或未激活:在这种情况下,getSubscriberId()可能会返回null。需要在代码中进行判断和处理。
if (imsi == null) {
    Log.w(TAG, "SIM card is not inserted or not activated");
}
  1. 权限被拒绝:如果用户拒绝了权限申请,需要友好提示用户。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == REQUEST_CODE_PERMISSION) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            getIMSI();
        } else {
            Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show();
        }
    }
}

完整代码示例

以下是一个完整的Activity代码示例,展示了如何安全地获取IMSI:

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_CODE_PERMISSION = 1;
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.imsiTextView);

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_CODE_PERMISSION);
        } else {
            getIMSI();
        }
    }

    private void getIMSI() {
        TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
        SubscriptionManager subscriptionManager = SubscriptionManager.from(this);
        List<SubscriptionInfo> subscriptionInfoList = subscriptionManager.getActiveSubscriptionInfoList();

        if (subscriptionInfoList != null) {
            for (SubscriptionInfo subscriptionInfo : subscriptionInfoList) {
                int subId = subscriptionInfo.getSubscriptionId();
                String imsi = telephonyManager.getSubscriberId(subId);
                textView.append("IMSI for subId " + subId + ": " + imsi + "\n");
            }
        } else {
            String imsi = telephonyManager.getSubscriberId();
            textView.setText("IMSI: " + imsi);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == REQUEST_CODE_PERMISSION) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                getIMSI();
            } else {
                Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

通过以上步骤,你可以在Android应用中安全高效地获取IMSI信息。需要注意的是,随着Android版本的更新,隐私保护政策也在不断加强,因此在实际开发中要充分考虑权限管理和兼容性问题。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号