项目前的练习(基于百度地图的SDK做的定位自己的地图)遇到的BUG

之前说过要做lbs的匿名聊天软件,因为自己不太熟悉,所以想提前先练习一下,就做了一个百度地图的SDK做的定位自己的地图,效果大约是这样的,只有功能,请忽略界面(别着急行动,,看完再说)

项目前的练习(基于百度地图的SDK做的定位自己的地图)遇到的BUG


  其实说起来简单不过做起来总会遇到这样那样的问题,比如你下午一点做到四点三十,外面寝室的喊麦声从来没停过是最气的,

废话不多说先开始开始,

第一步:下载百度 Android版的定位SDK 当然要先注册获取AK什么的 地址如下

http://lbsyun.baidu.com/index.php?title=android-locsdk

SHA1是可以再AS上查看的 步骤是 右边的Gradle>android>signingReport>然后就会在下方的窗口看到 不会的话可以百度,我这里你主要将遇到的问题

按照步骤一步一步就能获取到AK, 然后下载,完成之后是这样的

项目前的练习(基于百度地图的SDK做的定位自己的地图)遇到的BUG


第二步:把libs里的所有东西 全部复制到自己新建的项目的libs文件夹中去  引入jar 包就不说了

项目前的练习(基于百度地图的SDK做的定位自己的地图)遇到的BUG


第三步: 添加权限 


<!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!-- 这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<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" />
<!-- SD卡读取权限,用户写入离线定位数据-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>




第四步:再加上自己app的自带定位的服务和meta,meta-data里的value是 之前获取的AK其他的不用改  记得是加在

application 里面

<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"></service>

<meta-data
    android:name="com.baidu.lbsapi.API_KEY"
    android:value="8GX93cGtnKX9y1z4I7cKZg7OKGHBz87C" />

第五步:新建LBSwithBaidu 开始写代码 


package mygame.com.example.administrator.myapp;

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Administrator on 2018/4/21.
 */

public class LBSwithBaidu extends AppCompatActivity {

    private TextView text;
    private LocationClient client;
    private  StringBuilder connrentPosition;
    private MapView map;
    private BaiduMap baidumap;
    private boolean ismylocation=true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
      //  SDKInitializer.initialize(getApplication());
        SDKInitializer.initialize(getApplicationContext());
        client = new LocationClient(getApplicationContext());
        client.registerLocationListener(new MylocationListener());
        setContentView(R.layout.activity_main);
        text= (TextView) findViewById(R.id.textView_location);
        map= (MapView) findViewById(R.id.mapwithbaidu);
        baidumap=map.getMap();
        baidumap.setMyLocationEnabled(true);

