Android Studio 百度地图开发(二)GPS定位

来源:互联网 发布:培训机构推荐就业 知乎 编辑:程序博客网 时间:2024/06/07 05:27

Overview

在Android Studio 同时引入百度定位SDK和百度地图SDK后,会出现gradle预编译出错的问题

Error:Execution failed for task ':app:dexDebug'.> com.android.ide.common.internal.LoggedErrorException: Failed to run command:    /Users/alex/android-sdk/build-tools/21.1.2/dx --dex --output /Users/alex/CodeHub/GitHub/BaiduLoction/app/build/intermediates/dex/debug --input-list=/Users/alex/CodeHub/GitHub/BaiduLoction/app/build/intermediates/tmp/dex/debug/inputList.txt  Error Code:    2  Output:    UNEXPECTED TOP-LEVEL EXCEPTION:    com.android.dex.DexException: Multiple dex files define Lcom/baidu/lbsapi/auth/ErrorMessage;        at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596)        at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554)        at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535)        at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)        at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)        at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454)        at com.android.dx.command.dexer.Main.runMonoDex(Main.java:303)        at com.android.dx.command.dexer.Main.run(Main.java:246)        at com.android.dx.command.dexer.Main.main(Main.java:215)        at com.android.dx.command.Main.main(Main.java:106)

查看log,是由于两个SDK中的有重合申明
Multiple dex files define Lcom/baidu/lbsapi/auth/ErrorMessage
Eclipse中的项目能正常编译
若有人知道如何规避此问题,请告知!万谢
因此,关于GPS定位,将分两个方法来实现

  1. 使用百度定位SDK,获取定位信息
  2. 通过LocationManager,获取定位信息

通过百度定位SDK,获取定位信息

  1. 获取百度定位SDK
  2. 设置权限与Service

    <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>
    <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">    </service>
  3. 代码实现
    申明locationClient并注册监听

    locationClient = new LocationClient(getApplicationContext());locationClient.registerLocationListener(bdLocationListener);locationClient.start();

    实现监听

      public class MyLocationListener implements BDLocationListener {    @Override    public void onReceiveLocation(BDLocation location) {        if (location == null)            return ;        StringBuffer sb = new StringBuffer(256);        sb.append("time : ");        sb.append(location.getTime());        sb.append("\nerror code : ");        sb.append(location.getLocType());        sb.append("\nlatitude : ");        sb.append(location.getLatitude());        sb.append("\nlontitude : ");        sb.append(location.getLongitude());        sb.append("\nradius : ");        sb.append(location.getRadius());        if (location.getLocType() == BDLocation.TypeGpsLocation){            sb.append("\nspeed : ");            sb.append(location.getSpeed());            sb.append("\nsatellite : ");            sb.append(location.getSatelliteNumber());        } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){            sb.append("\naddr : ");            sb.append(location.getAddrStr());        }        Log.d("location","location\t"+sb);    }};
  4. 获取结果

    D/location( 8112): location   time : 2015-03-04 00:10:03D/location( 8112): error code : 161D/location( 8112): latitude : 22.644645D/location( 8112): lontitude : 113.918146D/location( 8112): radius : 62.164772D/location( 8112): addr : null

通过LocationManager获取定位信息

  1. 创建Service用于实时监听GPS变化

    public class GPSSever extends Service implements LocationListener{private final static String TAG = "GPSServer";private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 1; //根据移动的最小距离更新private static final long MIN_TIME_BW_UPDATES = 1000 * 10 * 1;  //根据间隔的最小时间更新private Context mContext;private LocationManager mLocationManager;private boolean isGPSEnable = false;private boolean isNetworkEnable = false;private boolean canGetLocation = false;private Location mLocation;private GPSListener listener;public interface GPSListener{    public void onGPS(Location location);}public GPSSever(Context context) {    this.mContext = context;    getLocation();}protected void getLocation(){    mLocationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);    isGPSEnable = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);    isNetworkEnable = mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);    if (!isGPSEnable && !isNetworkEnable){        //无法进行定位        Log.d(TAG,"无法定位");    }else {        canGetLocation = true;        //首先使用网络定位获取location        if (isNetworkEnable){            Log.d(TAG,"Network enable");            mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,                    MIN_TIME_BW_UPDATES,                    MIN_DISTANCE_CHANGE_FOR_UPDATES,                    this);            mLocation = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);            postLocation(mLocation);        }        if (isGPSEnable){            Log.d(TAG,"GPS enable");            if (mLocation == null){                mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,                    MIN_TIME_BW_UPDATES,                    MIN_DISTANCE_CHANGE_FOR_UPDATES,                    this);                mLocation = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);                postLocation(mLocation);            }        }    }}public void stopUsingGPS(){    if (mLocationManager != null){        mLocationManager.removeUpdates(this);    }}private void postLocation(Location location){    if (listener != null){        listener.onGPS(location);    }}public boolean isCanGetLocation() {    return canGetLocation;}public Location getCurrentLocation() {    if (mLocation != null){        return mLocation;    }    return null;}public GPSListener getListener() {    return listener;}public void setListener(GPSListener listener) {    this.listener = listener;}@Overridepublic void onLocationChanged(Location location) {    Log.d(TAG,"onLocationChanged\n 经度:"+location.getLongitude()+"\t 纬度:"+location.getLatitude());    mLocation = location;    postLocation(location);}@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {    Log.d(TAG,"onStatusChanged\n provider:"+provider+"\t status:"+status);}@Overridepublic void onProviderEnabled(String provider) {    Log.d(TAG,"onProviderEnabled\n provider:"+provider);}@Overridepublic void onProviderDisabled(String provider) {    Log.d(TAG,"onProviderDisabled\n provider:"+provider);}@Overridepublic IBinder onBind(Intent intent) {    return null;}}
  2. GPSService使用方法

    gpsSever = new GPSSever(MainActivity.this);
    gpsSever.setListener(this);
  3. 结果回调

       @Overridepublic void onGPS(Location location) {    try {        List<Address> addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 5);        for (Address a: addresses){            Log.d(TAG,a.toString());        }        MyLocationData locData = new MyLocationData.Builder()                .accuracy(300)                        // 此处设置开发者获取到的方向信息,顺时针0-360                .direction(100).latitude(location.getLatitude())                .longitude(location.getLongitude()).build();        baiduMap.setMyLocationData(locData);    } catch (IOException e) {        e.printStackTrace();    }}
  4. 运行结果

    D/GPSServer(11503): Network enableD/GPSServer(11503): GPS enableD/GPSServer(11503): onLocationChangedD/GPSServer(11503):  经度:113.913608   纬度:22.647471

0 0
原创粉丝点击