当前位置: 首页 > 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环境…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

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> …...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

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

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

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...