目录
申请API KEY
进入百度地图开放平台,点击我的应用
点击创建应用
填写应用名称,选择应用类型为Android SDK。此时发布版SHA1码没有,因此使用开发版SHA1码填入发布版SHA1码位置。
一般情况下,路径为 C:\Users\Administrator\.android。在terminal中先cd .清空,控制台窗口中输入 cd .android 定位到 .android 文件夹.然后cd到JDK的地址
密码一般为 android
将开发版和发布版SHA1码都填写这个
定位
准备SDK
选择你所需要的功能下载地图包
将jar包引入libs
在src/main右键点击new->Dictionary创建一个jniLibs目录这里存放so文件,把压缩包里的五个文件都放到这里
然后点击sync按钮
然后检查app下/build.gradle中是否有
确定经纬度
在activity_main.xml中
在Android.Manifest.xml中
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="uSGmgbOcV6NEnzG5iST5UHKcjO1yS8yj"/>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="com.baidu.location.f" android:enabled="true"
android:process=":remote">
</service>
</application>
这里的Android:value填写你的访问应用密码
可能会遇到uses permission出现红色下划线,可以把这个uses去掉就不会报错了,这里我也不知道为啥
接下在打开MainActivity
public class MainActivity extends AppCompatActivity {
public LocationClient mLocationClient;
private TextView positionText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(new MyLocationListener());
setContentView(R.layout.activity_main);
positionText = (TextView)findViewById(R.id.position_text_view);
List<String> permissionList = new ArrayList<>();
if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.ACCESS_FINE_LOCATION)!=PackageManager.PERMISSION_GRANTED)
{
permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.READ_PHONE_STATE)!=PackageManager.PERMISSION_GRANTED)
{
permissionList.add(Manifest.permission.READ_PHONE_STATE);
}
if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED)
{
permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if(!permissionList.isEmpty())
{
String[]permissions=permissionList.toArray(new String[permissionList.size()]);
ActivityCompat.requestPermissions(MainActivity.this,permissions,1);
}
else
{
requestLocation();
}
}
private void requestLocation()
{
mLocationClient.start();
}
public void onRequestPermissionResult(int requestCode,String[] permissions,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;
}
}
requestLocation();
}
else
{
Toast.makeText(this,"发生未知错误",Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
}
}
public class MyLocationListener implements BDLocationListener
{
public void onReceiveLocation(BDLocation location)
{
StringBuilder currentPosition = new StringBuilder();
currentPosition.append("纬度:").append(location.getLatitude()).append("\n");
currentPosition.append("经线:").append(location.getLongitude()).append("\n");
currentPosition.append("定位方式:");
if(location.getLocType()==BDLocation.TypeGpsLocation)
{
currentPosition.append("GPS");
}
else if(location.getLocType()==BDLocation.TypeNetWorkLocation)
{
currentPosition.append("网络");
}
positionText.setText(currentPosition);
}
}
}
这里可能会出现一个问题,R标红或者layout,id标红。显示错误: 无法取消引用float
这是由于系统自动调用了百度的R包
把这一行去掉或者删掉百度的R文件
最后运行
现在纬度信息成功定位了,不过只能定位一次,那么如何实时更新当前的位置呢?
在MainActivity.java中进行修改
在requestLocation函数中修改:
private void requestLocation()
{
initLocation();
mLocationClient.start();
}
创建initLocation函数,作用是用setScanSpan设置更新位置的间隔,这里设置的5000表示每5秒更新的当前的位置
private void initLocation()
{
LocationClientOption option = new LocationClientOption();
option.setScanSpan(5000);
mLocationClient.setLocOption(option);
}
和onDestroy函数,mLocationClient.stop函数能够使活动停止,防止后台耗电
protected void onDestroy() {
super.onDestroy();
mLocationClient.stop();
}