结果:

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. 打电话,发短信,发邮件,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. ADT(android-bundler) HTML EDIT 编辑 xml HTML

    逗比的ADT,安装个html一直不成功,最后发现了如下方法 Helper_Install New Software_ http://download.eclipse.org/releases/indi ...

  2. ANDROID_MARS学习笔记_S01_004dpi、dp(dip)及计算

    一.dpi.dp介绍 sp会随着用户在手机中设置字体大小而改变,而dp不会 二.1.dpsp_layout.xml <?xml version="1.0" encoding= ...

  3. MyBatis的CRUD操作

    MyBatis的两个主要配置文件 mytatis.xml:放在src目录下,常见的配置如下 <?xml version="1.0" encoding="UTF-8& ...

  4. mysql的group by应用

    CREATE TABLE group_test (  id TINYINT(1) UNSIGNED NOT NULL, pubid TINYINT(1) UNSIGNED NOT NULL, user ...

  5. 怎样成为一名PHP专家?

    当浏览各类与PHP相关的博客时,比如Quora上的问题,谷歌群组,简讯和杂志,我经常注意到技能的等级分化.问题都类似于“我如何连接到MySQL数据库?”或者“我该如何扩展邮件系统才能在每小时发送超过一 ...

  6. PC寄存器的真实状态

    因为预取指令的关系,PC寄存器永远比当前的寄存器多两个指令,ARM模式为大8,Thumb模式为大2,这针对的是32bit的ARMv7的指令集 In ARM state, the value of th ...

  7. 1494. Monobilliards(栈)

    1494 之前记得数据结构试卷上有这种题 就是判断某一出栈顺序 是不是满足以1.2...n为入栈顺序 a1,a2,a3..an; 对于任意相邻a[i],a[i+1] 如果a[i]>a[i+1]+ ...

  8. VBSCRIPT事件绑定(隐式)

    很多新版的浏览器都开始不支持VBSCRIPT 所以系统开始不断地有script错误,开始比较多地接触VBSCRIPT vbscript 和javascript 事件绑定的类似方法为 vbscript: ...

  9. 2009国家集训队小Z的袜子

    莫队算法? 感觉没什么优越性啊?难道就是因为在排序的时候cmp函数的不同?这样做为什么减少时限啊? 我带着疑惑敲了代码,却一直有bug…… 代码: type node=record l,r,id,x, ...

  10. Android UI设计系统-android selector 开始自定义样式

    Selector的结构描述: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:a ...