此相关细节以Android Studio为开发工具
1.创建百度地图可用KEY,关键之创建SHA1:
新手推荐先下载官方Demo,导入项目,Android Studio导入BaiduMapsApiASDemo,运行起来会报key错误,这里需要你去申请key。
Demo的APP根目录有debug.keystore,也可以使用自己的。
创建方法:
1)点开Android Studio的Terminal
2)找到jdk中keytool.exe(不要找错了,非jre中)
3)在Terminal中定位到keytool.exe文件位置,输入执行命令:
定位到keytool.exe文件
D:\GithubWorkSpace\BaiduMapsApiASDemo>cd D:\SoftWork\Java\jdk1.8.0\bin
输入指令生成sha1等相关参数:
D:\SoftWork\Java\jdk1.8.0\bin>keytool -v -list -keystore D:\GithubWorkSpace\BaiduMapsApiASDemo\app\debug.keystore
最终生成如下:
红框内容就是生成百度地图开发key的关键元素SHA1,复制粘贴过去,继续填完其他元素即可生成你自己的KEY。
2.关于参照Demo开发定位,为什么Demo上可以快速定位,自己新建就不可以,网上推荐的方法基本都是添加Service,这个治标不治本。
大部分原因是因为Demo是以targetSdkVersion 22编译的,这是android 5.1的,这个版本在配置文件中写定位权限就可以了;而现在的开发,
只要不是那种万年不变的老古董式开发基本都更新升级了编译SDK,那么新建项目基本上很少有低于sdk 23(android 6.0)的,问题就出在
这里,你把Demo内容完全Copy过来也不能定位,那是因为自Android 6.0起进行了权限分类与升级管理,定位权限还需要单独申请,申请
成功了你会发现立马定位成功,哈哈。
这里推荐一个简单的权限申请jar:
compile 'pub.devrel:easypermissions:1.0.0'
具体代码:
1 public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks { 2 3 4 // 定位相关 5 LocationClient mLocClient; 6 public MyLocationListenner myListener = new MyLocationListenner(); 7 private TextView mCity; 8 public static final int REQUEST_GPS = 111; 9 10 11 @Override 12 public void onCreate(Bundle savedInstanceState) { 13 super.onCreate(savedInstanceState); 14 setContentView(R.layout.activity_main); 15 16 gpsTask(); 17 18 mCity = (TextView) findViewById(R.id.text_city); 19 20 } 21 22 23 @AfterPermissionGranted(REQUEST_GPS) 24 public void gpsTask() { 25 if (EasyPermissions.hasPermissions(this, Manifest.permission.ACCESS_FINE_LOCATION)) { 26 myLocalAddress(); 27 } else { 28 // Ask for one permission 29 EasyPermissions.requestPermissions(this, "需要请求定位权限", 30 REQUEST_GPS, Manifest.permission.ACCESS_FINE_LOCATION); 31 } 32 } 33 34 private void myLocalAddress() { 35 // 定位初始化 36 mLocClient = new LocationClient(this); 37 mLocClient.registerLocationListener(myListener); 38 LocationClientOption option = new LocationClientOption(); 39 option.setOpenGps(true); // 打开gps 40 option.setCoorType("bd09ll"); // 设置坐标类型 41 option.setScanSpan(1000); 42 option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要 43 mLocClient.setLocOption(option); 44 mLocClient.start(); 45 } 46 47 48 @Override 49 public void onPermissionsGranted(int requestCode, List<String> perms) { 50 51 } 52 53 @Override 54 public void onPermissionsDenied(int requestCode, List<String> perms) { 55 if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) { 56 new AppSettingsDialog.Builder(this).build().show(); 57 } 58 } 59 60 @Override 61 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 62 super.onRequestPermissionsResult(requestCode, permissions, grantResults); 63 EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); 64 } 65 66 /** 67 * 定位SDK监听函数 68 */ 69 public class MyLocationListenner implements BDLocationListener { 70 71 @Override 72 public void onReceiveLocation(BDLocation location) { 73 // map view 销毁后不在处理新接收的位置 74 if (location == null) { 75 return; 76 } 77 78 mCity.setText(location.getCity()); 79 80 } 81 82 public void onReceivePoi(BDLocation poiLocation) { 83 } 84 } 85 86 @Override 87 protected void onPause() { 88 89 super.onPause(); 90 } 91 92 @Override 93 protected void onResume() { 94 super.onResume(); 95 } 96 97 @Override 98 protected void onStop() { 99 super.onStop(); 100 } 101 102 @Override 103 protected void onDestroy() { 104 // 退出时销毁定位 105 mLocClient.stop(); 106 super.onDestroy(); 107 } 108 }