Android实例-打电话、发短信和邮件,取得手机IMEI号(XE8+小米2)

时间:2022-09-21 19:37:20

Android实例-打电话、发短信和邮件,取得手机IMEI号(XE8+小米2)

结果:

1.不提示发短信卡住,点击没有反映,我猜想,可能是因为我用的是小米手机吧。

2.接收短信报错,我猜想可能是我改了里面的方法吧(哪位大神了解,求指教)。

3.project -->options…--> users permitions。

3.1 Send SMS

3.2 Read Phone State权限:将其变成 true即可。

如果 read phone state为 false,程序将启动不了,一直黑屏(我没试,原作者是这么说的,你如果没事可以试一试,试过记得给我说一声哦)。

实例代码:

 unit Unit1;

 interface

 uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
FMX.ScrollBox, FMX.Memo, FMX.Layouts,
Androidapi.JNI.Net,//需要引入
Androidapi.JNI.GraphicsContentViewText,//需要引入
Androidapi.JNI.JavaTypes,//需要引入
Androidapi.JNIBridge,//需要引入
Androidapi.Helpers,//需要引入
Androidapi.JNI.Telephony,//需要引入
Androidapi.JNI.Os,//需要引入
FMX.Platform,//需要引入
FMX.Helpers.Android,//需要引入
FMX.MediaLibrary.Actions,//需要引入
FMX.StdActns,//需要引入
FMX.PhoneDialer,//需要引入
FMX.Controls.Presentation;//需要引入 type
TForm1 = class(TForm)
Label1: TLabel;
Memo1: TMemo;
Layout1: TLayout;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
private
{ Private declarations }
public
TelephonyManager: JTelephonyManager;
// 打电话、打开地图显示某个坐标点 、发送电子邮件、播放音乐
procedure Call_URI(const AAction: JString; const AURI: string);
//实现打电话功能
procedure PhoneCall(phoneNumber: string);
//调用系统程序发短信
procedure SentSMSfromIntent(phoneNumber, SMSstring: string);
//直接没有任何提示的发送短信
procedure SentSMS(phoneNumber, SMSstring: string);
//获取Android手机SIM卡串号
procedure GetSN;
//接收短信
function FetchSms: string;
{ Public declarations }
end; var
Form1: TForm1; implementation
{$R *.fmx}
{$R *.NmXhdpiPh.fmx ANDROID} //打电话、打开地图显示某个坐标点 、发送电子邮件、播放音乐
procedure TForm1.Call_URI(const AAction: JString; const AURI: string);
var
uri: Jnet_Uri;
Intent: JIntent;
begin
uri := StrToJURI(AURI);
Intent := TJIntent.JavaClass.init(AAction, uri);
SharedActivityContext.startActivity(Intent);
/// /打开地图显示某个坐标点
// Call_URI(TJIntent.JavaClass.ACTION_VIEW, 'geo:38.899533,-77.036476');
end; //实现打电话功能
procedure TForm1.PhoneCall(phoneNumber: string);
var
phone: IFMXPhoneDialerService;
begin
if TPlatformServices.Current.SupportsPlatformService(IFMXPhoneDialerService, IInterface(phone)) then
begin
phone.Call(phoneNumber);
//监听电话状态请用 phone.OnCallStateChanged事件
end;
end; //调用系统程序发短信
procedure TForm1.SentSMSfromIntent(phoneNumber, SMSstring: string);
var
uri: Jnet_Uri;
Intent: JIntent;
begin
uri := StrToJURI('smsto:' + phoneNumber);
Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_SENDTO, uri);
Intent.putExtra(StringToJString('sms_body'), StringToJString(SMSstring));
SharedActivityContext.startActivity(Intent);
end; //直接没有任何提示的发送短信
procedure TForm1.SentSMS(phoneNumber, SMSstring: string);
var
j: JSmsManager;
begin
j := tjsmsmanager.Create;
j.sendMultipartTextMessage(StringToJString(phoneNumber), nil, j.divideMessage(StringToJString(SMSstring)), nil, nil);
end; //获取Android手机SIM卡串号
procedure TForm1.GetSN;
var
TelephonyServiceNative: JObject;
begin
TelephonyServiceNative := SharedActivityContext.getSystemService
(TJContext.JavaClass.TELEPHONY_SERVICE);
if Assigned(TelephonyServiceNative) then
TelephonyManager := TJTelephonyManager.Wrap
((TelephonyServiceNative as ILocalObject).GetObjectID);
// TelephonyManager.getDeviceId 取 IMEI
// TelephonyManager.getLine1Number 取 MSISDN 手机号,大部分 SIM 卡中不会写入这个信息
// TelephonyManager.getSimSerialNumber 取 ICCID
// TelephonyManager.getSubscriberId 取 IMSI 运营商实际上是用这个查询的他那张对应电话号码的表
end; //接收短信
function TForm1.FetchSms: string;
var
cursor: JCursor;
uri: Jnet_Uri;
address, person, msgdatesent, protocol, msgread, msgstatus, msgtype,
msgreplypathpresent, Subject, body, servicecenter, locked: string;
msgunixtimestampms: int64;
addressidx, personidx, msgdateidx, msgdatesentidx, protocolidx, msgreadidx,
msgstatusidx, msgtypeidx, msgreplypathpresentidx, subjectidx, bodyidx,
servicecenteridx, lockedidx: integer;
begin
uri := StrToJURI('content://sms/inbox'); //收件箱
cursor := SharedActivity.getContentResolver.query(//uri, nil, nil, nil, nil);
// cursor := SharedActivity.
// managedQuery(
StrToJURI('content://sms/inbox'), //StrToJURI('content://sms/')所有短信, 含发件箱
nil,
StringToJString('1=1) group by (address'),//类似于 SQL 语句,注意,括号只有一半,原因中它已经有一对括号了
nil,
StringToJString('date asc')); //desc 降序
//以上执行的语句是:SELECT * FROM sms WHERE (type=1) AND (1=1) group by (address) order by date asc
addressidx := cursor.getColumnIndex(StringToJstring('address'));//电话
personidx := cursor.getColumnIndex(StringToJstring('person'));
msgdateidx := cursor.getColumnIndex(StringToJstring('date'));
msgdatesentidx := cursor.getColumnIndex(StringToJstring('date_sent'));
protocolidx := cursor.getColumnIndex(StringToJstring('protocol'));
msgreadidx := cursor.getColumnIndex(StringToJstring('read'));
msgstatusidx := cursor.getColumnIndex(StringToJstring('status'));
msgtypeidx := cursor.getColumnIndex(StringToJstring('type'));
msgreplypathpresentidx := cursor.getColumnIndex(StringToJstring('reply_path_present'));
subjectidx := cursor.getColumnIndex(StringToJstring('subject'));
bodyidx := cursor.getColumnIndex(StringToJstring('body'));
servicecenteridx := cursor.getColumnIndex(StringToJstring('service_center'));
lockedidx := cursor.getColumnIndex(StringToJstring('locked'));
// while (cursor.moveToNext) do//对所有短信的循环
// begin
cursor.moveToLast;//最后一条
address := JStringToString(cursor.getString(addressidx));
person := JStringToString(cursor.getString(personidx));
msgunixtimestampms := cursor.getLong(msgdateidx);
msgdatesent := JStringToString(cursor.getString(msgdatesentidx));
protocol := JStringToString(cursor.getString(protocolidx));
msgread := JStringToString(cursor.getString(msgreadidx));
msgstatus := JStringToString(cursor.getString(msgstatusidx));
msgtype := JStringToString(cursor.getString(msgtypeidx));
msgreplypathpresent := JStringToString(cursor.getString(msgreplypathpresentidx));
Subject := JStringToString(cursor.getString(subjectidx));
body := JStringToString(cursor.getString(bodyidx));
servicecenter := JStringToString(cursor.getString(servicecenteridx));
locked := JStringToString(cursor.getString(lockedidx));
Result := IntToStr(trunc(msgunixtimestampms / ))+#
+ '号码:' + address +#
+ 'person:' + person +#
+ 'msgdatesent:' + msgdatesent +#
+ 'protocol:' + protocol +#
+ 'msgread:' + msgread+#
+ 'msgstatus:' + msgstatus +#
+ 'msgtype:' + msgtype +#
+ 'msgreplypathpresent:' + msgreplypathpresent+#
+ 'Subject:' + Subject+#
+ 'servicecenter:' + servicecenter +#
+ 'locked:' + locked +#
+ '内容:' + body;
end; procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Text := '打电话、发短信和邮件,取得手机 IMEI!';
end; procedure TForm1.Button2Click(Sender: TObject);
begin
PhoneCall('');
//Call_URI(TJIntent.JavaClass.ACTION_CALL, 'tel:10086');//这个也可以
end; procedure TForm1.Button3Click(Sender: TObject);
begin
//直接没有任何提示的发送短信,尽量不用,这不道德。短信不限制长度,如超长,自动分条发送
SentSMS('', '直接没有任何提示的发送短信');
end; procedure TForm1.Button4Click(Sender: TObject);
begin
//调用系统程序发短信,短信不限制长度,如超长,自动分条发送
SentSMSfromIntent('', '调用系统程序发短信。');
end; procedure TForm1.Button5Click(Sender: TObject);
begin
//调用系统程序发送电子邮件
Call_URI(TJIntent.JavaClass.ACTION_SENDTO, 'mailto:513187410@qq.com');
end; procedure TForm1.Button6Click(Sender: TObject);
begin
GetSN; //先调用一下
Label1.Text := '本手机 IMEI:' + jstringtostring(TelephonyManager.getDeviceId); //取IMEI;
end; procedure TForm1.Button7Click(Sender: TObject);
begin
Memo1.Lines.Text := FetchSms;
end; end.

