软件名称:智能定位系统
软件功能:定位并读取当前经纬度坐标;
在地图中显示当前位置;
每20S以邮件形式发送当前经纬度及位置信息;
设置号码并一键求救;
软件适用范围:6岁以上人员;手机适用场景
软件目的:对儿童,老人及有需要人员进行实时位置监控,减少意外发生
软件介绍:该系统能够读取当前经纬坐标,并每20S以邮件形式发送当前经纬度及位置信息。该系统中有紧急按钮,可以在按下时对指定手机或座机发送求救电话。
项目难点:如何进行数据传输(同时期望较小耗电)
实现过程:
//Android实现发送邮件,首先需要依赖additional.jar、mail.jar和activation.jar这3个jar
//包。在Android系统中发送邮件是网络 *** 作 属于耗时 *** 作 所以我们发送的时候要在子
//线程中去发送
@Override
public void onLocationChanged(TencentLocation tencentLocation, int i, String s) {
Marker marker;
if (TencentLocation.ERROR_OK == error) {
// 定位成功
Log.v("this", "定位成功!");
if (tencentLocation != null) {
String lat = String.valueOf(tencentLocation.getLatitude());
String lon = String.valueOf(tencentLocation.getLongitude());
String address = tencentLocation.getAddress();
LatLng position = new LatLng(Double.parseDouble(lat),Double.parseDouble(lon));
//自动发送邮件
if(thread == null){
mail=new SendMail(lat,lon,address,mails);
thread=new Thread(mail);
thread.start();
marker = tencentMap.addMarker(new MarkerOptions()
.position(position)
.title(address)
.anchor(0.5f, 0.5f)
.icon(BitmapDescriptorFactory.defaultMarker())
.draggable(true));
marker.showInfoWindow();// 设置默认显示一个infoWindow
}else {
marker=null;
thread=null;
mail=null;
mail=new SendMail(lat,lon,address,mails);
thread=new Thread(mail);
thread.start();
marker = tencentMap.addMarker(new MarkerOptions()
.position(position)
.title(address)
.anchor(0.5f, 0.5f)
.icon(BitmapDescriptorFactory.defaultMarker())
.draggable(true));
marker.showInfoWindow();// 设置默认显示一个infoWindow
}
Log.v("this", "当前经度:" + lat + "当前纬度:" + lon + "当前地址:" + address);
tencentMap.setCenter(position);
} else {
// 定位失败
Log.v("this", "定位失败!");
}
}
}
/**
* 状态回调接口
* @param s
* @param i
* @param s1
*/
@Override
public void onStatusUpdate (String s,int i, String s1){
}
}
//发送邮件(类封装和执行线程):
package com.example.pp.shadow4;
import java.util.ArrayList;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
public class SendMail implements Runnable {
String lat;
String lon;
String address;
ArrayList
public SendMail(String lat,String lon,String address,ArrayList
this.lat=lat;
this.lon=lon;
this.address=address;
this.mails = mails;
}
@Override
public void run() {
try {
EmailSender sender = new EmailSender();
//设置服务器地址和端口,可以查询网络
sender.setProperties("smtp.qq.com", "465");
//分别设置发件人,邮件标题和文本内容
sender.setMessage("mhuanyu@foxmail.com", "位置", "经度:"+
lat+"
纬度:"+lon+"
位置:"+address+"");
//设置收件人
// sender.setReceiver(new String[]{"peixingpeixing@qq.com","mhuanyu@foxmail.com"});
sender.setReceiver(mails.toArray(new String[mails.size()]));
//添加附件换成你手机里正确的路径
// sender.addAttachment("/sdcard/ceshitest.txt");
//发送邮件
//sender.setMessage("你的163邮箱账号", "EmailS//ender", "Java Mail !");这里面两个邮箱账号要一致
sender.sendEmail("smtp.qq.com", "mhuanyu@foxmail.com", "jgbiogsdrefsbaid");
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
package com.example.pp.shadow4;
import java.io.File;
import java.util.Date;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
public class EmailSender {
private Properties properties;
private Session session;
private Message message;
private MimeMultipart multipart;
public EmailSender() {
this.properties = new Properties();
}
public void setProperties(String host,String post){
//地址
this.properties.put("mail.smtp.host",host);
//端口号
this.properties.put("mail.smtp.post",post);
//是否验证
this.properties.put("mail.smtp.auth",true);
this.session=Session.getInstance(properties);
this.message = new MimeMessage(session);
this.multipart = new MimeMultipart("mixed");
}
/**
* 设置收件人
* @param receiver 收件人
* @throws MessagingException
*/
public void setReceiver(String[] receiver) throws MessagingException {
Address[] address = new InternetAddress[receiver.length];
for(int i=0;i
address[i] = new InternetAddress(receiver[i]);
}
this.message.setRecipients(Message.RecipientType.TO, address);
}
/**
* 设置邮件
* @param from 来源
* @param title 标题
* @param content 内容
* @throws AddressException
* @throws MessagingException
*/
public void setMessage(String from,String title,String content) throws AddressException, MessagingException{
this.message.setFrom(new InternetAddress(from));
this.message.setSubject(title);
// this.message.setContent(content,"text/html;charset=gbk");
//纯文本的话用setText()就行,不过有附件就显示不出来内容了
MimeBodyPart textBody = new MimeBodyPart();
// textBody.setText(content);
textBody.setContent(content,"text/html;charset=utf-8");
this.multipart.addBodyPart(textBody);
}
/**
* 添加附件
* @param filePath 文件路径
* @throws MessagingException
*/
public void addAttachment(String filePath) throws MessagingException{
FileDataSource fileDataSource = new FileDataSource(new File(filePath));
DataHandler dataHandler = new DataHandler(fileDataSource);
MimeBodyPart mimeBodyPart = new MimeBodyPart();
mimeBodyPart.setDataHandler(dataHandler);
mimeBodyPart.setFileName(fileDataSource.getName());
this.multipart.addBodyPart(mimeBodyPart);
}
/**
* 发送邮件
* @param host 地址
* @param account 账户名
* @param pwd 密码
* @throws MessagingException
*/
public void sendEmail(String host,String account,String pwd) throws MessagingException{
//发送时间
this.message.setSentDate(new Date());
//发送的内容,文本和附件
this.message.setContent(this.multipart);
this.message.saveChanges();
//创建邮件发送对象,并指定其使用SMTP协议发送邮件
Transport transport=session.getTransport("smtp");
//登录邮箱
transport.connect(host,account,pwd);
//发送邮件
transport.sendMessage(message, message.getAllRecipients());
//关闭连接
transport.close();
}
}
项目小结:
本次项目最先是打算做两个app来实现数据传输,一个只负责发送,一个只负责接收;但是在实现的过程中发现,如果想要TCP连接的话,存在接收方的权限问题,且无法保证接收方服务一定开启。考虑到定位器对准确度的要求高,对路径规划的要求并不高,我们决定只需要接收方能够不间断接受到发送方的数据即可。考虑到短信的费用问题及对生活的干扰,我们决定通过恒定每20S发送一次邮件的方式。对于是否要增加位置判别来决定发送频率,我们选择不增加,因为如果增加的话会无法判断是儿童位置未改变还是遇到了潜在危险。虽然增加了一键报警功能,但依旧无法确保会不会发生儿童未来得及按键就已失去了按键的机会。
本次项目主要是对安卓程序设计的学习,及对 *** 作系统和计算机网络的理解。通过实践学习安卓程序,通过查找资料来进行其接口的调用,初步接触了多线程的编写,通过对耗时 *** 作开启子线程进行控制,及端口是如何在实践中发挥作用。
信息传输可以分为两个部分:
第一个部分:邮件传输,先是通过腾讯定位获得定位的详细信息,再对定位信息的封装通过邮件发送给父母。我认为这是最好的实现方式,
从经济可行性来分析:它的花费为0,所以可行,邮件我们不需要再自己配置服务器,而是利用现有服务商,可以是任何一个,比如现在用的qq邮箱,也可以用163邮箱等,更简单粗暴的是只要用个人邮件就可以,这个为我们的开发节约了不少的成本。
第二个是技术可行性来分析:javamail的技术经过长时间的发展,可以说是相当的成熟了,在传输文本信息这一块是相当的高效的,在当代办公中也是不可或缺的一种信息传输方式,它的延迟几乎可以忽略,这一点是相当的满足定位追踪的数据实时更新需求。而且发送邮件的形式可以高度自定义。因为利用的是现有邮件服务商,所以现有的邮件技术都可以实现,目前实现的只是自定义收件人的邮件地址,因为用的是一个List集合来存储地址,可以输入多个收件人,也就是小孩的监视人可以有一个以上,上不封顶。在这个应用中,还可以实现自定义得到小孩子位置信息的时间间隔,比如20秒收一次位置信息,也可以一分钟,也可以一个小时。这样一来,小孩子的位置信息可以说是实时掌握着,而所有的监视人都可以知道,可以说是相当的便利了。相较于点对点的两个客户端之间的信息传递方便了不止百倍。技术实现上也减少了难度。功能却一点不减。
第二个部分是一键报警功能。个人觉得这个功能很鸡肋,可以减去,在技术实现上没有什么的难度,但是考虑实际情况的话根本用不上。技术运用就是调用系统应用打电话的功能。唯一方便的是可以永久的设置紧急联系人,这个紧急联系人可以是亲人,也可以是急求电话。一旦设置好了之后就可以一键拨打紧急联系人,不需要再重复拨号码。
用到的技术:把所有有关技术控件或包列一下
功能演示:每个功能过程截图。
项目展示:
左为初始界面图,右为每20S发送一次的信息。
左图中右上角的小人可以输入选择发送的指定邮箱。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)