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
- Android——使用百度API获取经度纬度以及所在城市
- Android百度地图——根据城市名,地址名获取GPS纬度、经度值
- HTML5手机浏览器获取经度和纬度(百度API)
- Android获取经度和纬度
- 凨-百度地图API之地图标注(JS版),地理位置信息,根据地址获取经度纬度
- 百度地图API调用(php 版本)输入地址 获取经度纬度
- Android 获取地理位置的经度和纬度
- android 获取当前位置坐标 经度 纬度
- Android 获取地理位置的经度和纬度
- Android 获取地理位置的经度和纬度
- 如何根据数据库保存的经度纬度使用百度API定位到
- Android百度地图——在地图上标注已知GPS纬度经度值的一个或一组覆盖物
- google地图获取经度、纬度
- google地图获取经度、纬度
- 根据地址获取经度纬度
- 根据地址获取经度纬度
- Android 自带 获取地理位置的经度和纬度
- 鼠标点击获取百度地图的经度与纬度(可直接嵌入到项目中)
- MFC嵌入google map
- 搭配ImageLoader的加水印的工具类
- Mac下PhpStrom配置Xdebug
- [HDU 1698] Just a Hook splay
- 视图控制器
- Android——使用百度API获取经度纬度以及所在城市
- Android代码布局
- Spark修炼之道(基础篇)——Linux大数据开发基础:第二节:Linux文件系统、目录(一)
- 为一个dialog自定义布局文件
- java ssl双向验证httpclient客户端请求工具类
- html5基础知识第四章其他标签
- 侧滑菜单1
- 4412裸机程序之点亮LED
- Spring4之Hello World