        List<String> permission = new ArrayList<>();
        if (ContextCompat.checkSelfPermission(LBSwithBaidu.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            permission.add(Manifest.permission.ACCESS_FINE_LOCATION);
        }
        if (ContextCompat.checkSelfPermission(LBSwithBaidu.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            permission.add(Manifest.permission.READ_PHONE_STATE);
        }
        if (ContextCompat.checkSelfPermission(LBSwithBaidu.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            permission.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }
        if (!permission.isEmpty()) {
            String[] permissions = permission.toArray(new String[permission.size()]);
            ActivityCompat.requestPermissions(LBSwithBaidu.this, permissions, 1);

        } else {
            requestion();
        }

    }

    private void requestion() {
        initlocation();
        client.start();
    }

    private void initlocation() {
        LocationClientOption option=new LocationClientOption();
        option.setIsNeedAddress(true);
        option.setScanSpan(5000);
        client.setLocOption(option);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0) {
                    for(int result:grantResults){
                        if(result!= PackageManager.PERMISSION_GRANTED){
                            Toast.makeText(this, "必须同意权限", Toast.LENGTH_SHORT).show();
                            finish();
                            return;
                        }
                    }
                    requestion();
                }else {
                    Toast.makeText(this, "发生错误", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
        }
    }
    public void nagativato(BDLocation bdLocation) {
        if (ismylocation) {
            LatLng ll = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
            Log.d("pipa",bdLocation.getLatitude()+"::"+ bdLocation.getLongitude());
            MapStatusUpdate updata = MapStatusUpdateFactory.newLatLng(ll);
            baidumap.animateMapStatus(updata);
            updata = MapStatusUpdateFactory.zoomTo(16f);
            baidumap.animateMapStatus(updata);
            ismylocation = false;

        }

        /*获取当前位置 并显示到地图上*/
        MyLocationData.Builder loBuilder=new MyLocationData.Builder().latitude(bdLocation.getLatitude())
                .longitude(bdLocation.getLongitude());
        MyLocationData locationData=loBuilder.build();
        baidumap.setMyLocationData(locationData);

    }
    public class MylocationListener implements BDLocationListener {

        /*显示当前位置地图*/
        @Override
        public void onReceiveLocation(BDLocation bdLocation) {
            if(bdLocation.getLocType()==BDLocation.TypeGpsLocation||bdLocation.getLocType()==BDLocation.TypeNetWorkLocation){
                nagativato(bdLocation);
                Log.d("显示当前位置地图","-------------------------");
            }

            connrentPosition = new StringBuilder();
            connrentPosition.append("纬度:").append(bdLocation.getLatitude()).append("\n");
            connrentPosition.append("经度:").append(bdLocation.getLongitude()).append("\n");
            connrentPosition.append("国家:").append(bdLocation.getCountry()).append("\n");
            connrentPosition.append("省:").append(bdLocation.getProvince()).append("\n");
            connrentPosition.append("市:").append(bdLocation.getCity()).append("\n");
            connrentPosition.append("县:").append(bdLocation.getDistrict()).append("\n");
            connrentPosition.append("街道:").append(bdLocation.getStreet()).append("\n");
            connrentPosition.append("定位方式:");
            if (bdLocation.getLocType() == BDLocation.TypeGpsLocation) {
                connrentPosition.append("GPS");
            } else if (bdLocation.getLocType() == BDLocation.TypeNetWorkLocation) {
                connrentPosition.append("网络定位");
            }
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    text.setText(connrentPosition);
                    //map.setMyLocationData(connrentPosition);

                 //   MapStatusUpdate mapStatus = MapStatusUpdateFactory.newLatLngZoom(center, 18);  mBaiduMap.setMapStatus(mapStatus);
                }
            });
        }

        public void onConnectHotSpotMessage(String s, int i) {

        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        map.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        map.onPause();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        client.stop();
        map.onDestroy();
        baidumap.setMyLocationEnabled(false);
    }


}
第六步:布局文件 activity_main

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="vertical"
    >

    <TextView
        android:id="@+id/textView_location"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

    </TextView>


        <com.baidu.mapapi.map.MapView
            android:id="@+id/mapwithbaidu"
            android:layout_width="match_parent"
            android:layout_height="match_parent">





        </com.baidu.mapapi.map.MapView>
</LinearLayout>


以上是我的代码,


最后说一**意事项,以及遇到的问题

1.就是引入jar包的问题了,记得一定要把下载的libs里的所有东西都复制到项目的libs文件夹里,然后再引入jar包

2.遇到了这样的问题

项目前的练习(基于百度地图的SDK做的定位自己的地图)遇到的BUG


SDKInitializer.initialize(getApplicationContext());

这里出错,找了很久 网上也有很多人遇到这样的问题  我的解决方法是在APP里的build.gradle 的android里加上

sourceSets {
    main {
        jniLibs.srcDir 'libs'
    }
}

这样问题就解决了,如果你也遇到这样的问题,按照我的方法解决不了,请自行百度,网上有很多种解决方法,总有一款适合你

3.在解决了以上的问题后 运行 在手机上终于有反应了 同意了各种请求,什么获取位置各种各样的的,但是我都点了同意之后,直接就停止运行了,,,,妈妈的,结果一看

项目前的练习(基于百度地图的SDK做的定位自己的地图)遇到的BUG


这是什么问题?难道我之前申请的AK有问题?  赶快把之前申请的AK的SHA1和包名跟报错信息上的对比了一下,果然就是包名的问题,更改完之后就能运行了,


4.完美运行,,但是不是进入地图之后不是可已将地图上自己的位置显示出来吗?就像效果图一样,但是地图上虽然有代表自己位置的蓝色圆点,但是是需要自己找的,地图不会定位带自己的位置,就像这样

项目前的练习(基于百度地图的SDK做的定位自己的地图)遇到的BUG



百思不得其解   LBSwithBaidu  上明明有定位自己的方法啊  而且还执行了  到底是哪的问题啊  我看了一眼,现在S在睡觉,还是之后再找他问吧!今天就先这样  有更新我会再回来的