Delphi 12.1安卓APP开发中获取硬件信息及手机号
Demo与代码已上传到CSDN下载。
这里简单说一下代码内容,完整代码请自行下载,不清楚的欢迎留言交流。
前言
演示Demo使用了我自己开发的一个控件,TLayoutPro
《Delphi D10.3 LayoutsPro 控件简介 -避免输入焦点被虚拟键盘遮挡》请查看并下载控件代码。当然,这个控件针对于获取安卓设备信息及手机号不是必须的。
需要的权限
需要以下权限:
在高版本的安卓系统中,要想获取到设备信息,需要动态申请权限,在演示代码里已包括,代码可同时在高低安卓版本中使用。
代码说明
获取信息主要是两个部分:
TJBuild
这里面包括了较多的设备信息
BOARD 主板
BOOTLOADER 系统启动程序版本号
BRAND 系统定制商
CPU_ABI cpu指令集
CPU_ABI2 cpu指令集2
DEVICE 设备驱动名称
DISPLAY 显示屏参数,设备显示器的版本包(在系统设置中显示为版本号)和ID一样
FINGERPRINT 识别码(这个码不是唯一码)通常是一串参数的组合,没太大意义
HARDWARE 硬件名称
HOST设备主机地址
MANUFACTURER 硬件制造商
MODEL 版本即最终用户可见的名称
PRODUCT 整个产品的名称
RADIO 无线电固件版本:使用**getRadioVersion()**代替。
SERIAL 硬件序列号
TAGS 描述build的标签,如未签名,debug等等。
TIME 系统编译时间
TYPE 编译的类型
USER 固定的,没意义
示例代码(部分):
// 手机型号(MI XXX)
Memo1.Lines.Add('手机型号(MI XXX):' + JStringToString(TJBuild.JavaClass.MODEL));
// 设备基板名称
Memo1.Lines.Add('设备基板名称:' + JStringToString(TJBuild.JavaClass.BOARD));
// 系统启动程序版本
Memo1.Lines.Add('系统启动程序版本:' + JStringToString
(TJBuild.JavaClass.BOOTLOADER));
// 系统定制商
Memo1.Lines.Add('设备品牌:' + JStringToString(TJBuild.JavaClass.BRAND));
// cpu指令集
Memo1.Lines.Add('cpu指令集:' + JStringToString(TJBuild.JavaClass.CPU_ABI));
// cpu指令集2
Memo1.Lines.Add('cpu指令集2:' + JStringToString(TJBuild.JavaClass.CPU_ABI2));
// 设备驱动名称
Memo1.Lines.Add('设备驱动名称:' + JStringToString(TJBuild.JavaClass.DEVICE));
// 设备显示的版本包(在系统设置中显示为版本号)和ID一样
Memo1.Lines.Add('显示屏参数:' + JStringToString(TJBuild.JavaClass.DISPLAY));
// 设备制造商
Memo1.Lines.Add('设备制造商:' + JStringToString(TJBuild.JavaClass.MANUFACTURER));
// 无线电固件版本
Memo1.Lines.Add('无线电固件版本:' + JStringToString
(TJBuild.JavaClass.getRadioVersion));
// 设备的唯一标识。由设备的多个信息拼接合成。 注意,这个码不是唯一 码
Memo1.Lines.Add('硬件识别码(这个码不是唯一 码):' +
JStringToString(TJBuild.JavaClass.FINGERPRINT));
TelephonyManager
这部分包括了手机信息如卡槽信息、手机卡信息、运营商信息、网络信息等等,演示里也只列了一部分主要内容。
示例代码(部分):
TelephonyServiceNative := TAndroidHelper.Context.getSystemService
(TJContext.JavaClass.TELEPHONY_SERVICE);
if Assigned(TelephonyServiceNative) then
begin
Memo1.Lines.Add('======================');
try
TelephonyManager := TJTelephonyManager.Wrap
((TelephonyServiceNative as ILocalObject).GetObjectID);
// 手机卡槽数
vPhoneCount := TelephonyManager.getPhoneCount;
Memo1.Lines.Add('卡槽数:' + vPhoneCount.ToString);
// 插卡数
vSubscriptionManager := TJSubscriptionManager.JavaClass.from
(TAndroidHelper.Context);
vSubManagerCoun :=
vSubscriptionManager.getActiveSubscriptionInfoCount();
Memo1.Lines.Add('插卡数:' + vSubManagerCoun.ToString);
// 设备ID
Memo1.Lines.Add('DeviceId_1:' + JStringToString
(TelephonyManager.getDeviceId(0)));
if vPhoneCount > 1 then
Memo1.Lines.Add('DeviceId_2:' +
JStringToString(TelephonyManager.getDeviceId(1)));
// 硬件Imei
Memo1.Lines.Add('Imei_1:' + JStringToString
(TelephonyManager.getImei(0)));
if vPhoneCount > 1 then
Memo1.Lines.Add('Imei_2:' + JStringToString
(TelephonyManager.getImei(1)));
// 硬件Meid
try
Memo1.Lines.Add('Meid_1:' + JStringToString
(TelephonyManager.getMeid(0)));
except
on E: Exception do
end;
try
if vPhoneCount > 1 then
Memo1.Lines.Add('Meid_2:' + JStringToString
(TelephonyManager.getMeid(1)));
except
on E: Exception do
end;
// SubscriberId
Memo1.Lines.Add('SubscriberId(IMSI号):' +
JStringToString(TelephonyManager.getSubscriberId));
// Line1Number
Memo1.Lines.Add('Line1Number:' + JStringToString
(TelephonyManager.getLine1Number));
//分别取各卡槽信息
for I := 0 to vSubManagerCoun-1 do
begin
vSubscriptionInfo:=vSubscriptionManager.getActiveSubscriptionInfo(I+1);
Memo1.Lines.Add(I.ToString+'手机号: ' + JStringToString
(vSubscriptionInfo.getNumber));
Memo1.Lines.Add(I.ToString+'使用卡槽: ' + (vSubscriptionInfo.getSimSlotIndex+1).ToString);
Memo1.Lines.Add(I.ToString+'运营商: ' + JCharSequenceToStr
(vSubscriptionInfo.getCarrierName));
end;
except
end;
end;
获取信息展示
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/tanqth/article/details/104779089
获取信息展示