这个是测试用的,小伙伴们不要用哦。

   var
cursor: JCursor;
uri: Jnet_Uri;
address,person,msgdatesent,protocol,msgread,msgstatus,msgtype,
msgreplypathpresent,subject,body,
servicecenter,locked:string;
msgunixtimestampms:int64;
addressidx,personidx,msgdateidx,msgdatesentidx,protocolidx,msgreadidx,
msgstatusidx,msgtypeidx,msgreplypathpresentidx,subjectidx,bodyidx,
servicecenteridx,lockedidx:integer;
begin
uri:=StrToJURI('content://sms/inbox');
cursor := SharedActivity.getContentResolver.query(uri, nil, nil,nil,nil);
addressidx:=cursor.getColumnIndex(StringToJstring('address'));
personidx:=cursor.getColumnIndex(StringToJstring('person'));
msgdateidx:=cursor.getColumnIndex(StringToJstring('date'));
msgdatesentidx:=cursor.getColumnIndex(StringToJstring('date_sent'));
protocolidx:=cursor.getColumnIndex(StringToJstring('protocol'));
msgreadidx:=cursor.getColumnIndex(StringToJstring('read'));
msgstatusidx:=cursor.getColumnIndex(StringToJstring('status'));
msgtypeidx:=cursor.getColumnIndex(StringToJstring('type'));
msgreplypathpresentidx:=cursor.getColumnIndex(StringToJstring('reply_path_present'));
subjectidx:=cursor.getColumnIndex(StringToJstring('subject'));
bodyidx:=cursor.getColumnIndex(StringToJstring('body'));
servicecenteridx:=cursor.getColumnIndex(StringToJstring('service_center'));
lockedidx:=cursor.getColumnIndex(StringToJstring('locked'));
while (cursor.moveToNext) do begin
address:=JStringToString(cursor.getString(addressidx));
person:=JStringToString(cursor.getString(personidx));
msgunixtimestampms:=cursor.getLong(msgdateidx);
msgdatesent:=JStringToString(cursor.getString(msgdatesentidx));
protocol:=JStringToString(cursor.getString(protocolidx));
msgread:=JStringToString(cursor.getString(msgreadidx));
msgstatus:=JStringToString(cursor.getString(msgstatusidx));
msgtype:=JStringToString(cursor.getString(msgtypeidx));
msgreplypathpresent:=JStringToString(cursor.getString(msgreplypathpresentidx));
subject:=JStringToString(cursor.getString(subjectidx));
body:=JStringToString(cursor.getString(bodyidx));
servicecenter:=JStringToString(cursor.getString(servicecenteridx));
locked:=JStringToString(cursor.getString(lockedidx));
Result:=IntToStr(trunc(msgunixtimestampms/))+' '+address+' '+body;
end;
end;

