如何使用Android的LocationManager和监听器 [英] How to use Android LocationManager and Listener
问题描述
我没有任何运气使用下面的code接收来自GPS的任何数据,我不知道我做错了,好像我的code匹配的一切,我在网上看到的。我想最终将它添加到一个后台服务登录的GPS坐标,即使该活动是不可见的,或者其他应用程序是开放的,如果速度大于一定的预定量,但在这一点上,我不能即使得到任何数据的展现出来。我是比较新的到Android,但我想不出什么我做错了?
公共类MainActivity延伸活动{
的TextView TextView的;
MyLocationListener myLocationListener;
LocationManager流明;
@覆盖
保护无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_main);
this.textView =(TextView中)findViewById(R.id.message);
addLocationListener();
}
@覆盖
公共布尔onCreateOptionsMenu(功能菜单){
//充气菜单;这增加了项目操作栏,如果它是present。
。getMenuInflater()膨胀(R.menu.main,菜单);
返回true;
}
私人无效addLocationListener()
{
LM =(LocationManager)getSystemService(Context.LOCATION_SERVICE);
标准C =新标准();
c.setAccuracy(Criteria.ACCURACY_FINE);
最终字符串提供程序= lm.getBestProvider(C,真正的);
this.myLocationListener =新MyLocationListener();
this.lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,0L,0.0F,this.myLocationListener);
//lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0L,0.0F,myLocationListener);
Log.d(LOC_SERVICE,服务运行!);
}
公共无效updateLocation(位置定位)
{
双纬度,经度;
纬度= location.getLatitude();
经度= location.getLongitude();
INT英里= convertSpeed(location.getSpeed());
Log.d(LOC_SERVICE,英里:+英里每小时);
this.textView.setText(this.textView.getText()+\ N+纬度:+纬度+LNG+经度+英里+英里);
}
私人诠释convertSpeed(浮点速度){
INT英里=(INT)(2.236936D *速度);
返回英里;
}
类MyLocationListener实现LocationListener的{
@覆盖
公共无效onLocationChanged(位置定位){
Log.d(LOC_SERVICE,监听器正在运行!);
updateLocation(位置);
}
@覆盖
公共无效onProviderDisabled(字符串提供商){}
@覆盖
公共无效onProviderEnabled(字符串提供商){}
@覆盖
公共无效onStatusChanged(字符串商,INT地位,捆绑演员){}
}
}
试试下面的code -
包com.muslimcompanion.utills;
进口android.app.AlertDialog;
进口android.app.Service;
进口android.content.Context;
进口android.content.DialogInterface;
进口android.content.Intent;
进口android.location.Location;
进口android.location.LocationListener;
进口android.location.LocationManager;
进口android.os.Bundle;
进口android.os.IBinder;
进口android.provider.Settings;
进口android.util.Log;
公共类GPSTracker扩展服务实现LocationListener的{
私人最终语境mContext;
//标志GPS状态
布尔isGPSEnabled = FALSE;
//标志网络状态
布尔isNetworkEnabled = FALSE;
//标志GPS状态
布尔canGetLocation = FALSE;
地点位置; // 位置
双纬度; // 纬度
双经度; // 经度
//最小距离改变以米为单位更新
私有静态最后长MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; //10米
//毫秒更新之间的最短时间
私有静态最后长MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1分钟
//声明一个位置管理
保护LocationManager locationManager;
公共GPSTracker(上下文的背景下){
this.mContext =背景;
的getLocation();
}
公共场所的getLocation(){
尝试 {
locationManager =(LocationManager)mContext
.getSystemService(LOCATION_SERVICE);
//获取GPS状态
isGPSEnabled = locationManager
.isProviderEnabled(LocationManager.GPS_PROVIDER);
//获取网络状态
isNetworkEnabled = locationManager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
如果(isGPSEnabled&安培;!&安培;!isNetworkEnabled){
//没有网络提供商启用
} 其他 {
this.canGetLocation = TRUE;
//首先从网络提供商处获取位置
如果(isNetworkEnabled){
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES,这一点);
Log.d(网络,网络);
如果(locationManager!= NULL){
位置= locationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
如果(位置!= NULL){
纬度= location.getLatitude();
经度= location.getLongitude();
}
}
}
//如果GPS功能的获得纬度/经度使用GPS服务
如果(isGPSEnabled){
如果(位置== NULL){
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES,这一点);
Log.d(GPS功能的,GPS功能的);
如果(locationManager!= NULL){
位置= locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
如果(位置!= NULL){
纬度= location.getLatitude();
经度= location.getLongitude();
}
}
}
}
}
}赶上(例外五){
e.printStackTrace();
}
返回的位置;
}
公共无效stopUsingGPS(){
如果(locationManager!= NULL){
locationManager.removeUpdates(GPSTracker.this);
}
}
公共双getLatitude(){
如果(位置!= NULL){
纬度= location.getLatitude();
}
//返回纬度
返回纬度;
}
公共双getLongitude(){
如果(位置!= NULL){
经度= location.getLongitude();
}
//返回经度
返回经度;
}
公共布尔canGetLocation(){
返回this.canGetLocation;
}
公共无效showSettingsAlert(){
AlertDialog.Builder alertDialog =新AlertDialog.Builder(mContext);
//设置对话框标题
alertDialog.setTitle(全球定位系统设置);
//设置对话框消息
alertDialog.setMessage(GPS未启用你想进入设置菜单。?);
//在pressing设置按钮
alertDialog.setPositiveButton(设置,新DialogInterface.OnClickListener(){
公共无效的onClick(DialogInterface对话,诠释它){
意向意图=新的意图(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
mContext.startActivity(意向);
dialog.cancel();
}
});
alertDialog.setCancelable(假);
alertDialog.show();
}
@覆盖
公共无效onLocationChanged(位置定位){
}
@覆盖
公共无效onProviderDisabled(字符串提供商){
}
@覆盖
公共无效onProviderEnabled(字符串提供商){
}
@覆盖
公共无效onStatusChanged(字符串商,INT地位,捆绑演员){
}
@覆盖
公众的IBinder onBind(意向为arg0){
返回null;
}
}
现在把这些线到你的活动 -
GPSTracker GPS =新GPSTracker(本);
INT状态= 0;
如果(gps.canGetLocation())
{
状态= GooglePlayServicesUtil
.isGooglePlayServicesAvailable(getApplicationContext());
如果(状态== ConnectionResult.SUCCESS){
current_lattitude = gps.getLatitude();
current_longitude = gps.getLongitude();
_app prefs.saveSmsBody(+ current_lattitude);
_app prefs.saveSmsBody(+ current_longitude);
Log.d(dashlatlongon,+ current_lattitude + -
+ current_longitude);
如果(current_lattitude == 0.0&功放;&安培; current_longitude == 0.0){
current_lattitude = 22.22;
current_longitude = 22.22;
}
} 其他 {
current_lattitude = 22.22;
current_longitude = 22.22;
}
}
其他
{
gps.showSettingsAlert();
}
I'm not having any luck receiving any data from the GPS using the code below, and i'm not sure what I'm doing wrong, it seems like my code matches everything i see online. i'd like to eventually add this to a background service to log gps coordinates even when the activity isn't visible or if other apps are open and if the speed is greater than a certain defined amount, but at this point I can't even get any of the data to show up. i'm relatively new to android but i can't figure out what am i doing wrong?
public class MainActivity extends Activity {
TextView textView;
MyLocationListener myLocationListener;
LocationManager lm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.textView = (TextView)findViewById(R.id.message);
addLocationListener();
}
@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;
}
private void addLocationListener()
{
lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
Criteria c = new Criteria();
c.setAccuracy(Criteria.ACCURACY_FINE);
final String PROVIDER = lm.getBestProvider(c, true);
this.myLocationListener = new MyLocationListener();
this.lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0L, 0.0F, this.myLocationListener);
//lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0L, 0.0F, myLocationListener);
Log.d("LOC_SERVICE", "Service RUNNING!");
}
public void updateLocation(Location location)
{
double latitude, longitude;
latitude = location.getLatitude();
longitude = location.getLongitude();
int mph = convertSpeed(location.getSpeed());
Log.d("LOC_SERVICE", "mph: "+mph);
this.textView.setText(this.textView.getText()+"\n"+"lat: "+latitude+" lng: "+longitude+" mph: "+mph);
}
private int convertSpeed(float speed) {
int mph =(int)(2.236936D * speed);
return mph;
}
class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location location) {
Log.d("LOC_SERVICE", "Listener RUNNING!");
updateLocation(location);
}
@Override
public void onProviderDisabled(String provider) {}
@Override
public void onProviderEnabled(String provider) {}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {}
}
}
Try following code -
package com.muslimcompanion.utills;
import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
import android.util.Log;
public class GPSTracker extends Service implements LocationListener {
private final Context mContext;
// flag for GPS status
boolean isGPSEnabled = false;
// flag for network status
boolean isNetworkEnabled = false;
// flag for GPS status
boolean canGetLocation = false;
Location location; // location
double latitude; // latitude
double longitude; // longitude
// The minimum distance to change Updates in meters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
// The minimum time between updates in milliseconds
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute
// Declaring a Location Manager
protected LocationManager locationManager;
public GPSTracker(Context context) {
this.mContext = context;
getLocation();
}
public Location getLocation() {
try {
locationManager = (LocationManager) mContext
.getSystemService(LOCATION_SERVICE);
// getting GPS status
isGPSEnabled = locationManager
.isProviderEnabled(LocationManager.GPS_PROVIDER);
// getting network status
isNetworkEnabled = locationManager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGPSEnabled && !isNetworkEnabled) {
// no network provider is enabled
} else {
this.canGetLocation = true;
// First get location from Network Provider
if (isNetworkEnabled) {
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("Network", "Network");
if (locationManager != null) {
location = locationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
// if GPS Enabled get lat/long using GPS Services
if (isGPSEnabled) {
if (location == null) {
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("GPS Enabled", "GPS Enabled");
if (locationManager != null) {
location = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return location;
}
public void stopUsingGPS(){
if(locationManager != null){
locationManager.removeUpdates(GPSTracker.this);
}
}
public double getLatitude(){
if(location != null){
latitude = location.getLatitude();
}
// return latitude
return latitude;
}
public double getLongitude(){
if(location != null){
longitude = location.getLongitude();
}
// return longitude
return longitude;
}
public boolean canGetLocation() {
return this.canGetLocation;
}
public void showSettingsAlert(){
AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
// Setting Dialog Title
alertDialog.setTitle("GPS is settings");
// Setting Dialog Message
alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");
// On pressing Settings button
alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int which) {
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
mContext.startActivity(intent);
dialog.cancel();
}
});
alertDialog.setCancelable(false);
alertDialog.show();
}
@Override
public void onLocationChanged(Location location) {
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
}
Now put these line into your activity -
GPSTracker gps = new GPSTracker(this);
int status = 0;
if(gps.canGetLocation())
{
status = GooglePlayServicesUtil
.isGooglePlayServicesAvailable(getApplicationContext());
if (status == ConnectionResult.SUCCESS) {
current_lattitude = gps.getLatitude();
current_longitude = gps.getLongitude();
_appPrefs.saveSmsBody("" + current_lattitude);
_appPrefs.saveSmsBody("" + current_longitude);
Log.d("dashlatlongon", "" + current_lattitude + "-"
+ current_longitude);
if (current_lattitude == 0.0 && current_longitude == 0.0) {
current_lattitude = 22.22;
current_longitude = 22.22;
}
} else {
current_lattitude = 22.22;
current_longitude = 22.22;
}
}
else
{
gps.showSettingsAlert();
}
这篇关于如何使用Android的LocationManager和监听器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!