做了一个小应用智能情景的切换,这个应用是学习android开发以来应用类开发的比较满意的一个。虽然它只有一个view 一个activity,但是却囊括了android的很多特性。借此机会,和大家分享一下这个小应用。
先上截图:
应用的主要功能是根据适当的情景(如地点,手机状态等)为用户自动的切换情景模式。
比方说:手机向上是铃音+震动,当开会时,将手机翻转,将自动切换成静音模式。
还可以根据经纬度,到达一个地方后自动切换成用户预先设置的情景模式。
(当然,由于没找到合适的经纬度换算工具,经纬度的判断目前只能是精确位置,不是范围值。
因此只能算是个学习的小应用了,实际的应用还有待完善啊。如果有高手知道的话,麻烦告诉我下。万分感谢)
-------------------------废话不多说开始代码部分-----------------------------------------------------
虽然是一个只有一个页面的小应用,但是
麻雀虽小,五脏俱全
这个应用的功能点主要有:
改变情景模式
实时获取地理位置
实时判断手机重力状态
用到的技术包括:
1.android Google map的应用
2.Android组件的使用
Activity(MapActivity)
Service
Broadcastreceiver
3.Xml解析
4.文件存储
5.传感器使用
6.底层绘图
7.自定义view
由于使回头看代码,我就从简单的部分一步步介绍。
首先是权限问题,很多新手都犯了这个毛病,程序出错,往往是权限没有添加。
- <!-- 网络链接 -->
- <uses-permission android:name="android.permission.INTERNET"/>
- <!-- 地图 -->
- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
- <!-- 读写权限 -->
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.WRITE" />
<!-- 网络链接 -->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- 地图 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- 读写权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE" />
这个应用需要网络连接的权限,因为Google map是实时更新的么。然后是GPS传感器关于地理位置的权限。最后需要存储用户的记录点,所以有文件读写的权限。
为了记录用户记录的情景地点,我使用了XML作为存储的标准,并将文件存在了SD卡上
XML解析
网络上有很详细的各种解析方式,我采用了其中的一种。如果想了解其他的请Google。。。。。
记录地点信息,我定义了一个POJO类
- public class RecordLocation {
- private String location_Id;
- private String location_ring;
- private double location_latitude;
- private double location_longitude;
- private GeoPoint point;
- ...篇幅关系,其他的略
public class RecordLocation {
private String location_Id;
private String location_ring;
private double location_latitude;
private double location_longitude;
private GeoPoint point;
...篇幅关系,其他的略
XML的解析器,和网络上的其他文章一样就不多说了。能拿来用就成。
- public List<RecordLocation> parse(String xml) {
- final RecordLocation currentMessage = new RecordLocation();
- RootElement root = new RootElement("Locations");
- final List<RecordLocation> messages = new ArrayList<RecordLocation>();
-
- Element item = root.getChild("Location");
- item.setEndElementListener(new EndElementListener(){
- public void end() {
- messages.add(currentMessage.copy());
- }
- });
- item.getChild("id").setEndTextElementListener(new EndTextElementListener(){
- public void end(String body) {
- currentMessage.setLocation_Id(body);
- }
- });
- item.getChild("ring").setEndTextElementListener(new EndTextElementListener(){
- public void end(String body) {
- currentMessage.setLocation_ring(body);
- }
- });
- item.getChild("latitude").setEndTextElementListener(new
- EndTextElementListener(){
- public void end(String body) {
- currentMessage.setLocation_latitude(Double.valueOf(body));
- }
- });
- item.getChild("longitude").setEndTextElementListener(new EndTextElementListener(){
- public void end(String body) {
- currentMessage.setLocation_longitude(Double.valueOf(body));
- }
- });
-
- try {
- InputStream inputStream = new ByteArrayInputStream(xml.getBytes());
- Xml.parse(inputStream, Xml.Encoding.UTF_8,
- root.getContentHandler());
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- return messages;