https://blog.csdn.net/davidtps/article/details/27321801

Android实例-打电话、发短信和邮件,取得手机IMEI号(XE8+小米2)的更多相关文章

  1. 向android模拟器打电话发短信的简单方法

    在开发android应用程序时,有时候需要测试一下向android手机拨打电话发送短信时该应用程序的反应.譬如编写一个广播接收器,来提示用户有短信收到或者处理短信,就需要向该手机发送短信来进行测试.这 ...

  2. h5打电话发短信写邮件怎么实现

    // 一.打电话<a href="tel:0755-10086">打电话给:0755-10086</a> // 二.发短信,winphone系统无效< ...

  3. 如何向Android模拟器打电话发短信

    1. 启动Android Emulator, 查看标题栏找出端口.一般是android emulator(5554),其中5554就是端口. 2. 打开命令行,输入telnet localhost 5 ...

  4. 【转】如何向Android模拟器打电话发短信

    转载地址:http://hi.baidu.com/jeremylai/item/420f9c9fe4881fccb62531f7 1. 启动Android Emulator, 查看标题栏找出端口.一般 ...

  5. ios 设置亮度、声音;调用发短信、邮件、打电话

    一,设置亮度 [[UIScreen mainScreen] setBrightness:0.5];//0.0~1.0 二,设置声音 1,添加 MediaPlayer.framework 框架 2,在需 ...

  6. 打电话&comma;发短信&comma;发邮件&comma;app跳转

    1.打电话 - (IBAction)callPhone1:(id)sender { NSURL *url = [NSURL URLWithString:@"tel://18500441739 ...

  7. iOS 打电话、发短信、邮件、打开网址、调用应用等合集

    iOS中的很多功能都是非常简单的,几行代码就搞定了,比如打电话.打开网址.发邮件.发短信等,这里总结几个比较常用的: 1.打电话 方式一:最简单最直接的方式:直接跳到拨号界面 NSURL *url = ...

  8. Android 单击跳转到打电话发短信界面,长按打电话发短信

    <uses-permission android:name="android.permission.CALL_PHONE"/><uses-permission a ...

  9. iOS开发中打电话发短信等功能的实现

    在APP开发中,可能会涉及到打电话.发短信.发邮件等功能.比如说,通常一个产品的"关于"页面,会有开发者的联系方式,理想情况下,当用户点击该电话号码时,能够自动的帮用户拨出去,就涉 ...

随机推荐

  1. SpringMvc中初始化参数绑定

    初始化参数绑定与类型转换很类似,初始化绑定时,主要是参数类型 ---单日期 在处理器类中配置绑定方法  使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型   proper ...

  2. Linux&lowbar;Shell&lowbar;grep

    grep [选项] "搜索内容"  文件名 选项列表: -i 忽略大小写      -n 输出行号 -v 反向查找 --color=auto 搜索出的关键字用颜色显示   ll|g ...

  3. 百度地图 api 功能封装类 &lpar;ZMap&period;js&rpar; 新增管理事件功能 &lbrack;源码下载&rsqb;

    ZMap 功能说明 ZMap.js 本类方法功能大多使用 prototype 原型 实现: 包含的功能有:轨迹回放,圈画区域可编辑,判断几个坐标是否在一个圆圈内,生活服务查询,从经纬度获取地址信息,地 ...

  4. eclipse常用的字体

    1.consolas 2.Segoe Script 3.Segoe Print 4.Courier New

  5. Castle学习系列之二:Castle配置

    说明:本系列文章参考自李会军先生的Castle 开发系列文章,然后记录自己在学习时遇到的一些问题,记录之. 主要内容 1.Castle配置学习 2.初始化配置 Castle配置学习 <?xml ...

  6. Activity大致会经过如下四个状态

    1.活动主题:当前Activity位于前台,用户可见,可以获得焦点.2.暂停状态:其他Activity位于前台,该Activity依然可见,只是不能获得焦点.3.停止状态:该Activity不可见,失 ...

  7. 洛谷mNOIP模拟赛Day2-入阵曲

    题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 丹青千秋酿,一醉解愁肠. 无悔少年枉,只愿壮志狂. 题目描述 小 F 很喜欢数学,但是到 ...

  8. 03&lowbar;NoSQL数据库之Redis数据库:list类型

     lists类型及操作 List是一个链表结构,主要功能室push,pop.获取一个范围的所有值等等,操作中key理解为链表的名字.Redis的list类型其实就是一个每个元素都是string类型 ...

  9. java面试——问题回溯

    背景:用来记录面试过程中遇到的问题,在这里进行记录,下次不要犯同样的错误. 迪普科技 Linux服务器下的top命令 #动态更新的虚拟文件实际上是许多其他内存相关工具(如:free / ps / to ...

  10. sql server 复制、镜像常见故障处理

    sql server2008数据库复制实现数据同步常见问题 操作使用的一些技巧(事务复制类型): 1.如何修改一个已经发布的表的属性? 将发布所有订阅删除,(发布不用删除),就可以在发布属性的项目中取 ...