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,程序将启动不了,一直黑屏(我没试,原作者是这么说的,你如果没事可以试一试,试过记得给我说一声哦)。

 

实例代码:

  1 unit Unit1;
  2 
  3 interface
  4 
  5 uses
  6   System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  7   FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  8   FMX.ScrollBox, FMX.Memo, FMX.Layouts,
  9   Androidapi.JNI.Net,//需要引入
 10   Androidapi.JNI.GraphicsContentViewText,//需要引入
 11   Androidapi.JNI.JavaTypes,//需要引入
 12   Androidapi.JNIBridge,//需要引入
 13   Androidapi.Helpers,//需要引入
 14   Androidapi.JNI.Telephony,//需要引入
 15   Androidapi.JNI.Os,//需要引入
 16   FMX.Platform,//需要引入
 17   FMX.Helpers.Android,//需要引入
 18   FMX.MediaLibrary.Actions,//需要引入
 19   FMX.StdActns,//需要引入
 20   FMX.PhoneDialer,//需要引入
 21   FMX.Controls.Presentation;//需要引入
 22 
 23 type
 24   TForm1 = class(TForm)
 25     Label1: TLabel;
 26     Memo1: TMemo;
 27     Layout1: TLayout;
 28     Button1: TButton;
 29     Button2: TButton;
 30     Button3: TButton;
 31     Button4: TButton;
 32     Button5: TButton;
 33     Button6: TButton;
 34     Button7: TButton;
 35     procedure Button1Click(Sender: TObject);
 36     procedure Button2Click(Sender: TObject);
 37     procedure Button3Click(Sender: TObject);
 38     procedure Button4Click(Sender: TObject);
 39     procedure Button5Click(Sender: TObject);
 40     procedure Button6Click(Sender: TObject);
 41     procedure Button7Click(Sender: TObject);
 42   private
 43     { Private declarations }
 44   public
 45     TelephonyManager: JTelephonyManager;
 46     // 打电话、打开地图显示某个坐标点 、发送电子邮件、播放音乐
 47     procedure Call_URI(const AAction: JString; const AURI: string);
 48     //实现打电话功能
 49     procedure PhoneCall(phoneNumber: string);
 50     //调用系统程序发短信
 51     procedure SentSMSfromIntent(phoneNumber, SMSstring: string);
 52     //直接没有任何提示的发送短信
 53     procedure SentSMS(phoneNumber, SMSstring: string);
 54     //获取Android手机SIM卡串号
 55     procedure GetSN;
 56     //接收短信
 57     function FetchSms: string;
 58     { Public declarations }
 59   end;
 60 
 61 var
 62   Form1: TForm1;
 63 
 64 implementation
 65 {$R *.fmx}
 66 {$R *.NmXhdpiPh.fmx ANDROID}
 67 
 68 //打电话、打开地图显示某个坐标点 、发送电子邮件、播放音乐
 69 procedure TForm1.Call_URI(const AAction: JString; const AURI: string);
 70 var
 71   uri: Jnet_Uri;
 72   Intent: JIntent;
 73 begin
 74   uri := StrToJURI(AURI);
 75   Intent := TJIntent.JavaClass.init(AAction, uri);
 76   SharedActivityContext.startActivity(Intent);
 77   /// /打开地图显示某个坐标点
 78   // Call_URI(TJIntent.JavaClass.ACTION_VIEW, 'geo:38.899533,-77.036476');
 79 end;
 80 
 81 //实现打电话功能
 82 procedure TForm1.PhoneCall(phoneNumber: string);
 83 var
 84   phone: IFMXPhoneDialerService;
 85 begin
 86   if TPlatformServices.Current.SupportsPlatformService(IFMXPhoneDialerService, IInterface(phone)) then
 87   begin
 88     phone.Call(phoneNumber);
 89     //监听电话状态请用 phone.OnCallStateChanged事件
 90   end;
 91 end;
 92 
 93 //调用系统程序发短信
 94 procedure TForm1.SentSMSfromIntent(phoneNumber, SMSstring: string);
 95 var
 96   uri: Jnet_Uri;
 97   Intent: JIntent;
 98 begin
 99   uri := StrToJURI('smsto:' + phoneNumber);
