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版本的更新,隐私保护政策也在不断加强,因此在实际开发中要充分考虑权限管理和兼容性问题。
热门推荐
黄欣伟:租售比“又有了”,笑着笑着就哭了
Unity 基础——脚本管理与序列化详解:从入门到高级
会计离职前的交接清单包括哪些内容?
重塑睡眠习惯,提升你的睡眠质量
空压机节能改造的10种实用方法
北京大学经济学院:博古通今,经世济民
大明湖畔是哪里的景点?济南的璀璨明珠,邀你共赏湖光山色之美!
股票交易的手续费:那些你不得不知的背后成本
元朝为何迅速灭亡?元世祖忽必烈埋下祸根致使皇位更替频繁
为什么八月十五是中秋节?中秋节简介
山东威海:传统旅游城市如何握住“流量密码”
源码之家的代码如何使用
破局质量控制:解锁"三不政策"的底层逻辑与实战攻略
H.265编解码技术:视频会议与分布式拼接系统的性能新引擎
煮苹果水的功效与作用是什么
拉肚子之后有什么注意事项
培养科学文化要从孩子抓起,提高全民科学素养
2个月大比格犬的饮食指南(让你的宠物健康成长)
我国无奈的三个复姓,明明是国姓,却经常被误认为是日本姓氏
轻松解决!高速公路ETC扣费异常搞定指南
广清永高铁最大赢家的永州,从高铁边缘有望迈入湖南高铁枢纽C位
线性电源与开关电源:了解差异并确定最佳匹配
SVG无功补偿装置常见故障及解决措施
中药命名背后的学问
王颖:都市职场女性电视剧兴起的原因
天蝎男在意颜值吗,天蝎男的审美世界:颜值真的那么重要吗?(通用2篇)
【图集】韶关丹霞山首开汉服文化活动,一展自然与文化融合之美
为什么安全生产风险管控制度对企业至关重要?
游戏化学习在企业培训系统中的应用
北京地区男性缴纳生育险有什么用