android 用户定位和地图查询

来源:互联网 发布:数据库开发看什么书 编辑:程序博客网 时间:2024/04/27 19:06
      这是一个基于android的用户定位和地图查询demo,demo中使用GPS定位,返回经纬度,稍作修改也可以使用Network或者别的方式定位。地图查询使用百度地图提供的URl接口下载地图。
demo:下载地址
注意1:使用GPS请到户外或窗口,否则可能查不到。2:地图查询时如果不输入查询地点(文本框空着),会默认查询用户所在地,如果用户没有定位自己,会默认查询北京天安门。3:如果百度地图修改自己的URL接口,地图查询可能会失败。
4:地图查询界面的地图没有做缩放和居中,感兴趣的同学可以自己设置下。
权限:
    <uses-permission android:name="android.permission.INTERNET" />    <!-- 精确定位 -->    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />    <!-- 粗糙定位 -->    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
MainActivity.java:
package fk.androiddemo_028;import android.Manifest;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.content.pm.PackageManager;import android.location.Criteria;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.support.v4.app.ActivityCompat;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;import java.util.Iterator;import java.util.List;//在Mainfest中注册相关权限//创建LocationManager对象//选择LocationProvider(有多种定位方式可选,GPS,Network等)//绑定LocationListenerpublic class MainActivity extends Activity implements View.OnClickListener, LocationListener {    Button but, testBut, bestBut, mapBut;    TextView text, longText, latText;    LocationManager manager;//管理用户定位服务    double lat = 39.9096045, lng = 116.397228;//这是北京天安门的经纬度    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        but = (Button) findViewById(R.id.button);        but.setOnClickListener(this);        testBut = (Button) findViewById(R.id.testButton);        testBut.setOnClickListener(this);        bestBut = (Button) findViewById(R.id.bestButton);        bestBut.setOnClickListener(this);        mapBut = (Button) findViewById(R.id.mapButton);        mapBut.setOnClickListener(this);        text = (TextView) findViewById(R.id.textView);        longText = (TextView) findViewById(R.id.longitudeText);        latText = (TextView) findViewById(R.id.latitudeText);        //定义manager对象,getSystemService()方法根据名字得到一个系统服务        manager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);    }    @Override    public void onClick(View v) {        if (v == but) {            //权限检查            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)                    != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this,                    Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {                System.out.println("没有相关权限!!");                return;            }            //开始定位(LocationProvider选用GPS定位方式,更新定位间隔时间毫秒,更新定位间隔距离米,定位监听器对象)            manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);        }else if(v==testBut){            //取得所有的可用的定位provider            List<String> providers=manager.getAllProviders();            String provider="";            for(Iterator iterator = providers.iterator(); iterator.hasNext();){                provider+=iterator.next()+";";            }            text.setText(provider);        }else if(v==bestBut){//查询最好的定位方式            //Criteria可以设置一些查询条件            Criteria criteria=new Criteria();            criteria.setAccuracy(Criteria.ACCURACY_FINE);            criteria.setPowerRequirement(Criteria.POWER_LOW);            //是否需要提供海拔信息            criteria.setAltitudeRequired(false);            //是否允许产生费用            criteria.setCostAllowed(false);            //根据查询条件找到最好的provider            text.setText(manager.getBestProvider(criteria,true));        }        else if(v==mapBut){            Intent intent=new Intent();            intent.setClass(this, MapActivity.class);            //向MapActivity传送本地的经纬度;            intent.putExtra("lat",lat);            intent.putExtra("lng",lng);            startActivity(intent);        }    }    @Override    public void onLocationChanged(Location location) {        //当位置改变后被调用        lng=location.getLongitude();        lat=location.getLatitude();        longText.setText(lng+"");        latText.setText(lat+"");    }    @Override    public void onStatusChanged(String provider, int status, Bundle extras) {    }    @Override    public void onProviderEnabled(String provider) {    }    @Override    public void onProviderDisabled(String provider) {    }}
MapActivity.java:
package fk.androiddemo_028;import android.app.Activity;import android.app.ProgressDialog;import android.content.Intent;import android.location.Address;import android.location.Geocoder;import android.os.Handler;import android.os.Message;import android.os.Bundle;import android.view.View;import android.webkit.WebView;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import java.util.Iterator;import java.util.List;public class MapActivity extends Activity implements View.OnClickListener{    Button but;    TextView resultText;    EditText editText;    WebView webView;    MyHandler myHandler;    double lat=0,lng=0;    Address addr;    ProgressDialog proDialog;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_map);        but=(Button)findViewById(R.id.but);        but.setOnClickListener(this);        editText=(EditText)findViewById(R.id.editText);        resultText=(TextView)findViewById(R.id.resultText);        webView=(WebView)findViewById(R.id.webView);        myHandler=new MyHandler();//Handler需要在主线程定义        //读取MainActivity发来的经纬度        Intent intent=getIntent();        lat=intent.getDoubleExtra("lat", 39.9096045);        lng=intent.getDoubleExtra("lng", 116.397228);    }    @Override    public void onClick(View v) {        //在界面上显示后台忙的进度对话框        proDialog=ProgressDialog.show(this,"后台忙。。。", "正在查找位置,请稍等O(∩_∩)O",true,false);        //Geocoder查询可能较慢,所以放到子线程中        new GeocodingTask().start();    }    private class GeocodingTask extends Thread{        @Override        public void run() {            try {                //Geocoder提供地图查询功能                Geocoder geocoder=new Geocoder(MapActivity.this);                //判断你的手机的geocoder是否可用                Boolean geoIsEnable=geocoder.isPresent();                //获取输入框内容                String addressName=editText.getText().toString().trim();                //根据经纬度查询地点,最多返回前3个(纬度,经度)                List<Address> addressesFromLngLat=geocoder.getFromLocation(lat, lng, 3);                //根据地点名称查询地点.注意这两个查询函数如果可能会查询较长时间(在找不到的情况下)                List<Address> addressesFromAddrName=geocoder.getFromLocationName(addressName,3);                //获取address更新经纬度                String result;                Iterator iterateAddr;                if (addressesFromAddrName.size() > 0) {                    iterateAddr = addressesFromAddrName.iterator();                    addr = (Address) iterateAddr.next();//取第一个地址                    lat = addr.getLatitude();                    lng = addr.getLongitude();                    result="可用否:"+geoIsEnable+";"+addressName+"共找到:"+addressesFromAddrName.size() +"个";                }else if(addressesFromLngLat.size()>0){                    iterateAddr = addressesFromLngLat.iterator();                    addr = (Address) iterateAddr.next();//取第一个地址                    result="您现在位于:"+addr.getFeatureName();                }else{                    result="什么都找不到";                }                Bundle bundle=new Bundle();                bundle.putString("result", result);                Message msg=new Message();                msg.setData(bundle);                myHandler.sendMessage(msg);//将带有bundle的信息发给主线程来修改界面            } catch (Exception e) {                System.out.println(e+"次界面");            }        }    }    class MyHandler extends Handler {        @Override        public void handleMessage(Message msg) {            Bundle bundle=msg.getData();            resultText.setText(bundle.getString("result"));            webLoad();            proDialog.dismiss(); //关闭进度框            super.handleMessage(msg);        }    }    public void webLoad(){        //根据URL从百度服务器下载地图(zoom:地图级别,scale:高清地图)        String url = "http://api.map.baidu.com/staticimage?center=" +                lng + "," + lat + "&width=" + webView.getWidth()                + "&height=" + webView.getHeight() + "&zoom=12&scale=2";        webView.loadUrl(url);//显示webView(在android4.4之后所有的webView方法必须在同一个线程)    }}

注意MapActicity中用来显示地图的控件是WebWiew:
    <WebView        android:id="@+id/webView"        android:layout_width="match_parent"        android:layout_height="match_parent" />

运行截图:
                               
1 0