100   Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_SENDTO, uri);
101   Intent.putExtra(StringToJString('sms_body'), StringToJString(SMSstring));
102   SharedActivityContext.startActivity(Intent);
103 end;
104 
105 //直接没有任何提示的发送短信
106 procedure TForm1.SentSMS(phoneNumber, SMSstring: string);
107 var
108   j: JSmsManager;
109 begin
110   j := tjsmsmanager.Create;
111   j.sendMultipartTextMessage(StringToJString(phoneNumber), nil, j.divideMessage(StringToJString(SMSstring)), nil, nil);
112 end;
113 
114 //获取Android手机SIM卡串号
115 procedure TForm1.GetSN;
116 var
117   TelephonyServiceNative: JObject;
118 begin
119   TelephonyServiceNative := SharedActivityContext.getSystemService
120   (TJContext.JavaClass.TELEPHONY_SERVICE);
121   if Assigned(TelephonyServiceNative) then
122   TelephonyManager := TJTelephonyManager.Wrap
123   ((TelephonyServiceNative as ILocalObject).GetObjectID);
124   // TelephonyManager.getDeviceId 取 IMEI
125   // TelephonyManager.getLine1Number 取 MSISDN 手机号,大部分 SIM 卡中不会写入这个信息
126   // TelephonyManager.getSimSerialNumber 取 ICCID
127   // TelephonyManager.getSubscriberId 取 IMSI 运营商实际上是用这个查询的他那张对应电话号码的表
128 end;
129 
130 //接收短信
131 function TForm1.FetchSms: string;
132 var
133   cursor: JCursor;
134   uri: Jnet_Uri;
135   address, person, msgdatesent, protocol, msgread, msgstatus, msgtype,
136   msgreplypathpresent, Subject, body, servicecenter, locked: string;
137   msgunixtimestampms: int64;
138   addressidx, personidx, msgdateidx, msgdatesentidx, protocolidx, msgreadidx,
139   msgstatusidx, msgtypeidx, msgreplypathpresentidx, subjectidx, bodyidx,
140   servicecenteridx, lockedidx: integer;
141 begin
142   uri := StrToJURI('content://sms/inbox'); //收件箱
143   cursor := SharedActivity.getContentResolver.query(//uri, nil, nil, nil, nil);
144 //  cursor := SharedActivity.
145 //  managedQuery(
146   StrToJURI('content://sms/inbox'), //StrToJURI('content://sms/')所有短信, 含发件箱
147   nil,
148   StringToJString('1=1) group by (address'),//类似于 SQL 语句,注意,括号只有一半,原因中它已经有一对括号了
149   nil,
150   StringToJString('date asc')); //desc 降序
151   //以上执行的语句是:SELECT * FROM sms WHERE (type=1) AND (1=1) group by (address) order by date asc
152   addressidx := cursor.getColumnIndex(StringToJstring('address'));//电话
153   personidx := cursor.getColumnIndex(StringToJstring('person'));
154   msgdateidx := cursor.getColumnIndex(StringToJstring('date'));
155   msgdatesentidx := cursor.getColumnIndex(StringToJstring('date_sent'));
156   protocolidx := cursor.getColumnIndex(StringToJstring('protocol'));
157   msgreadidx := cursor.getColumnIndex(StringToJstring('read'));
158   msgstatusidx := cursor.getColumnIndex(StringToJstring('status'));
159   msgtypeidx := cursor.getColumnIndex(StringToJstring('type'));
160   msgreplypathpresentidx := cursor.getColumnIndex(StringToJstring('reply_path_present'));
161   subjectidx := cursor.getColumnIndex(StringToJstring('subject'));
162   bodyidx := cursor.getColumnIndex(StringToJstring('body'));
163   servicecenteridx := cursor.getColumnIndex(StringToJstring('service_center'));
164   lockedidx := cursor.getColumnIndex(StringToJstring('locked'));
165   // while (cursor.moveToNext) do//对所有短信的循环
166   // begin
167   cursor.moveToLast;//最后一条
168   address := JStringToString(cursor.getString(addressidx));
169   person := JStringToString(cursor.getString(personidx));
170   msgunixtimestampms := cursor.getLong(msgdateidx);
171   msgdatesent := JStringToString(cursor.getString(msgdatesentidx));
172   protocol := JStringToString(cursor.getString(protocolidx));
173   msgread := JStringToString(cursor.getString(msgreadidx));
174   msgstatus := JStringToString(cursor.getString(msgstatusidx));
175   msgtype := JStringToString(cursor.getString(msgtypeidx));
176   msgreplypathpresent := JStringToString(cursor.getString(msgreplypathpresentidx));
177   Subject := JStringToString(cursor.getString(subjectidx));
178   body := JStringToString(cursor.getString(bodyidx));
179   servicecenter := JStringToString(cursor.getString(servicecenteridx));
180   locked := JStringToString(cursor.getString(lockedidx));
181   Result := IntToStr(trunc(msgunixtimestampms / 1000))+#13
182   + '号码:' + address +#13
183   + 'person:' + person +#13
184   + 'msgdatesent:' + msgdatesent +#13
185   + 'protocol:' + protocol +#13
186   + 'msgread:' + msgread+#13
187   + 'msgstatus:' + msgstatus +#13
188   + 'msgtype:' + msgtype +#13
189   + 'msgreplypathpresent:' + msgreplypathpresent+#13
190   + 'Subject:' + Subject+#13
191   + 'servicecenter:' + servicecenter +#13
192   + 'locked:' + locked +#13
193   + '内容:' + body;
194 end;
195 
196 procedure TForm1.Button1Click(Sender: TObject);
197 begin
198   Label1.Text := '打电话、发短信和邮件,取得手机 IMEI!';
199 end;
200 
201 procedure TForm1.Button2Click(Sender: TObject);
202 begin
203   PhoneCall('10086');
204   //Call_URI(TJIntent.JavaClass.ACTION_CALL, 'tel:10086');//这个也可以
205 end;
206 
207 procedure TForm1.Button3Click(Sender: TObject);
208 begin
209   //直接没有任何提示的发送短信,尽量不用,这不道德。短信不限制长度,如超长,自动分条发送
210   SentSMS('15810853101', '直接没有任何提示的发送短信');
211 end;
212 
213 procedure TForm1.Button4Click(Sender: TObject);
214 begin
215   //调用系统程序发短信,短信不限制长度,如超长,自动分条发送
216   SentSMSfromIntent('15810853101', '调用系统程序发短信。');
217 end;
218 
219 procedure TForm1.Button5Click(Sender: TObject);
220 begin
221   //调用系统程序发送电子邮件
222   Call_URI(TJIntent.JavaClass.ACTION_SENDTO, 'mailto:513187410@qq.com');
223 end;
224 
225 procedure TForm1.Button6Click(Sender: TObject);
226 begin
227   GetSN; //先调用一下
228   Label1.Text := '本手机 IMEI:' + jstringtostring(TelephonyManager.getDeviceId); //取IMEI;
229 end;
230 
231 procedure TForm1.Button7Click(Sender: TObject);
232 begin
233   Memo1.Lines.Text := FetchSms;
234 end;
235 
236 end.

 

 

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

 1   var
 2   cursor: JCursor;
 3   uri: Jnet_Uri;
 4   address,person,msgdatesent,protocol,msgread,msgstatus,msgtype,
 5   msgreplypathpresent,subject,body,
 6   servicecenter,locked:string;
 7   msgunixtimestampms:int64;
 8   addressidx,personidx,msgdateidx,msgdatesentidx,protocolidx,msgreadidx,
 9   msgstatusidx,msgtypeidx,msgreplypathpresentidx,subjectidx,bodyidx,
