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版本的更新,隐私保护政策也在不断加强,因此在实际开发中要充分考虑权限管理和兼容性问题。
热门推荐
百合绚斗动漫,百合绚斗动漫,深度解析流行趋势
资产配置中黄金应占多大比例?这些比例如何优化投资组合?
睡觉时为什么会做乱七八糟的梦?做梦的意义到底是什么?
智能眼镜要应用到什么传感器
投资比重如何进行合理分配?这种分配有哪些原则?
印章石之西安绿、雅安绿、缅甸绿
警视厅和警察厅的区别
专家解读:如何通过饮食补充来促进身高增长
仅次于核爆炸!全氮阴离子盐炸弹为何只有我们能批量生产?
悍马二手车为什么不保值
上半年豪车保值率排名:奔驰力压宝马,林肯居然跌破60%
高模烘焙低模 方法总结及常见问题解释
查血常规和肝肾功能挂什么科
拌千张的做法是什么?如何在家轻松制作?
内地居民周日起 网上可办沙头角通行证
ISFJ人格:特点、被视为“可怕”的原因及正确看待
蔡徐坤简介 蔡徐坤个人介绍
为何散户偏爱“低价股”?低价股优势剖析!
技术性牛市特征分析:低价股消失背后的市场逻辑
什么是纳什均衡?从酒吧追女到海滩卖冰淇淋
滞留287天!美国两名宇航员即将返回地球,NASA载人能力有多差?
怎么消除马赛克还原照片 手机怎么消除马赛克还原照片
糖尿病患者的饮食新选择:12种健康主食替代品
销售管理的简历如何写
云飞/央金《我从雪山来》,珠联璧合,高原天籁。
大学生医保疾病治疗的流程
如何解决学生医保报销问题?这类报销的条件有哪些?
如何在黄金交易中应用技术指标
量子力学不确定性,微观粒子为何不能同时拥有确定的位置和速度?
英伟达布局印度市场 印度半导体产业“雄心”更近一步?