Android 在google mapview上获取用户当前位置
嗨,我一直在尝试获取并精确定位手机的位置(用户当前位置),但我没有运气。我希望有人能帮我写代码 再补充一点,我收到一个“无法获取连接工厂客户端”错误。这是否与返回用户位置的能力有关 如果有帮助的话,我一直在遵循Newboston的教程 或者这与我的API密钥有关?但我可以正确地接收地图,但无法精确定位用户的当前位置Android 在google mapview上获取用户当前位置,android,google-maps,api-key,currentlocation,Android,Google Maps,Api Key,Currentlocation,嗨,我一直在尝试获取并精确定位手机的位置(用户当前位置),但我没有运气。我希望有人能帮我写代码 再补充一点,我收到一个“无法获取连接工厂客户端”错误。这是否与返回用户位置的能力有关 如果有帮助的话,我一直在遵循Newboston的教程 或者这与我的API密钥有关?但我可以正确地接收地图,但无法精确定位用户的当前位置 主要代码: public class Map extends MapActivity implements LocationListener{ MapView map; long
主要代码:
public class Map extends MapActivity implements LocationListener{
MapView map;
long start;
long stop;
MyLocationOverlay compass;
MapController controller;
int x,y;
GeoPoint touchedPoint;
Drawable d;
List<Overlay> overlayList;
LocationManager lm;
LocationListener ll;
String towers;
int lat = 0;
int longi = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
map = (MapView)findViewById(R.id.mapview);
map.setBuiltInZoomControls(true);
touch t = new touch();
overlayList = map.getOverlays();
overlayList.add(t);
compass = new MyLocationOverlay(Map.this, map);
overlayList.add(compass);
controller = map.getController();
GeoPoint point = new GeoPoint(832332,4121093);
controller.animateTo(point);
controller.setZoom(8);
d = getResources().getDrawable(R.drawable.pointer);
//placing location
lm =(LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria crit = new Criteria();
towers = lm.getBestProvider(crit, false);
Location loc = lm.getLastKnownLocation(towers);
if(loc != null){
lat = (int) (loc.getLatitude() *1E6);
longi = (int)(loc.getLongitude()*1E6);
GeoPoint location = new GeoPoint(lat, longi);
OverlayItem overlayitem = new OverlayItem(location , "wassup", "2nd string");
CustomPinPoint custom = new CustomPinPoint(d, Map.this);
custom.insertPinPoint(overlayitem);
overlayList.add(custom);
}else{
Toast.makeText(Map.this, "Location is null", Toast.LENGTH_LONG).show();
lm.requestLocationUpdates(towers, 1500, 1, this);
}
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
compass.disableCompass();
super.onPause();
lm.removeUpdates(this);
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
compass.enableCompass();
super.onResume();
lm.requestLocationUpdates(towers, 500, 1, this);
}
公共类映射扩展MapActivity实现LocationListener{
地图视图;
长起点;
长停;
我的定位罗盘;
地图控制器;
int x,y;
地质点接触点;
可抽出式d;
列表列表;
位置经理lm;
地点:L;
弦塔;
int-lat=0;
int longi=0;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
map=(MapView)findViewById(R.id.MapView);
map.setBuiltInZoomControls(真);
触摸t=新触摸();
overlayList=map.getOverlays();
叠加列表。添加(t);
指南针=新的MyLocationOverlay(Map.this,Map);
添加(指南针);
controller=map.getController();
地质点=新的地质点(8323324121093);
控制器。动画(点);
控制器。设置缩放(8);
d=getResources().getDrawable(R.drawable.pointer);
//放置位置
lm=(LocationManager)getSystemService(Context.LOCATION\u服务);
Criteria crit=新标准();
towers=lm.getBestProvider(临界值,false);
位置loc=lm.GetLastKnown位置(塔);
如果(loc!=null){
纬度=(int)(位置getLatitude()*1E6);
longi=(int)(loc.getLongitude()*1E6);
地质点位置=新的地质点(纬度、经度);
OverlayItem OverlayItem=新的OverlayItem(位置,“wassup”,“第二串”);
CustomPinPoint custom=新的CustomPinPoint(d,Map.this);
自定义.insertPinPoint(覆盖项);
添加(自定义);
}否则{
Toast.makeText(Map.this,“Location is null”,Toast.LENGTH_LONG.show();
lm.请求位置更新(塔楼,1500,1,本);
}
}
@凌驾
受保护的void onPause(){
//TODO自动生成的方法存根
compass.disableCompass();
super.onPause();
lm.移除更新(本);
}
@凌驾
受保护的void onResume(){
//TODO自动生成的方法存根
compass.enableCompus();
super.onResume();
lm.请求位置更新(塔楼,500,1,本);
}
我想你可以忽略这个对话框
public class touch extends Overlay {
public boolean onTouchEvent(MotionEvent e, MapView m){
if(e.getAction()== MotionEvent.ACTION_DOWN){
start = e.getEventTime();
x = (int) e.getX();
y = (int) e.getY();
touchedPoint = map.getProjection().fromPixels(x, y);
}
if(e.getAction()== MotionEvent.ACTION_UP){
stop = e.getEventTime();
}
if(stop-start >1200){
AlertDialog alert = new AlertDialog.Builder(Map.this).create();
alert.setTitle("Option");
alert.setMessage("Pick the option");
alert.setCanceledOnTouchOutside(true);
alert.setButton("Place pointer pinpoint",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
OverlayItem overlayitem = new OverlayItem(touchedPoint , "wassup", "2nd string");
CustomPinPoint custom = new CustomPinPoint(d, Map.this);
custom.insertPinPoint(overlayitem);
overlayList.add(custom);
}
});
alert.setButton2("Get address",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Geocoder geocoder = new Geocoder(getBaseContext(), Locale.getDefault());
try{
List<Address> address = geocoder.getFromLocation(touchedPoint.getLatitudeE6()
/1E6, touchedPoint.getLongitudeE6() /1E6, 1);
if (address.size()>0){
String display = "";
for(int i=0 ; i<address.get(0).getMaxAddressLineIndex(); i++){
display +=address.get(0).getAddressLine(i) + "\n";
}
Toast t = Toast.makeText(getBaseContext(), display, Toast.LENGTH_LONG);
t.show();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
}
}
});
alert.setButton3("Toggle View",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
if(map.isSatellite()){
map.setSatellite(false);
map.setStreetView(true);
}else{
map.setStreetView(false);
map.setSatellite(true);
}
}
});
alert.show();
return true;
}
return false;
}
}
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_map, menu);
return true;
}
@Override
public void onLocationChanged(Location l) {
// TODO Auto-generated method stub
lat = (int)(l.getLatitude()*1E6);
longi = (int)(l.getLongitude()*1E6);
GeoPoint location = new GeoPoint(lat, longi);
OverlayItem overlayitem = new OverlayItem(location , "wassup", "2nd string");
CustomPinPoint custom = new CustomPinPoint(d, Map.this);
custom.insertPinPoint(overlayitem);
overlayList.add(custom);
}
@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
}
}
公共类触控扩展覆盖{
公共布尔onTouchEvent(运动事件e、地图视图m){
如果(e.getAction()==MotionEvent.ACTION\u DOWN){
start=e.getEventTime();
x=(int)e.getX();
y=(int)e.getY();
touchedPoint=map.getProjection().fromPixels(x,y);
}
如果(e.getAction()==MotionEvent.ACTION\u UP){
stop=e.getEventTime();
}
如果(停止-启动>1200){
AlertDialog alert=新建AlertDialog.Builder(Map.this.create();
警报。设置标题(“选项”);
alert.setMessage(“选择选项”);
alert.setCanceledOnTouchOutside(真);
alert.setButton(“放置指针精确定位”,
新建DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
//TODO自动生成的方法存根
OverlayItem OverlayItem=新的OverlayItem(接触点,“wassup”,“第二串”);
CustomPinPoint custom=新的CustomPinPoint(d,Map.this);
自定义.insertPinPoint(覆盖项);
添加(自定义);
}
});
alert.setButton2(“获取地址”,
新建DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
//TODO自动生成的方法存根
Geocoder Geocoder=新的地理编码器(getBaseContext(),Locale.getDefault());
试一试{
列表地址=geocoder.getFromLocation(touchedPoint.getLatitudeE6()
/1E6,touchedPoint.getLongitudeE6()/1E6,1);
if(address.size()>0){
字符串显示=”;
对于(int i=0;i以下是如何轻松实现的示例,请尝试在项目中实现此逻辑:
public class MyMapActivity extends MapActivity {
private MapView map;
private MapController controller;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mymap);
initMapView();
initMyLocation();
map.invalidate();
}
private void initMapView() {
map = (MapView) findViewById(R.id.map);
controller = map.getController();
map.setSatellite(true);
map.setBuiltInZoomControls(true);
}
private void initMyLocation() {
final MyLocationOverlay overlay = new MyLocationOverlay(this, map);
overlay.enableMyLocation();
//overlay.enableCompass(); // does not work in emulator
overlay.runOnFirstFix(new Runnable() {
public void run() {
// Zoom in to current location
controller.setZoom(15);
controller.animateTo(overlay.getMyLocation());
}});
}
}这很尴尬,我的代码是正确的,问题是设备的GPS没有打开。我希望我的代码可以帮助任何需要帮助的人。干杯!谢谢你的回答。你能解释一下什么是状态吗?我从我的示例项目中获取了这段代码。它使用状态是出于我自己的目的。我应该我在发布之前已经删除了它。我编辑了我的答案,所以它不包括状态。对不起!
<com.google.android.maps.MapView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mapview"
android:enabled="true"
android:clickable="true"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:apiKey="0t9rHfGlUPgisa8P9MRAsSxhRXTVCL0XJog7uiA"
/>
public class MyMapActivity extends MapActivity {
private MapView map;
private MapController controller;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mymap);
initMapView();
initMyLocation();
map.invalidate();
}
private void initMapView() {
map = (MapView) findViewById(R.id.map);
controller = map.getController();
map.setSatellite(true);
map.setBuiltInZoomControls(true);
}
private void initMyLocation() {
final MyLocationOverlay overlay = new MyLocationOverlay(this, map);
overlay.enableMyLocation();
//overlay.enableCompass(); // does not work in emulator
overlay.runOnFirstFix(new Runnable() {
public void run() {
// Zoom in to current location
controller.setZoom(15);
controller.animateTo(overlay.getMyLocation());
}});
}