要集成第三方SDK,不外乎几点。1、在该第三方的API开发平台注册账号创建应用得到key,2、导包到项目中,3、配置好环境就可以“为所欲为”啦。
第一步,注册开发者账号,创建应用获取key
key名称随便填
SHA1码就是你正式版APK的.keystore或者.jks解析出来的,方法如下:打开cmd,进入到jdk下的bin目录,输入命令 keytool -list -v -keystore 你的keystore目录 输入密码按enter,(ps:密码输入是不显示出来的)即可获取该值
然后你就可以在开发平台的控制台看到你的key了
第二步,导包
点这里前往下载,下载完之后解压,可以看到有一个demo,打开文件夹,拷贝目录lib下的所有文件到你的项目中,重新编译项目即可。
第三步,配置环境
- AndroidManifest.xml
<service android:name="com.amap.api.location.APSService" />
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="ea000bbc09e751321e64d1e52ac6c677"
tools:replace="android:value"/>
还有相关权限,自行配置。。。
2.build.gradle
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
signingConfigs {
release {
storeFile file('.keystore或.jks的路径')
storePassword '密码'
keyAlias '别名'
keyPassword '密码'
}
}
如果不添加这个配置,则无法定位,会报权限信息错误,即开发文档的 **错误7**
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
debug {
signingConfig signingConfigs.release
}
}
最后看代码,MainActivity
/**
* 用户服务协议
*/
public class LocationActivity extends BaseActivity implements AMapLocationListener {
private static final String TAG = "LocationActivity ";
//声明AMapLocationClient类对象
public AMapLocationClientOption mLocationOption = null;
private AMapLocationClient mlocationClient;
private TextView tv_location;
@Override
public View getContentView() {
return LayoutInflater.from(this).inflate(R.layout.activity_location, null);
}
@Override
public String getHeadTitle() {
return "测试定位";
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tv_location = findViewById(R.id.tv_location);
initLocation();
}
/**
* 初始化定位
*/
private void initLocation() {
mlocationClient = new AMapLocationClient(this);
//初始化定位参数
mLocationOption = new AMapLocationClientOption();
//设置定位监听
mlocationClient.setLocationListener(this);
//设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置定位间隔,单位毫秒,默认为2000ms
// mLocationOption.setInterval(2000);
mLocationOption.setOnceLocation(true);//可选,设置是否单次定位。默认是false
//设置定位参数
mlocationClient.setLocationOption(mLocationOption);
}
public void location(View view) {
/**
android6.0 以上要动态申请权限
*/
RxPermissions rxPermissions = new RxPermissions(this);
rxPermissions.request(Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE)
.subscribe(new Observer<Boolean>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Boolean aBoolean) {
mlocationClient.startLocation();
}
});
}
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (null != aMapLocation) {
//解析定位结果
String result = GDUtils.getLocationStr(aMapLocation);
if (result != null) {
tv_location.setText(result);
Log.e(TAG, "onLocationChanged: " + result);
}
} else {
Log.d(TAG, "定位失败");
}
}
/**
* 如果AMapLocationClient是在当前Activity实例化的,
* 在Activity的onDestroy中一定要执行AMapLocationClient的onDestroy
*/
@Override
protected void onDestroy() {
super.onDestroy();
mlocationClient.stopLocation();
}
}
GPSInfo
public class GPSInfo {
private String ID;
private String Name;
public String getID() {
return ID;
}
public void setID(String iD) {
ID = iD;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
}
GPSUtils
public class GDUtils {
private static JSONObject object;
private static JSONObject object2;
private static String jsonString;
private static List<GPSInfo> message; //保存数据的集合
/**
* 开始定位
*/
public final static int MSG_LOCATION_START = 0;
/**
* 定位完成
*/
public final static int MSG_LOCATION_FINISH = 1;
/**
* 停止定位
*/
public final static int MSG_LOCATION_STOP= 2;
public final static String KEY_URL = "URL";
public final static String URL_H5LOCATION = "file:///android_asset/location.html";
/**
* 默认的定位参数
* @since 2.8.0
* @author hongming.wang
*
*/
public static AMapLocationClientOption getDefaultOption(){
AMapLocationClientOption mOption = new AMapLocationClientOption();
mOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//可选,设置定位模式,可选的模式有高精度、仅设备、仅网络。默认为高精度模式
mOption.setGpsFirst(false);//可选,设置是否gps优先,只在高精度模式下有效。默认关闭
mOption.setHttpTimeOut(30000);//可选,设置网络请求超时时间。默认为30秒。在仅设备模式下无效
mOption.setInterval(2000);//可选,设置定位间隔。默认为2秒
mOption.setNeedAddress(true);//可选,设置是否返回逆地理地址信息。默认是true
mOption.setOnceLocation(false);//可选,设置是否单次定位。默认是false
return mOption;
}
/**
* 根据定位结果返回定位信息的字符串
* @param location
* @return
*/
public synchronized static String getLocationStr(AMapLocation location){
if(null == location){
return null;
}
message = new ArrayList<GPSInfo>();
//errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明
if(location.getErrorCode() == 0){
GPSInfo info = new GPSInfo();
info.setID("province");
info.setName(location.getProvince());
message.add(info);
info = new GPSInfo();
info.setID("longitude");//经 度
info.setName(location.getLongitude()+"");
message.add(info);
info = new GPSInfo();
info.setID("latitude");//纬 度
info.setName(location.getLatitude()+"");
message.add(info);
info = new GPSInfo();
info.setID("address");
info.setName(location.getAddress()+"");
message.add(info);
info = new GPSInfo();
info.setID("district");//区
info.setName(location.getDistrict()+"");
message.add(info);
info = new GPSInfo();
info.setID("city");
info.setName(location.getCity()+"");
message.add(info);
}
if(message.size() > 0){
return changeNotArrayDateToJson();
}
return null;
}
private static SimpleDateFormat sdf = null;
public synchronized static String formatUTC(long l, String strPattern) {
if (TextUtils.isEmpty(strPattern)) {
strPattern = "yyyy-MM-dd HH:mm:ss";
}
if (sdf == null) {
try {
sdf = new SimpleDateFormat(strPattern, Locale.CHINA);
} catch (Throwable e) {
}
} else {
sdf.applyPattern(strPattern);
}
return sdf == null ? "NULL" : sdf.format(l);
}
/**
* 转换为json数据
*/
private static String changeNotArrayDateToJson() {
object=null;
object2=null;
object=new JSONObject();
object2=new JSONObject();
try {
for (int i = 0; i < message.size(); i++) {
object2.put(message.get(i).getID(),message.get(i).getName()); //把数据加入JSONObject对象即可,"userid"相当于map里面的key,1即为value的值。
}
object.put("message", "coordinate");
object.put("content", object2);
object.put("code","0");
} catch (JSONException e) {
e.printStackTrace();
}
jsonString=null;
jsonString = object.toString();//把JSONObject转换成json格式的字符串
return jsonString;
}
/**
* 转换为json数据
*/
public static String changeUUIDToJson(String uuid) {
object=null;
object2=null;
object=new JSONObject();
object2=new JSONObject();
try {
object2.put("registrationId",uuid);
object.put("message", "deviceId");
object.put("content", object2);
object.put("code","0");
} catch (JSONException e) {
e.printStackTrace();
}
jsonString=null;
jsonString = object.toString();//把JSONObject转换成json格式的字符串
return jsonString;
}
}