我有一个ListView的View Adapter方法,它是从JSON文件填充的。
我想在每个列表项的TextView上显示的组件之一是用户位置与ListView上显示的每个位置之间的距离。
但每次运行时应用程序都崩溃了,我知道我的代码从//calculate the distance
开始出现了问题。
有人可以帮我分析并修正我可能出错的地方吗?
以下是JSON中经过解析的经度和纬度的示例:
"latitude": 52.5074779785632,
"longitude": 13.3903813322449,
这是我正在使用的方法:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null){
convertView = LocationsListActivity.this.getLayoutInflater().inflate(R.layout.listitems, null, true);
}
VideoLocation vidLocation = videoLocations[position];
ImageView v = (ImageView)convertView.findViewById(R.id.image);
String url = vidLocation.documentary_thumbnail_url;
v.setTag(url);
loader.DisplayImage(url, ctx, v);
TextView titleView = (TextView)convertView.findViewById(R.id.txt_title);
String title = vidLocation.name;
titleView.setText(title.toUpperCase());
TextView descView = (TextView)convertView.findViewById(R.id.txt_list_desc);
String desc = vidLocation.text;
descView.setText(desc);
//calculate the distance
Location newLocation = new Location("User");
GeoPoint geopoint = new GeoPoint(
(int) (newLocation.getLatitude() * 1E6), (int) (newLocation
.getLongitude() * 1E6));
GeoPoint myposition = geopoint;
Location locationA = new Location("point A");
Location locationB = new Location("point B");
locationA.setLatitude(geopoint.getLatitudeE6() / 1E6);
locationA.setLongitude(geopoint.getLongitudeE6() / 1E6);
locationB.setLatitude(vidLocation.latitude/ 1E6);
locationB.setLongitude(vidLocation.longitude / 1E6);
double distance = locationA.distanceTo(locationB);
String distances = String.valueOf(distance);
TextView distanceView = (TextView)convertView.findViewById(R.id.txt_distance);
System.out.println(distances);
distanceView.setText(distances+" m");
return convertView;
}
答案 0 :(得分:1)
当您的应用程序崩溃并且您在StackOverflow上询问它时,您应该始终包含崩溃详细信息的logcat输出。答案几乎总是在那里,很容易挑选出来。
您在这里做的是错误地使用Location对象。如果你查看你正在使用的构造函数的文档,你会发现它只返回一个默认的位置对象,并且不包含设备的实际位置。此外,您传递给它的字符串不是任意的,它是与此Location对象关联的位置提供者的名称。
要获取用户的上一个已知位置,请获取LocationManager的实例并调用getLastKnownLocation。这也需要一个字符串,该字符串对应于应该使用的位置提供者。
阅读有关获取用户位置的文档,并查看Criteria对象和LocationManager.getBestProvider方法。这些是获得最佳位置并且不会在此过程中崩溃的最安全方式。例如,如果您请求位置传递GPS提供程序字符串并且设备没有GPS或用户关闭了GPS,则代码将崩溃(我相信在这种情况下您从getLastKnownLocation获取空对象)。还要确保为清单添加适当的权限。
http://developer.android.com/guide/topics/location/obtaining-user-location.html
http://developer.android.com/reference/android/location/Criteria.html
http://developer.android.com/reference/android/location/LocationManager.html
答案 1 :(得分:1)
Location newLocation = new Location("User");
“用户”不是有效的LocationProvider。它至少应该是
之一LocationManager.getAllProviders();
(通常是“gps”或“网络”)
此外,在您的代码中,newLocation并未真正初始化。它的值很可能是空的。您应该获得用户位置,例如:
LocationManager.getLastKnownLocation(null);