方法onLocationChanged()未获取其他位置 package com.example.pointkeeper; 导入java.util.ArrayList; 导入android.app.Service; 导入android.content.Context; 导入android.content.Intent; 导入android.location.Criteria; 导入android.location.location; 导入android.location.LocationListener; 导入android.location.LocationManager; 导入android.os.Bundle; 导入android.os.IBinder; 导入android.util 公共类ServicePointKeeper扩展服务实现LocationListener{ 双纬度; 双经度; 私人位置经理lm; ArrayList pt; p点; 私人语境; 私人位置loc; 私人最终静态长节拍=1*60*1000; 私人最终静态浮动距离a_DE_Atalizacao=1; 公共空间{ 标准=新标准(); 标准.设定精度(标准.精度\精细); 标准。setAltitudeRequired(真); 字符串提供程序=lm.getBestProvider(条件为true); if(提供程序==null){ Log.d(“SistemaGPS.ativar”、“Nenhum provedor encontrado”); }否则{ Log.d(“SistemaGPS.ativar”,“providor utilizado:+提供者”); //lm.requestLocationUpdates(LocationManager.GPS_提供程序,TEMPO_DE_Atalizacao,DISTANCIA_DE_Atalizacao,本文件); lm.请求位置更新(提供程序、节奏、距离); } } 公共void updateList(){ p、 setLatitude(loc.getLatitude()); p、 setLongitude(loc.getLongitude()); 第二部分(p); } @凌驾 已更改位置上的公共无效(位置){ //TODO自动生成的方法存根 loc=位置; Toast.makeText(getApplicationContext(),“Lat:”+loc.getLatitude()+“Long:”+loc.getLatitude(),Toast.LENGTH_Long).show(); updateList(); } @凌驾 公共无效onProviderDisabled(字符串提供程序){ //TODO自动生成的方法存根 } @凌驾 公共无效onProviderEnabled(字符串提供程序){ //TODO自动生成的方法存根 } @凌驾 public void onStatusChanged(字符串提供程序、int状态、Bundle extra){ //TODO自动生成的方法存根 } @凌驾 公共int onStartCommand(Intent Intent、int标志、int startId){ //TODO自动生成的方法存根 Toast.makeText(getBaseContext(),“Serviço iniciado”,Toast.LENGTH_SHORT.show(); this.loc=null; pt=新的ArrayList(); p=新点(); lm=(LocationManager)getSystemService(Context.LOCATION\u服务); setGPS(); Toast.makeText(getBaseContext(),“GPS setado”,Toast.LENGTH_SHORT.show(); 返回开始时间; } @凌驾 公共空间{ //TODO自动生成的方法存根 Toast.makeText(getApplicationContext(),“Serviço parado”,Toast.LENGTH_SHORT.show(); Toast.makeText(getApplicationContext(),“Lat:+纬度+”长:“+经度,Toast.LENGTH_短)。show(); Intent it=newintent(getApplicationContext(),ShowPoints.class); it.setFlags(Intent.FLAG\u ACTIVITY\u NEW\u TASK); Bundle b=新Bundle(); b、 putParcelableArrayList(“点”,pt); 信息技术.附加指令(b); 星触觉(it); super.ondestory(); } @凌驾 公共IBinder onBind(意向){ //TODO自动生成的方法存根 返回null; } }
因此,在这段代码中,我的意图是将一个点列表保存在一个点的ArrayList中,稍后将使用该列表。但是所有的点(纬度和经度)都有相同的值,一旦我有了第一个值,所有其他的值都是相同的,看起来onLocationChanged从未被调用过。方法onLocationChanged()未获取其他位置 package com.example.pointkeeper; 导入java.util.ArrayList; 导入android.app.Service; 导入android.content.Context; 导入android.content.Intent; 导入android.location.Criteria; 导入android.location.location; 导入android.location.LocationListener; 导入android.location.LocationManager; 导入android.os.Bundle; 导入android.os.IBinder; 导入android.util 公共类ServicePointKeeper扩展服务实现LocationListener{ 双纬度; 双经度; 私人位置经理lm; ArrayList pt; p点; 私人语境; 私人位置loc; 私人最终静态长节拍=1*60*1000; 私人最终静态浮动距离a_DE_Atalizacao=1; 公共空间{ 标准=新标准(); 标准.设定精度(标准.精度\精细); 标准。setAltitudeRequired(真); 字符串提供程序=lm.getBestProvider(条件为true); if(提供程序==null){ Log.d(“SistemaGPS.ativar”、“Nenhum provedor encontrado”); }否则{ Log.d(“SistemaGPS.ativar”,“providor utilizado:+提供者”); //lm.requestLocationUpdates(LocationManager.GPS_提供程序,TEMPO_DE_Atalizacao,DISTANCIA_DE_Atalizacao,本文件); lm.请求位置更新(提供程序、节奏、距离); } } 公共void updateList(){ p、 setLatitude(loc.getLatitude()); p、 setLongitude(loc.getLongitude()); 第二部分(p); } @凌驾 已更改位置上的公共无效(位置){ //TODO自动生成的方法存根 loc=位置; Toast.makeText(getApplicationContext(),“Lat:”+loc.getLatitude()+“Long:”+loc.getLatitude(),Toast.LENGTH_Long).show(); updateList(); } @凌驾 公共无效onProviderDisabled(字符串提供程序){ //TODO自动生成的方法存根 } @凌驾 公共无效onProviderEnabled(字符串提供程序){ //TODO自动生成的方法存根 } @凌驾 public void onStatusChanged(字符串提供程序、int状态、Bundle extra){ //TODO自动生成的方法存根 } @凌驾 公共int onStartCommand(Intent Intent、int标志、int startId){ //TODO自动生成的方法存根 Toast.makeText(getBaseContext(),“Serviço iniciado”,Toast.LENGTH_SHORT.show(); this.loc=null; pt=新的ArrayList(); p=新点(); lm=(LocationManager)getSystemService(Context.LOCATION\u服务); setGPS(); Toast.makeText(getBaseContext(),“GPS setado”,Toast.LENGTH_SHORT.show(); 返回开始时间; } @凌驾 公共空间{ //TODO自动生成的方法存根 Toast.makeText(getApplicationContext(),“Serviço parado”,Toast.LENGTH_SHORT.show(); Toast.makeText(getApplicationContext(),“Lat:+纬度+”长:“+经度,Toast.LENGTH_短)。show(); Intent it=newintent(getApplicationContext(),ShowPoints.class); it.setFlags(Intent.FLAG\u ACTIVITY\u NEW\u TASK); Bundle b=新Bundle(); b、 putParcelableArrayList(“点”,pt); 信息技术.附加指令(b); 星触觉(it); super.ondestory(); } @凌驾 公共IBinder onBind(意向){ //TODO自动生成的方法存根 返回null; } },android,gps,location,Android,Gps,Location,因此,在这段代码中,我的意图是将一个点列表保存在一个点的ArrayList中,稍后将使用该列表。但是所有的点(纬度和经度)都有相同的值,一旦我有了第一个值,所有其他的值都是相同的,看起来onLocationChanged从未被调用过。 有人能帮我吗?您有一个全局点p,您正在覆盖对updateList的每个调用。由于从未创建过新点,因此将覆盖旧值。这意味着列表中的每个元素都将始终具有最新的值,而不是当时的值 还有,为什么到处都使用类变量,而不是将参数传递给函数?我感觉您不太了解Java或引用 编辑
有人能帮我吗?您有一个全局点p,您正在覆盖对updateList的每个调用。由于从未创建过新点,因此将覆盖旧值。这意味着列表中的每个元素都将始终具有最新的值,而不是当时的值 还有,为什么到处都使用类变量,而不是将参数传递给函数?我感觉您不太了解Java或引用 编辑: 以下是正确使用局部变量时代码的外观:
package com.example.pointkeeper;
import java.util.ArrayList;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.util
public class ServicePointKeeper extends Service implements LocationListener{
double latitude;
double longitude;
private LocationManager lm;
ArrayList<Point> pt;
Point p;
private Context context;
private Location loc;
private final static long TEMPO_DE_ATUALIZACAO = 1 * 60 * 1000 ;
private final static float DISTANCIA_DE_ATUALIZACAO = 1 ;
public void setGPS(){
Criteria criteria = new Criteria();
criteria.setAccuracy( Criteria.ACCURACY_FINE );
criteria.setAltitudeRequired(true);
String provider = lm.getBestProvider(criteria, true);
if ( provider == null ) {
Log.d("SistemaGPS.ativar", "Nenhum provedor encontrado.");
} else {
Log.d("SistemaGPS.ativar", "Provedor utilizado: " + provider);
//lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, TEMPO_DE_ATUALIZACAO, DISTANCIA_DE_ATUALIZACAO , this);
lm.requestLocationUpdates(provider, TEMPO_DE_ATUALIZACAO, DISTANCIA_DE_ATUALIZACAO , this);
}
}
public void updateList(){
p.setLatitude(loc.getLatitude());
p.setLongitude(loc.getLongitude());
pt.add(p);
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
loc = location;
Toast.makeText(getApplicationContext(), "Lat: " + loc.getLatitude() + "Long: " + loc.getLongitude(), Toast.LENGTH_LONG).show();
updateList();
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
Toast.makeText(getBaseContext(), "Serviço iniciado", Toast.LENGTH_SHORT).show();
this.loc = null;
pt = new ArrayList<Point>();
p = new Point();
lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
setGPS();
Toast.makeText(getBaseContext(), "GPS setado", Toast.LENGTH_SHORT).show();
return START_STICKY;
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "Serviço parado", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), "Lat: " + latitude + "Long: " + longitude, Toast.LENGTH_SHORT).show();
Intent it = new Intent(getApplicationContext(), ShowPoints.class);
it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Bundle b = new Bundle();
b.putParcelableArrayList("points", pt);
it.putExtras(b);
startActivity(it);
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
package com.example.pointkeeper;
导入java.util.ArrayList;
导入android.app.Service;
导入android.content.Context;
导入android.content.Intent;
导入android.location.Criteria;
导入android.location.location;
导入android.location.LocationListener;
导入android.location.LocationManager;
导入android.os.Bundle;
导入android.os.IBinder;
导入android.util
公共类ServicePointKeeper扩展服务实现LocationListener{
私人位置经理lm;
ArrayList pt;
私人最终静态长节拍=1*60*1000;
私人最终静态浮动距离a_DE_Atalizacao=1;
公共空间{
标准=新标准();
标准.设定精度(标准.精度\精细);
标准。setAltitudeRequired(真);
字符串提供程序=lm.getBestProvider(条件为true);
if(提供程序==null){
Log.d(“SistemaGPS.ativar”、“Nenhum provedor encontrado”);
}否则{
Log.d(“SistemaGPS.ativar”,“providor utilizado:+提供者”);
//lm.requestLocationUpdates(LocationManager.GPS_提供程序,TEMPO_DE_Atalizacao,DISTANCIA_DE_Atalizacao,本文件);
lm.请求位置更新(提供程序、节奏、距离);
}
}
公共无效更新列表(位置loc){
点p=新点();
p、 setLatitude(loc.getLatitude());
p、 setLongitude(loc.getLongitude());
第二部分(p);
}
@凌驾
位置更改后的公共无效(位置
package com.example.pointkeeper;
import java.util.ArrayList;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.util
public class ServicePointKeeper extends Service implements LocationListener{
private LocationManager lm;
ArrayList<Point> pt;
private final static long TEMPO_DE_ATUALIZACAO = 1 * 60 * 1000 ;
private final static float DISTANCIA_DE_ATUALIZACAO = 1 ;
public void setGPS(){
Criteria criteria = new Criteria();
criteria.setAccuracy( Criteria.ACCURACY_FINE );
criteria.setAltitudeRequired(true);
String provider = lm.getBestProvider(criteria, true);
if ( provider == null ) {
Log.d("SistemaGPS.ativar", "Nenhum provedor encontrado.");
} else {
Log.d("SistemaGPS.ativar", "Provedor utilizado: " + provider);
//lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, TEMPO_DE_ATUALIZACAO, DISTANCIA_DE_ATUALIZACAO , this);
lm.requestLocationUpdates(provider, TEMPO_DE_ATUALIZACAO, DISTANCIA_DE_ATUALIZACAO , this);
}
}
public void updateList(Location loc){
Point p = new Point();
p.setLatitude(loc.getLatitude());
p.setLongitude(loc.getLongitude());
pt.add(p);
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "Lat: " + location.getLatitude() + "Long: " + location.getLongitude(), Toast.LENGTH_LONG).show();
updateList(location);
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
Toast.makeText(getBaseContext(), "Serviço iniciado", Toast.LENGTH_SHORT).show();
pt = new ArrayList<Point>();
lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
setGPS();
Toast.makeText(getBaseContext(), "GPS setado", Toast.LENGTH_SHORT).show();
return START_STICKY;
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "Serviço parado", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), "Lat: " + latitude + "Long: " + longitude, Toast.LENGTH_SHORT).show();
Intent it = new Intent(getApplicationContext(), ShowPoints.class);
it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Bundle b = new Bundle();
b.putParcelableArrayList("points", pt);
it.putExtras(b);
startActivity(it);
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}