10   servicecenteridx,lockedidx:integer;
11 begin
12   uri:=StrToJURI('content://sms/inbox');
13   cursor := SharedActivity.getContentResolver.query(uri, nil, nil,nil,nil);
14   addressidx:=cursor.getColumnIndex(StringToJstring('address'));
15   personidx:=cursor.getColumnIndex(StringToJstring('person'));
16   msgdateidx:=cursor.getColumnIndex(StringToJstring('date'));
17   msgdatesentidx:=cursor.getColumnIndex(StringToJstring('date_sent'));
18   protocolidx:=cursor.getColumnIndex(StringToJstring('protocol'));
19   msgreadidx:=cursor.getColumnIndex(StringToJstring('read'));
20   msgstatusidx:=cursor.getColumnIndex(StringToJstring('status'));
21   msgtypeidx:=cursor.getColumnIndex(StringToJstring('type'));
22   msgreplypathpresentidx:=cursor.getColumnIndex(StringToJstring('reply_path_present'));
23   subjectidx:=cursor.getColumnIndex(StringToJstring('subject'));
24   bodyidx:=cursor.getColumnIndex(StringToJstring('body'));
25   servicecenteridx:=cursor.getColumnIndex(StringToJstring('service_center'));
26   lockedidx:=cursor.getColumnIndex(StringToJstring('locked'));
27   while (cursor.moveToNext) do begin
28     address:=JStringToString(cursor.getString(addressidx));
29     person:=JStringToString(cursor.getString(personidx));
30     msgunixtimestampms:=cursor.getLong(msgdateidx);
31     msgdatesent:=JStringToString(cursor.getString(msgdatesentidx));
32     protocol:=JStringToString(cursor.getString(protocolidx));
33     msgread:=JStringToString(cursor.getString(msgreadidx));
34     msgstatus:=JStringToString(cursor.getString(msgstatusidx));
35     msgtype:=JStringToString(cursor.getString(msgtypeidx));
36     msgreplypathpresent:=JStringToString(cursor.getString(msgreplypathpresentidx));
37     subject:=JStringToString(cursor.getString(subjectidx));
38     body:=JStringToString(cursor.getString(bodyidx));
39     servicecenter:=JStringToString(cursor.getString(servicecenteridx));
40     locked:=JStringToString(cursor.getString(lockedidx));
41     Result:=IntToStr(trunc(msgunixtimestampms/1000))+' '+address+' '+body;
42   end;
43 end;
View Code

 

 

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

posted on 2015-08-11 19:21  疯狂delphi  阅读(1683)  评论(0编辑  收藏  举报

导航