当前位置: 首页 > news >正文

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++数据结构算法题讲解

那么从本期文章开始&#xff0c;会尽量带大家一起刷题 第一题 题目 关键词 思路 源代码 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. 帧率&#xff08;FPS&#xff09;计算 8. 结果显示与退出 9. 资源释放 整体代码 效果展示 总结 代码分析 这段代码使用 YOLO&#xff08…...

Worse is Better

Worse is Better是UNIX的设计哲学&#xff0c;通俗来说&#xff0c;就是&#xff1a;保持接口与实现的简单性&#xff0c;比系统的任何其他属性&#xff0c;包括准确性、一致性和完整性&#xff0c;都来得更加重要 设计系统时&#xff0c;接口和实现的简单性是至关重要的。这种…...

Python Web 框架篇:Flask、Django、FastAPI介绍及其核心技术

Python Web 框架篇&#xff1a;Flask、Django、FastAPI介绍及其核心技术 目录 &#x1f40d; Flask Flask 核心概念&#xff08;路由、视图函数、模板渲染&#xff09;Flask Blueprint 模块化应用Flask 扩展&#xff08;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. 处…...

平台开发到落地详解:从食堂采购系统源码到可视化供应链管理数据大屏

随着数字化转型的加速&#xff0c;越来越多的企业和组织开始重视供应链的智能化与可视化管理。在食堂采购领域&#xff0c;供应链管理的复杂性与日俱增&#xff0c;而传统的手工操作往往效率低下、容易出错。因此&#xff0c;开发食堂采购系统并结合可视化数据大屏的解决方案&a…...

静态内部类

目录 一、什么是静态内部类二、静态内部类的意义 一、什么是静态内部类 在 Java 中&#xff0c;静态内部类&#xff08;也称为静态嵌套类&#xff09;是定义在一个类内部的类&#xff0c;但它与外部类没有关联&#xff0c;即它不持有外部类的引用。静态内部类可以访问外部类的…...

Vue+SpringBoot+数据库整体开发流程 1

本篇文章通过springboot整合mybatis-plus去实现后端对数据库的增删改查&#xff0c;以及响应给前端的url&#xff0c;让前端获得数据。 目录 一、简单搭建一个Vue项目 检查node.js版本 使用vue-cli创建空项目 Vue-cli工程中每个文件夹和文件的用处 二、Mysql数据库 创建数…...

百度Apollo打通与ROS的通信,扩展自动驾驶系统生态

技术文档&#xff5c;打通与ROS的通信&#xff0c;扩展自动驾驶系统生态_Apollo开发者社区 (baidu.com)...

Web3 项目安全手册

现如今针对 Web3 项目的攻击手法层出不穷&#xff0c;且项目之间的交互也越发复杂&#xff0c;在各个项目之间的交互经常会引入新的安全问题&#xff0c;而大部分 Web3 项目研发团队普遍缺少的一线的安全攻防经验&#xff0c;并且在进行 Web3 项目研发的时候&#xff0c;重点关…...

AI边缘计算在安防领域的智能化革新:赋能安防系统的智能化升级

随着人工智能&#xff08;AI&#xff09;和边缘计算技术的快速发展&#xff0c;两者在安防视频领域的应用日益广泛&#xff0c;为传统安防系统带来了革命性的变革。AI边缘计算技术通过将AI算法和模型部署在边缘设备上&#xff0c;实现了数据处理和智能决策的即时响应&#xff0…...

vscode配置C/C++环境(保姆级详细教程)

一. 引言 VSCode&#xff0c;全称为Visual Studio Code&#xff0c;是一款由微软开发的免费、开源的轻量级代码编辑器&#xff0c;它支持多种编程语言和平台&#xff0c;并提供丰富的扩展功能&#xff0c;让开发者能够更高效地编写代码。 大家能来搜用如何在VSCode配置C/C环境…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...