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的具体实现
单卡手机
对于单卡手机,可以直接使用TelephonyManager的getSubscriberId()方法获取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);
}
}
特殊情况处理
- SIM卡未插入或未激活:在这种情况下,
getSubscriberId()可能会返回null。需要在代码中进行判断和处理。
if (imsi == null) {
Log.w(TAG, "SIM card is not inserted or not activated");
}
- 权限被拒绝:如果用户拒绝了权限申请,需要友好提示用户。
@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版本的更新,隐私保护政策也在不断加强,因此在实际开发中要充分考虑权限管理和兼容性问题。
热门推荐
混动VS燃油,谁才是15-20万级家用SUV最优选?
《生化危机7》21点DLC玩法介绍及通关要点
动作即时奖励:强化学习中的核心概念与实践应用
刚出生的宝宝用多少度的水泡奶粉合适?
蓝筹股板块的定义是什么?这些股票为何备受投资者青睐?
2025教育新赛道的机遇和挑战报告
央视推荐:80部按中国历史顺序排列的纪录片
冠心病支架手术后,日常生活中该注意什么?建议一定要了解
梦见算卦是什么预兆
教你写场景的三种简单方法
碳化硅功率器件:电动汽车充电器效率提升的关键技术
灵魂探索新发现:国际科学家揭示灵魂对话的方法和奥秘
dota2国服启动项命令大全
如何在一场大灾难之后存活下去?普通人的生存小方法
反射式望远镜校准篇:调焦座的准直
台风来了怎么办?这份指南请收好
如何修改 AI 生成的内容?让 AI 文案更有人味的 4 个实用方法
排名第一的减肥运动,不是跑步,它的效果远超跑步
人物Logo设计:塑造品牌个性的视觉叙事
《在柏林》:一部反映战争残酷性的微型小说
探索古代智慧的结晶——珍珑棋局的真实性
如何预防白血病?医生提示:远离白血病,记住8点,降低发病风险
银河系外侧的旋转速度竟然更慢?
深度宁静:十分钟冥想的神奇效果!
探索无限想象:日本触手文化的神秘世界与象征意义
如何在恋爱中维护良好的沟通与信任,建立幸福关系
西葫芦致癌的说法是真的吗?厨房里的这些坏习惯容易致癌
浅谈诗歌押韵的几点规则
如何正确开启装甲车以确保驾驶安全?这种开启方法有哪些关键步骤?
【快速实践】类激活图(CAM,class activation map)可视化