做了一個(gè)小應(yīng)用智能情景的切換,這個(gè)應(yīng)用是學(xué)習(xí)android開發(fā)以來(lái)應(yīng)用類開發(fā)的比較滿意的一個(gè)。雖然它只有一個(gè)view 一個(gè)activity,但是卻囊括了android的很多特性。借此機(jī)會(huì),和大家分享一下這個(gè)小應(yīng)用。
先上截圖:
應(yīng)用的主要功能是根據(jù)適當(dāng)?shù)那榫埃ㄈ绲攸c(diǎn),手機(jī)狀態(tài)等)為用戶自動(dòng)的切換情景模式。
比方說(shuō):手機(jī)向上是鈴音+震動(dòng),當(dāng)開會(huì)時(shí),將手機(jī)翻轉(zhuǎn),將自動(dòng)切換成靜音模式。
還可以根據(jù)經(jīng)緯度,到達(dá)一個(gè)地方后自動(dòng)切換成用戶預(yù)先設(shè)置的情景模式。
(當(dāng)然,由于沒(méi)找到合適的經(jīng)緯度換算工具,經(jīng)緯度的判斷目前只能是精確位置,不是范圍值。
因此只能算是個(gè)學(xué)習(xí)的小應(yīng)用了,實(shí)際的應(yīng)用還有待完善啊。如果有高手知道的話,麻煩告訴我下。萬(wàn)分感謝)
-------------------------廢話不多說(shuō)開始代碼部分-----------------------------------------------------
雖然是一個(gè)只有一個(gè)頁(yè)面的小應(yīng)用,但是
麻雀雖小,五臟俱全
這個(gè)應(yīng)用的功能點(diǎn)主要有:
改變情景模式
實(shí)時(shí)獲取地理位置
實(shí)時(shí)判斷手機(jī)重力狀態(tài)
用到的技術(shù)包括:
1.android Google map的應(yīng)用
2.Android組件的使用
Activity(MapActivity)
Service
Broadcastreceiver
3.Xml解析
4.文件存儲(chǔ)
5.傳感器使用
6.底層繪圖
7.自定義view
由于使回頭看代碼,我就從簡(jiǎn)單的部分一步步介紹。
首先是權(quán)限問(wèn)題,很多新手都犯了這個(gè)毛病,程序出錯(cuò),往往是權(quán)限沒(méi)有添加。
- <!-- 網(wǎng)絡(luò)鏈接 -->
- <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"/>
- <!-- 讀寫權(quán)限 -->
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.WRITE" />
<!-- 網(wǎng)絡(luò)鏈接 -->
<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"/>
<!-- 讀寫權(quán)限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE" />
這個(gè)應(yīng)用需要網(wǎng)絡(luò)連接的權(quán)限,因?yàn)镚oogle map是實(shí)時(shí)更新的么。然后是GPS傳感器關(guān)于地理位置的權(quán)限。最后需要存儲(chǔ)用戶的記錄點(diǎn),所以有文件讀寫的權(quán)限。
為了記錄用戶記錄的情景地點(diǎn),我使用了XML作為存儲(chǔ)的標(biāo)準(zhǔn),并將文件存在了SD卡上
XML解析
網(wǎng)絡(luò)上有很詳細(xì)的各種解析方式,我采用了其中的一種。如果想了解其他的請(qǐng)Google。。。。。
記錄地點(diǎn)信息,我定義了一個(gè)POJO類
- public class RecordLocation {
- private String location_Id;
- private String location_ring;
- private double location_latitude;
- private double location_longitude;
- private GeoPoint point;
- ...篇幅關(guān)系,其他的略
public class RecordLocation {
private String location_Id;
private String location_ring;
private double location_latitude;
private double location_longitude;
private GeoPoint point;
...篇幅關(guān)系,其他的略
XML的解析器,和網(wǎng)絡(luò)上的其他文章一樣就不多說(shuō)了。能拿來(lái)用就成。
- 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;