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版本的更新,隐私保护政策也在不断加强,因此在实际开发中要充分考虑权限管理和兼容性问题。
热门推荐
这个与众不同的博物馆,告诉您羽绒的“前世今生”!
孕妇用的洗发水不能含有什么成分?致畸率最高的10个洗发水
狗狗认识自己的父母吗(为什么小狗长大就不认识妈妈了)
为什么越来越多的年轻人放弃传统工作,投身灵活就业?
2024年下半年教师资格证考试:通过率揭秘与备考指南
支持Qi无线充电协议的手机:优势、应用场景与未来展望
国际纸张标准:A、B、C系列纸张尺寸对比
RTK作业原理及作业流程
足部健康指南:足底筋膜炎和拇趾外翻的专业解析与选鞋建议
项目前期规划的全面指南:从目标设定到项目收尾
中华文化掌故:六大茶系的品鉴
三亚潜水完整指南!四大潜水地点如何选择?专门针对潜水初学者
石菖蒲的功效与作用
今日蒜苗最新行情价格表?
古代战争中的箭矢:从制作到回收的智慧
外出旅游食品安全小贴士!
多吃这类食物,可以减轻脂肪肝
笔记本无线网络适配器完全指南:从入门到精通
2024年险资举牌高达20次,2025年还会继续吗?
供奉供品:对逝者的尊敬与怀念
离婚财产证据如何收集?这份指南请收好
健康管理系统:个性化健康方案定制
2024新疆考古工作汇报会:实证中华民族多元一体,讲好中国新疆故事
朱载堉的《十不足歌》和吴国发的《政客不足歌》
直播中如何引导观众进行互动
秋天吃这5种食物最养脾胃!隔天吃一次,气血足了,身体更好了
一文搞懂标普500指数:观察美国企业全貌的最佳指标
如何应对信用卡的高利息和费用
怎样维护夫妻感情
春晚最出圈的机器人和泰山机器狗“师出同门”,前年8月推出,曾亮相机器人大会