Android中GPS定位的简单应用

在Android中通过GPS获得当前位置,首先要获得一个LocationManager实例,通过该实例的getLastKnownLocation()方法获得第一个的位置,该方法的说明如下:

void android.location.LocationManager.requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)

provider即定位方式,可以采用GPS定位(LocationManager.GPS_PROVIDER)或者网络定位(LocationManager.NETWORK_PROVIDER),本文是GPS定位,因此使用LocationManager.GPS_PROVIDER。minTime是位置更新的间隔时间。listener是位置改变的监听器,自己定义一个LocationListener(),重写onLocationChanged(),加入位置改变时的动作。

布局文件:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
 
    <TextView
        android:id="@+id/txt_time"
        style="@style/my_text"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="时间:" />
 
    <TextView
        android:id="@+id/txt_lat"
        style="@style/my_text"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="经度:" />
 
    <TextView
        android:id="@+id/txt_lng"
        style="@style/my_text"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="纬度:" />
 
</LinearLayout>

MainActivity.java文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package com.hzhi.my_gps;
 
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
 
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;
import android.widget.TextView;
 
public class MainActivity extends Activity {
     
    TextView txt_time;
    TextView txt_lat;
    TextView txt_lng;
    LocationManager lom;
    Location loc;
    Double lat;
    Double lng;
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date now;
    String str_date;
    Timer timer;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
         
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         
        get_con();
        get_gps();
         
        timer = new Timer(true);
        timer.schedule(task, 0, 1000);
         
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
     
    public void get_gps(){
         
        lom = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        loc = lom.getLastKnownLocation(LocationManager.GPS_PROVIDER);
         
        if (loc != null) {
            lat = loc.getLatitude();
            lng = loc.getLongitude();
            txt_lat.setText("纬度:" + String.valueOf(lat));
            txt_lng.setText("经度:" + String.valueOf(lng));
        }
        else{
            txt_lat.setText("纬度:未知" );
            txt_lng.setText("经度:未知" );
        }
         
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        criteria.setAltitudeRequired(false);
        criteria.setBearingRequired(false);
        criteria.setCostAllowed(true);
        criteria.setPowerRequirement(Criteria.POWER_LOW);
        String provider = lom.getBestProvider(criteria, true);
         
        lom.requestLocationUpdates(provider, 1000, 10, los);
         
    }
     
    LocationListener los = new LocationListener(){
         
        public void onLocationChanged(Location location){
             
            if (location != null) {
                lat = location.getLatitude();
                lng = location.getLongitude();
                txt_lat.setText("纬度:" + String.valueOf(lat));
                txt_lng.setText("经度:" + String.valueOf(lng));
            }
            else{
                txt_lat.setText("纬度:未知" );
                txt_lng.setText("经度:未知" );
            }
             
        };
         
        public void onProviderDisabled(String provider){
         
        };
         
        public void onProviderEnabled(String provider){ };
         
        public void onStatusChanged(String provider, int status,
        Bundle extras){ };
         
    };
     
    // 获取控件
    public void get_con(){
         
        txt_time = (TextView) findViewById(R.id.txt_time);
        txt_lat = (TextView) findViewById(R.id.txt_lat);
        txt_lng = (TextView) findViewById(R.id.txt_lng);
         
    }
     
    Handler handler = new Handler(){
         
        public void handleMessage(Message msg){
            switch (msg.what){
            case 1:
                get_time();
                break;
            }
        }
         
    };
     
    TimerTask task = new TimerTask(){ 
          public void run() { 
              Message message = new Message();     
              message.what = 1;     
              handler.sendMessage(message);  
       
    };
     
    // 获取时间
    public void get_time(){
         
        now = new Date(System.currentTimeMillis());
        str_date = formatter.format(now);
        txt_time.setText("时间:" + str_date);
         
    }
 
}

在AndroidManifest.xml文件中加入权限:

1
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

运行前先打开GPS卫星,运行结果:

由于在室内,并且手机质量不好,没获取出来,在室外是可以获取的。

posted @   MSTK  阅读(1505)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
阅读排行:
· 【译】我们最喜欢的2024年的 Visual Studio 新功能
· 个人数据保全计划:从印象笔记迁移到joplin
· Vue3.5常用特性整理
· 重拾 SSH:从基础到安全加固
· 为什么UNIX使用init进程启动其他进程?
点击右上角即可分享
微信分享提示