嘿伙计们,当我运行我的程序并为模拟位置设置地理修复的telnet命令时,我无法找到用户的经度和位置。在模拟器运行时,我只为模拟器设置模拟坐标,使其无响应,并且我的程序在检测输入坐标时失败。
import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
public class LBSact extends Activity{
/** Called when the activity is first created. */
public double longitude;
public double latitude;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
longitude = 0;
latitude = 0;
//Creating the listener and manager
LocationManager LManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
LocationListener createListen = new LocationListener(){
@Override
public void onLocationChanged(Location location) {
//longitude = location.getLongitude();
//latitude = location.getLatitude();
String printout1 = "My current location is: " + "Latitude = " + location.getLatitude() +
"Longitude = " + location.getLongitude();
Toast.makeText(getApplicationContext(),printout1,Toast.LENGTH_LONG).show();
}
@Override
public void onProviderDisabled(String provider) {
Toast.makeText(getApplicationContext(), "GPS disabled", Toast.LENGTH_LONG).show();
}
@Override
public void onProviderEnabled(String provider) {
Toast.makeText(getApplicationContext(), "GPS enabled", Toast.LENGTH_LONG).show();
}
@Override
public void onStatusChanged(String provider, int status,
Bundle extras) {
}
};
//Cant use Network with emulator, can only use GPS mock locations
//Toast.makeText(getApplicationContext(), "Does this work?", Toast.LENGTH_LONG).show();
LManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, createListen);
}
}
答案 0 :(得分:1)
首先。我假设你已经阅读了以下内容: http://developer.android.com/guide/topics/location/obtaining-user-location.html
由于您提到了注入模拟位置数据。您还可以尝试其他一些操作,例如,您可以使用KML文件来注入GPS位置: http://developer.android.com/guide/developing/tools/ddms.html#emulator-control
但您应该做的主要事情是创建日志消息,以便您可以更准确地检测程序失败的位置。这是一篇关于如何设置logcat的文章: http://www.droidnova.com/debugging-in-android-using-eclipse,541.html
我建议这样做,因为发送文本到屏幕可能并不总是有效,因为您的应用程序在进入这些调用之前可能会崩溃。
另外,您是否尝试过通过Eclipse调试应用程序?它会在崩溃时中断,并为您提供应用程序失败的位置。
我会在您提供有关该问题的更多详细信息时更新此答案,因为如果没有堆栈跟踪或记录跟踪,很难看到发生了什么。
答案 1 :(得分:0)
有几件事:
您的AVD API级别是多少?像这样的崩溃是2.3中的已知问题。
您是如何设置模拟坐标的?通过Eclipse中的模拟器控件,或通过Telnet?
让我们看一下清单中的权限。清单标记之后,需要多个权限才能使本地化正常工作:
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” uses-permission android:name =“android.permission.ACCESS_LOCATION_EXTRA_COMMANDS” uses-permission android:name =“android.permission.ACCESS_MOCK_LOCATION”
以下是我如何请求用户位置的更新并为叠加项设置POI:
package com.snackrocket.location;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.graphics.drawable.Drawable;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.MyLocationOverlay;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;
import com.snackrocket.R;
public class SrPlacesActivity extends MapActivity implements LocationListener {
private final static ArrayList<HashMap<String, Object>> POIS = new ArrayList<HashMap<String, Object>>();
static {
HashMap<String, Object> row = new HashMap<String, Object>();
row.put("Name", "Sushi Tei");
row.put("Description", "Sushi and Much More");
row.put("Longitude", (101.6769441 * 1E6));
row.put("Latitude", (3.1184736 * 1E6));
POIS.add(row);
row = new HashMap<String, Object>();
row.put("Name", "Devi's Corner");
row.put("Description", "Quality Mamak");
row.put("Longitude", (101.6716426 * 1E6));
row.put("Latitude", (3.1313672 * 1E6));
POIS.add(row);
row = new HashMap<String, Object>();
row.put("Name", "KFC");
row.put("Description", "The Colonel's Secret Recipe");
row.put("Longitude", (101.650006 * 1E6));
row.put("Latitude", (3.117497 * 1E6));
POIS.add(row);
row = new HashMap<String, Object>();
row.put("Name", "McDonalds");
row.put("Description", "I'm lovin it");
row.put("Longitude", (101.6723386 * 1E6));
row.put("Latitude", (3.1328851 * 1E6));
POIS.add(row);
row = new HashMap<String, Object>();
row.put("Name", "DHaven");
row.put("Description", "Thai Food and Chicha");
row.put("Longitude", (101.6710465 * 1E6));
row.put("Latitude", (3.1315682 * 1E6));
POIS.add(row);
}
private MapView myMap;
private MyLocationOverlay myLocOverlay;
private GeoPoint homebase = new GeoPoint((int) (3.1 * 1E6),
(int) (101.7 * 1E6));
private int lat;
private int lng;
private GeoPoint myPoint = homebase;;
private Geocoder geocoder;
private MapController mapController;
private LocationManager locationManager;
private TextView locationText;
private void initMap() {
myMap = (MapView) findViewById(R.id.mapview);
}
private void initMyLocation() {
myLocOverlay = new MyLocationOverlay(this, myMap);
myLocOverlay.enableMyLocation();
myMap.getOverlays().add(myLocOverlay);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.mapview);
// Get location manager
locationManager = (LocationManager) this
.getSystemService(LOCATION_SERVICE);
// Create geocoder
geocoder = new Geocoder(this);
GeoPoint userPosition = new GeoPoint((int) (lng * 1E6), (int) (lat * 1E6));
// Prevents NullPointerException
if (userPosition != null) {
userPosition = myPoint;
}
// Inits
initMap();
initMyLocation();
// Zoom
int zoomLevel = 14;
myMap.setBuiltInZoomControls(true);
MapController mapController = myMap.getController();
mapController.setCenter(myPoint);
mapController.setZoom(zoomLevel);
// Set custom overlay template
List<Overlay> mapOverlays = myMap.getOverlays();
// Create my location overlay
myLocOverlay = new MyLocationOverlay(this, myMap);
myLocOverlay.enableMyLocation();
// Enable compass
myLocOverlay.enableCompass();
// Add my location overlay
mapOverlays.add(myLocOverlay);
// Cycle through POIs and do some magic
GeoPoint point;
OverlayItem overlayItem;
Drawable drawable = getResources().getDrawable(R.drawable.iconr);
for (HashMap<String, Object> poi : POIS) {
// Create POI overlay
SrItemizedOverlay itemizedOverlay = new SrItemizedOverlay(drawable, this);
point = new GeoPoint(((Double) poi.get("Latitude")).intValue(), ((Double) poi.get("Longitude")).intValue());
overlayItem = new OverlayItem(point, (String) poi.get("Name"), (String) poi.get("Description"));
itemizedOverlay.addOverlay(overlayItem);
// Add POI overlay
mapOverlays.add(itemizedOverlay);
}
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
@Override
protected void onResume() {
super.onResume();
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
1000, 10, this);
}
@Override
protected void onPause() {
super.onPause();
locationManager.removeUpdates(this);
}
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
public void onLocationChanged(Location location) {
location = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
lat = (int) (location.getLatitude());
lng = (int) (location.getLongitude());
}
}
这是我的逐项覆盖逻辑:
package com.snackrocket.location;
import java.util.ArrayList;
import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;
public class SrItemizedOverlay extends ItemizedOverlay<OverlayItem> {
Context mContext;
// Creates ArrayList for ItemizedOverlay
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
public SrItemizedOverlay(Drawable defaultMarker) {
super(boundCenterBottom(defaultMarker));
}
public SrItemizedOverlay(Drawable defaultMarker, Context context) {
super(boundCenterBottom(defaultMarker));
mContext = context;
}
// Adds OverlayItems to the ArrayList
public void addOverlay(OverlayItem overlay) {
mOverlays.add(overlay);
populate();
}
// Returns OverlayItem specified by integer
@Override
protected OverlayItem createItem(int i) {
return mOverlays.get(i);
}
// Returns current number of OverlayItems in the ArrayList
@Override
public int size() {
return mOverlays.size();
}
@Override
protected boolean onTap(int index) {
OverlayItem item = mOverlays.get(index);
AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.show();
return true;
}
}
希望有所帮助!