相关文章导读
《Delphi D10.3 LayoutsPro 控件简介 -避免输入焦点被虚拟键盘遮挡》
《Delphi安卓APP获取手机信息》源码下载地址
相关文章:
Delphi 12.1安卓APP开发中获取硬件信息及手机号
Demo与代码已上传到CSDN下载。 这里简单说一下代码内容,完整代码请自行下载,不清楚的欢迎留言交流。 前言 演示Demo使用了我自己开发的一个控件,TLayoutPro 《Delphi D10.3 LayoutsPro 控件简介 -避免输入焦点被虚拟键盘遮挡》请查看并下载控…...
STM32 - 笔记4
1 STM32 示波器 基于STM32的简易示波器项目(含代码)——HAL库_stm32简易示波器 基于STM32的简易示波器项目(含代码)——HAL库_stm32简易示波器_stm32示波器-CSDN博客 【强烈推荐】基于stm32的OLED各种显示实现(含动态图)_stm32oled以十六进制显示-CSDN博客 STM32示波器…...
【H2O2|全栈】更多关于HTML(1)HTML进阶(一)
目录 HTML进阶知识 前言 准备工作 标签的扩展(一) 本文中的标签在什么位置使用? title标签 meta标签 name viewport referrer http-equiv charset content link标签 实际案例 可视部分 代码分析 其他标签 base标签 styl…...
新160个crackme - 053-devilz KeyGen me#3
运行分析 解压出来4个文件运行程序发现要破解Name和Serial PE分析 32位,petite壳 手动脱壳 使用windows XP虚拟机OD打开程序按2下F8,发现ESP变红,根据ESP定律,在该地址右键 -> HW break下断点 继续按2下F9,来到灰色…...
ORA-12514
第一步,去这个地址,查查你的服务名是否存在 第二步,没查到就是你服务名写错了,查到了就退出我的解答...
MyBatis-PlusDruid数据源
MyBatis-Plus简介 MyBatis-Plus(简称MP)是一个MyBatis的增强工具,它在MyBatis的基础上进行了增强而不改变其原有的功能,旨在简化开发、提高效率。以下是对MyBatis-Plus的详细简介: 一、基本概述 定义:MyBat…...
C#中chart绘制曲线
官网资料:Chart 类 (System.Windows.Forms.DataVisualization.Charting) | Microsoft Learn 类的 Chart 两个重要属性是 Series 和 ChartAreas 属性,这两个属性都是集合属性。 Series集合属性存储Series对象,这些对象用于存储要显示的数据以…...
c++数据结构算法题讲解
那么从本期文章开始,会尽量带大家一起刷题 第一题 题目 关键词 思路 源代码 class MinStack { public: void push(int val) { _st.push(val); if(_minst.empty() || val < _minst.top()) { _minst.push(val); } } void pop() { if(_st.top() _minst.top()) {…...
间隙锁在其他数据库管理系统中的类似实现
间隙锁在其他数据库管理系统中的类似实现 一、引言 在 MySQL 中,间隙锁在可重复读事务隔离级别下起到了防止幻读的重要作用。那么在其他数据库管理系统中,是否也有类似的机制来实现类似的功能呢?了解其他数据库管理系统中与间隙锁类似的实现,可以帮助我们更好地理解不同数…...
OpenCV 与 YoloV3的结合使用:目标实时跟踪
目录 代码分析 1. YOLO 模型加载 2. 视频加载与初始化 3. 视频帧处理 4. 物体检测 5. 处理检测结果 6. 边界框和类别显示 7. 帧率(FPS)计算 8. 结果显示与退出 9. 资源释放 整体代码 效果展示 总结 代码分析 这段代码使用 YOLO(…...
Worse is Better
Worse is Better是UNIX的设计哲学,通俗来说,就是:保持接口与实现的简单性,比系统的任何其他属性,包括准确性、一致性和完整性,都来得更加重要 设计系统时,接口和实现的简单性是至关重要的。这种…...
Python Web 框架篇:Flask、Django、FastAPI介绍及其核心技术
Python Web 框架篇:Flask、Django、FastAPI介绍及其核心技术 目录 🐍 Flask Flask 核心概念(路由、视图函数、模板渲染)Flask Blueprint 模块化应用Flask 扩展(Flask-SQLAlchemy、Flask-WTF、Flask-Migrate 等&#…...
【Qt网络编程基础】Tcp服务器和客户端(只支持一对一)
目录 一、编写思路 1、服务器 总体思路 详细思路 1. 构造函数 (Widget::Widget) 2. 启动监听 (Widget::on_btn_start_clicked) 3. 停止监听 (Widget::on_btn_cease_clicked) 4. 发送消息 (Widget::on_btn_info_clicked) 5. 接收消息 (Widget::receive_message) 6. 处…...
平台开发到落地详解:从食堂采购系统源码到可视化供应链管理数据大屏
随着数字化转型的加速,越来越多的企业和组织开始重视供应链的智能化与可视化管理。在食堂采购领域,供应链管理的复杂性与日俱增,而传统的手工操作往往效率低下、容易出错。因此,开发食堂采购系统并结合可视化数据大屏的解决方案&a…...
静态内部类
目录 一、什么是静态内部类二、静态内部类的意义 一、什么是静态内部类 在 Java 中,静态内部类(也称为静态嵌套类)是定义在一个类内部的类,但它与外部类没有关联,即它不持有外部类的引用。静态内部类可以访问外部类的…...
Vue+SpringBoot+数据库整体开发流程 1
本篇文章通过springboot整合mybatis-plus去实现后端对数据库的增删改查,以及响应给前端的url,让前端获得数据。 目录 一、简单搭建一个Vue项目 检查node.js版本 使用vue-cli创建空项目 Vue-cli工程中每个文件夹和文件的用处 二、Mysql数据库 创建数…...
百度Apollo打通与ROS的通信,扩展自动驾驶系统生态
技术文档|打通与ROS的通信,扩展自动驾驶系统生态_Apollo开发者社区 (baidu.com)...
Web3 项目安全手册
现如今针对 Web3 项目的攻击手法层出不穷,且项目之间的交互也越发复杂,在各个项目之间的交互经常会引入新的安全问题,而大部分 Web3 项目研发团队普遍缺少的一线的安全攻防经验,并且在进行 Web3 项目研发的时候,重点关…...
AI边缘计算在安防领域的智能化革新:赋能安防系统的智能化升级
随着人工智能(AI)和边缘计算技术的快速发展,两者在安防视频领域的应用日益广泛,为传统安防系统带来了革命性的变革。AI边缘计算技术通过将AI算法和模型部署在边缘设备上,实现了数据处理和智能决策的即时响应࿰…...
vscode配置C/C++环境(保姆级详细教程)
一. 引言 VSCode,全称为Visual Studio Code,是一款由微软开发的免费、开源的轻量级代码编辑器,它支持多种编程语言和平台,并提供丰富的扩展功能,让开发者能够更高效地编写代码。 大家能来搜用如何在VSCode配置C/C环境…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
