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版本的更新,隐私保护政策也在不断加强,因此在实际开发中要充分考虑权限管理和兼容性问题。
热门推荐
锂电池检测:从标准到安全解决方案的全面解析
青少年吃海参有什么好处和坏处
诺模图:医学统计中的可视化预测工具
交通出行指南:如何选择最佳出行方式?
如何现场评估环境空气中的异味?—《恶臭/异味现场嗅辨技术指南》
身体气味藏着健康密码,这些味道可能是疾病信号
为什么美盘黄金受到关注?美盘黄金的走势有何特点?
24颗牙齿正常吗?为了矫正拔4颗,矫正拔掉的牙齿怎么办?
2025年A股怎么走?谁会是最强主线?
当我们心情不好的时候,通过看电视可以调节吗?
一个差评意味着什么?Steam玩家不信邪测试,拉低游戏整体评价
抓犯罪嫌疑人的赏金猎人:法律解读与实务分析
如何形容童话世界:梦幻、奇幻、可爱、神秘?那些你意想不到的表达方式!
辅导员如何帮助学生备考英语四级?
想获得蔬菜100%的营养,做菜注意这几点!
磨牙是不是跟心理压力有力有关系
天珠眼数的神秘寓意:从一眼到九眼的文化解读
项目管理的过程组:从启动到收尾的完整指南
遗传性疾病有蚕豆病吗
蚕豆病怎么得来的
阿胶浆男人能喝吗?专业医生解读其功效与注意事项
监护型救护车的基本配备有什么
强迫症自我恢复指南:五种实用方法助你改善症状
历史与现代交织的文化瑰宝!探秘中国保存最完整的古代县城——平遥古城
流浪猫的救治与绝育——如何平衡流浪猫与社会环境的矛盾?
高尔夫GTI的油耗表现与同级别车型对比
2025考研复试政治备考全攻略:核心资料清单与命题趋势解密
彩超检查:原理、应用及注意事项全解析
真实又荒诞——《记忆的永恒》作品欣赏
天启大爆炸是怎么回事,天要亡大明么?