Android——使用百度API获取经度纬度以及所在城市

来源:互联网 发布:mac下制作winpe启动盘 编辑:程序博客网 时间:2024/05/25 05:36

使用百度API获取经度纬度以及所在城市


    最近需要用到定位功能,找了好多资料都不怎么满意,于是试了一下百度提供的API,发现挺不错的,百度还提供了Demo,照着它学习,整理一下就可以得到想要的结果。首先得去百度注册,获取ak。

导入包的时候,在src/main/建一个文件夹:jniLibs,在这个里面导入包和文件,然后右键jar包--Add As Library,直接在lib里面导入的话,我试了但是运行时总是说找不到包,后来发现demo里面是那样导入的,网上搜索别人也是这样解决的。代码不完全是我写的,功能核心代码全部都是在demo里面复制的,还有一些相应配置也是demo里面的。

包一定要用最新的,我用的demo里的包都没用,用下载的最新包就可以了,这个也值得注意一下!

    我是分两步来完成这个要求的,首先是获取所在地的经度与纬度,然后使用反GeoCoding获取所在地的具体信息,这个信息里面就包含了城市的名字,街道名也有。

    下面上代码:

     布局文件是这样的:

<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"    android:layout_height="match_parent" android:orientation="vertical"    tools:context=".MainActivity">    <Button        android:id="@+id/start"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="@string/startlocation"/>    <TextView        android:id="@+id/longitude"        android:layout_width="match_parent"        android:layout_height="wrap_content" />    <TextView        android:id="@+id/latitude"        android:layout_width="match_parent"        android:layout_height="wrap_content" />    <TextView        android:id="@+id/location"        android:layout_width="match_parent"        android:layout_height="wrap_content" /></LinearLayout></span>
    java代码就写了两个文件:


public class MainActivity extends Activity {    private LocationClient mLocationClient;    private Button button;    private TextView longitude,latitude,location;    private LocationClientOption.LocationMode tempMode = LocationClientOption.LocationMode.Hight_Accuracy;    private String tempcoor="gcj02";    MyBroadcast myBroadcast;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        IntentFilter intentFilter=new IntentFilter();        intentFilter.addAction("location");        myBroadcast=new MyBroadcast();        registerReceiver(myBroadcast,intentFilter);        mLocationClient = ((LocationApplication)getApplication()).locationClient;        button= (Button) findViewById(R.id.start);        longitude= (TextView) findViewById(R.id.longitude);        latitude= (TextView) findViewById(R.id.latitude);        location= (TextView) findViewById(R.id.location);        ((LocationApplication)getApplication()).longitudeText = longitude;        ((LocationApplication)getApplication()).latitudeText = latitude;        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                initLocation();                if(button.getText().equals(getString(R.string.startlocation))){                    mLocationClient.start();//定位SDK start之后会默认发起一次定位请求,开发者无须判断isstart并主动调用request                    button.setText(getString(R.string.stoplocation));                }else{                    mLocationClient.stop();                    button.setText(getString(R.string.startlocation));                }            }        });    }    private void initLocation(){        LocationClientOption option = new LocationClientOption();        option.setLocationMode(tempMode);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备        option.setCoorType(tempcoor);//可选,默认gcj02,设置返回的定位结果坐标系,        int span=1000;        option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的        option.setIsNeedAddress(false);//可选,设置是否需要地址信息,默认不需要        option.setOpenGps(true);//可选,默认false,设置是否使用gps        option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果        option.setIgnoreKillProcess(true);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死        option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要        option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”        option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到        mLocationClient.setLocOption(option);    }    public class MyBroadcast extends BroadcastReceiver{        @Override        public void onReceive(Context context, Intent intent) {            location.setText(intent.getStringExtra("location"));        }    }}

public class LocationApplication extends Application {    public LocationClient locationClient;    public MyLocationListener locationListener;    public TextView longitudeText,latitudeText;    public Vibrator vibrator;    private final String ak="*********************"; //这里填写申请的ak    private final String type="json"; //如果返回格式为json,要在url里面设置,默认的是xml    StringBuilder stringBuilder;    BufferedReader bufferedReader;    String info;    private final String mCode="****************************"; //这里填写申请ak时用的安全码    @Override    public void onCreate() {        super.onCreate();        locationClient=new LocationClient(this.getApplicationContext());        locationListener=new MyLocationListener();        locationClient.registerLocationListener(locationListener);        vibrator =(Vibrator)getApplicationContext().getSystemService(Service.VIBRATOR_SERVICE);    }    public class MyLocationListener implements BDLocationListener{        /**         * 实现实时位置回调监听         */        @Override        public void onReceiveLocation(BDLocation bdLocation) {            double longitude,latitude;            longitude=bdLocation.getLongitude();            latitude=bdLocation.getLatitude();            String lon=String.valueOf(longitude);            String lat=String.valueOf(latitude);            getLocation(lon, lat);        }    }    public void getLocation(final String longitude,final String latitude){        longitudeText.setText(longitude);        latitudeText.setText(latitude);        new Thread(new Runnable() {            @Override            public void run() {                try {                    String path="http://api.map.baidu.com/telematics/v3/reverseGeocoding?location="+longitude+","                            +latitude+"&output="+type+"&ak="+ak+"&mcode="+mCode;                    URL url=new URL(path);                    URLConnection connection=url.openConnection();                    connection.setConnectTimeout(2000);                    connection.connect();                    bufferedReader=new BufferedReader(new InputStreamReader(connection.getInputStream()));                    stringBuilder=new StringBuilder();                    String line=null;                    while((line=bufferedReader.readLine())!=null){                        stringBuilder.append(line);                    }                    info=stringBuilder.toString();                    setLocation();                } catch (MalformedURLException e) {                    e.printStackTrace();                } catch (IOException e) {                    e.printStackTrace();                }                finally {                    try{                        if(bufferedReader!=null){                            bufferedReader.close();                        }                    }                    catch(IOException e){                        e.printStackTrace();                    }                }            }        }).start();    }    public void setLocation(){        JSONTokener jsonTokener=new JSONTokener(info);        try {            JSONObject object= (JSONObject) jsonTokener.nextValue();            String city=object.getString("city");            Intent intent=new Intent();            intent.setAction("location");            intent.putExtra("location",city);            sendBroadcast(intent);        } catch (JSONException e) {            e.printStackTrace();        }    }}

androidmanifest配置信息:

 <application        android:name=".LocationApplication"        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:supportsRtl="true"        android:theme="@style/AppTheme" >        <service            android:name="com.baidu.location.f"            android:enabled="true"            android:process=":remote" >            <intent-filter>                <action android:name="com.baidu.location.service_v2.2" >                </action>            </intent-filter>        </service>        <meta-data            android:name="com.baidu.lbsapi.API_KEY"            android:value="******************" />    //填写ak        <activity android:name=".MainActivity" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application>    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >    </uses-permission>    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >    </uses-permission>    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >    </uses-permission>    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >    </uses-permission>    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >    </uses-permission>    <uses-permission android:name="android.permission.READ_PHONE_STATE" >    </uses-permission>    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >    </uses-permission>    <uses-permission android:name="android.permission.INTERNET" />    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >    </uses-permission>    <uses-permission android:name="android.permission.READ_LOGS" >    </uses-permission>    <uses-permission android:name="android.permission.VIBRATE" />    <uses-permission android:name="android.permission.WAKE_LOCK" />    <uses-permission android:name="android.permission.WRITE_SETTINGS" />


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子被同学欺负不敢上学怎么办 孩子被欺负不敢还手怎么办 2个月的婴儿内热怎么办 孩子把别人打了怎么办 学生在学校被打怎么办 妈和老丈人搞外遇怎么办? 丈人住在双方出资房中怎么办 金木水火土缺水怎么办? 练太极注意不集中怎么办 白色裙子被染色了怎么办 两边的头发向外翘怎么办 感冒的前兆来了怎么办 压腿把筋拉伤了怎么办 压腿压不下去了怎么办 床的气压杆坏了怎么办 床打开压不下去怎么办 裤子大了怎么办小窍门 小孩不准守课堂纪律怎么办 学生在学校体育课受伤怎么办 手指被篮球砸肿了怎么办 眼睛被篮球砸了怎么办 宝宝被篮球砸了怎么办 手被篮球砸肿了怎么办 上体育课时脚不慎扭伤怎么办 孩子受伤没有参加考试怎么办 如果我想离婚对方不愿意怎么办 金龙自切尾怎么办 微信无法正常打开怎么办 大三下体育挂了怎么办 大二体育挂科了怎么办 大四体育老师不给成绩怎么办 大四必修挂科了怎么办 大学挂了20科怎么办 大专重修都没过怎么办 如果孩子一年级就考不及格怎么办 后滚翻做不过去怎么办 练习颠球时脚面总网上翘怎么办 踢完足球腿疼怎么办 针对初中不听话的学生怎么办 初中一年级成绩太差怎么办 新牙长出来乳牙没掉怎么办