version:2.4 beta
fix: add:更换地图sdk为百度地图
This commit is contained in:
@@ -235,7 +235,9 @@ dependencies {
|
|||||||
//腾讯移动推送 TPNS
|
//腾讯移动推送 TPNS
|
||||||
implementation 'com.tencent.tpns:tpns:1.3.2.0-release'
|
implementation 'com.tencent.tpns:tpns:1.3.2.0-release'
|
||||||
//高德地图定位
|
//高德地图定位
|
||||||
implementation 'com.amap.api:location:5.1.0'
|
// implementation 'com.amap.api:location:5.1.0'
|
||||||
|
//百度地图
|
||||||
|
implementation 'com.baidu.lbsyun:BaiduMapSDK_Location:9.1.8'
|
||||||
//工具类
|
//工具类
|
||||||
implementation 'com.blankj:utilcodex:1.31.0'
|
implementation 'com.blankj:utilcodex:1.31.0'
|
||||||
//autosize会改变第三方view的大小
|
//autosize会改变第三方view的大小
|
||||||
|
|||||||
@@ -11,7 +11,6 @@
|
|||||||
<uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" />
|
<uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" />
|
||||||
<uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
|
<uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
|
||||||
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
|
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
|
||||||
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
|
|
||||||
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
|
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
|
||||||
<uses-permission android:name="android.permission.ACTION_SCREEN_ON" />
|
<uses-permission android:name="android.permission.ACTION_SCREEN_ON" />
|
||||||
<uses-permission android:name="android.permission.ACTION_SCREEN_OFF" />
|
<uses-permission android:name="android.permission.ACTION_SCREEN_OFF" />
|
||||||
@@ -22,6 +21,40 @@
|
|||||||
<uses-permission android:name="android.permission.BLUETOOTH" />
|
<uses-permission android:name="android.permission.BLUETOOTH" />
|
||||||
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
|
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
|
||||||
|
|
||||||
|
<!--百度-->
|
||||||
|
<!-- 这个权限用于进行网络定位-->
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
|
||||||
|
<!-- 这个权限用于访问GPS定位-->
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
||||||
|
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
|
||||||
|
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
||||||
|
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
|
||||||
|
<uses-permission android:name="android.permission.CHANGE_WIFI_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.READ_LOGS"/>
|
||||||
|
<!-- 允许访问振动设备 -->
|
||||||
|
<uses-permission android:name="android.permission.VIBRATE"/>
|
||||||
|
<!-- 允许使用PowerManager的 WakeLocks保持进程在休眠时从屏幕消失 -->
|
||||||
|
<uses-permission android:name="android.permission.WAKE_LOCK"/>
|
||||||
|
<!-- 允许程序读取或写入系统设置 -->
|
||||||
|
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
|
||||||
|
<!-- android 9.0上使用前台服务,需要添加权限 -->
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
<!-- 用于读取手机当前的状态 -->
|
||||||
|
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
|
||||||
|
<!-- 读取缓存数据 -->
|
||||||
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||||
|
<!-- 获取模拟定位信息 -->
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
|
||||||
|
|
||||||
<!-- Required -->
|
<!-- Required -->
|
||||||
<permission
|
<permission
|
||||||
android:name="com.uiui.sn.permission.JPUSH_MESSAGE"
|
android:name="com.uiui.sn.permission.JPUSH_MESSAGE"
|
||||||
@@ -34,39 +67,12 @@
|
|||||||
android:name="android.permission.PACKAGE_USAGE_STATS"
|
android:name="android.permission.PACKAGE_USAGE_STATS"
|
||||||
tools:ignore="ProtectedPermissions" />
|
tools:ignore="ProtectedPermissions" />
|
||||||
<!-- Optional for location -->
|
<!-- Optional for location -->
|
||||||
<uses-permission android:name="android.permission.VIBRATE" />
|
|
||||||
<!-- 用于开启 debug 版本的应用在6.0 系统上 层叠窗口权限 -->
|
<!-- 用于开启 debug 版本的应用在6.0 系统上 层叠窗口权限 -->
|
||||||
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
|
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
|
||||||
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
|
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
|
||||||
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
|
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
|
||||||
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
|
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
|
||||||
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
|
|
||||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
|
||||||
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
|
|
||||||
<!-- 请求网络 -->
|
|
||||||
|
|
||||||
<!-- Normal Permissions 不需要运行时注册 -->
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
|
||||||
|
|
||||||
<!-- 不是SDK需要的权限,是示例中的后台唤醒定位需要的权限 -->
|
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
|
||||||
<!-- 需要运行时注册的权限 -->
|
|
||||||
|
|
||||||
<!-- 用于进行网络定位 -->
|
|
||||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
|
||||||
<!-- 用于访问GPS定位 -->
|
|
||||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
|
||||||
<!-- 用于提高GPS定位速度 -->
|
<!-- 用于提高GPS定位速度 -->
|
||||||
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
|
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
|
||||||
<!-- 写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据 -->
|
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
|
||||||
<!-- 读取缓存数据 -->
|
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
|
||||||
<!-- 用于读取手机当前的状态 -->
|
|
||||||
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
|
|
||||||
<!-- 更改设置 -->
|
|
||||||
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
|
|
||||||
<!-- 如果设置了target >= 28 如果需要启动后台定位则必须声明这个权限 -->
|
<!-- 如果设置了target >= 28 如果需要启动后台定位则必须声明这个权限 -->
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
<!-- 如果您的应用需要后台定位权限,且有可能运行在Android Q设备上,并且设置了target>28,必须增加这个权限声明 -->
|
<!-- 如果您的应用需要后台定位权限,且有可能运行在Android Q设备上,并且设置了target>28,必须增加这个权限声明 -->
|
||||||
@@ -80,15 +86,15 @@
|
|||||||
<uses-permission android:name="com.uiui.sn.permission.XGPUSH_RECEIVE" />
|
<uses-permission android:name="com.uiui.sn.permission.XGPUSH_RECEIVE" />
|
||||||
|
|
||||||
<!-- 【必须】 移动推送 TPNS SDK 所需权限 -->
|
<!-- 【必须】 移动推送 TPNS SDK 所需权限 -->
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<!-- <uses-permission android:name="android.permission.INTERNET" />-->
|
||||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
<!-- <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />-->
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
<!-- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />-->
|
||||||
|
|
||||||
<!-- 【常用】 移动推送 TPNS SDK所需权限 -->
|
<!-- 【常用】 移动推送 TPNS SDK所需权限 -->
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
<!-- <uses-permission android:name="android.permission.WAKE_LOCK" />-->
|
||||||
<uses-permission android:name="android.permission.VIBRATE" />
|
<!-- <uses-permission android:name="android.permission.VIBRATE" />-->
|
||||||
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
|
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
|
||||||
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
|
<!-- <uses-permission android:name="android.permission.READ_PHONE_STATE" />-->
|
||||||
<uses-permission android:name="android.permission.GET_TASKS" />
|
<uses-permission android:name="android.permission.GET_TASKS" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
@@ -206,7 +212,11 @@
|
|||||||
android:resource="@xml/file_paths" />
|
android:resource="@xml/file_paths" />
|
||||||
</provider>
|
</provider>
|
||||||
|
|
||||||
|
<!-- 声明service组件 -->
|
||||||
|
<service
|
||||||
|
android:name="com.baidu.location.f"
|
||||||
|
android:enabled="true"
|
||||||
|
android:process=":remote"/>
|
||||||
|
|
||||||
<!-- Rich push 核心功能 since 2.0.6 -->
|
<!-- Rich push 核心功能 since 2.0.6 -->
|
||||||
<activity
|
<activity
|
||||||
@@ -481,6 +491,10 @@
|
|||||||
<meta-data
|
<meta-data
|
||||||
android:name="com.amap.api.v2.apikey"
|
android:name="com.amap.api.v2.apikey"
|
||||||
android:value="${AMAP_KEY}" />
|
android:value="${AMAP_KEY}" />
|
||||||
|
<meta-data
|
||||||
|
android:name="com.baidu.lbsapi.API_KEY"
|
||||||
|
android:value="rBuXlmjE1SEjFgmY8F5c5uG5bh7Kd05H" >
|
||||||
|
</meta-data>
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="design_width_in_dp"
|
android:name="design_width_in_dp"
|
||||||
android:value="360" />
|
android:value="360" />
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
3、只对新的多线程下载任务有效
|
3、只对新的多线程下载任务有效
|
||||||
4、只对多线程的任务有效
|
4、只对多线程的任务有效
|
||||||
-->
|
-->
|
||||||
<useBlock value="true"/>
|
<useBlock value="false"/>
|
||||||
|
|
||||||
<!--设置下载线程数,下载线程数不能小于1
|
<!--设置下载线程数,下载线程数不能小于1
|
||||||
注意:
|
注意:
|
||||||
|
|||||||
@@ -1,119 +0,0 @@
|
|||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package com.uiui.sn.amap;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.pm.PackageInfo;
|
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
import com.amap.api.location.AMapLocation;
|
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.util.Locale;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 辅助工具类
|
|
||||||
* @创建时间: 2015年11月24日 上午11:46:50
|
|
||||||
* @项目名称: AMapLocationDemo2.x
|
|
||||||
* @author hongming.wang
|
|
||||||
* @文件名称: AmapUtils.java
|
|
||||||
* @类型名称: AmapUtils
|
|
||||||
*/
|
|
||||||
public class AmapUtils {
|
|
||||||
/**
|
|
||||||
* 开始定位
|
|
||||||
*/
|
|
||||||
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/sdkLoc.html";
|
|
||||||
/**
|
|
||||||
* 根据定位结果返回定位信息的字符串
|
|
||||||
* @param location
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public synchronized static String getLocationStr(AMapLocation location){
|
|
||||||
if(null == location){
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
StringBuffer sb = new StringBuffer();
|
|
||||||
//errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明
|
|
||||||
if(location.getErrorCode() == 0){
|
|
||||||
sb.append("定位成功" + "\n");
|
|
||||||
sb.append("定位类型: " + location.getLocationType() + "\n");
|
|
||||||
sb.append("经 度 : " + location.getLongitude() + "\n");
|
|
||||||
sb.append("纬 度 : " + location.getLatitude() + "\n");
|
|
||||||
sb.append("精 度 : " + location.getAccuracy() + "米" + "\n");
|
|
||||||
sb.append("提供者 : " + location.getProvider() + "\n");
|
|
||||||
|
|
||||||
sb.append("速 度 : " + location.getSpeed() + "米/秒" + "\n");
|
|
||||||
sb.append("角 度 : " + location.getBearing() + "\n");
|
|
||||||
// 获取当前提供定位服务的卫星个数
|
|
||||||
sb.append("星 数 : " + location.getSatellites() + "\n");
|
|
||||||
sb.append("国 家 : " + location.getCountry() + "\n");
|
|
||||||
sb.append("省 : " + location.getProvince() + "\n");
|
|
||||||
sb.append("市 : " + location.getCity() + "\n");
|
|
||||||
sb.append("城市编码 : " + location.getCityCode() + "\n");
|
|
||||||
sb.append("区 : " + location.getDistrict() + "\n");
|
|
||||||
sb.append("区域 码 : " + location.getAdCode() + "\n");
|
|
||||||
sb.append("地 址 : " + location.getAddress() + "\n");
|
|
||||||
sb.append("兴趣点 : " + location.getPoiName() + "\n");
|
|
||||||
//定位完成的时间
|
|
||||||
sb.append("定位时间: " + formatUTC(location.getTime(), "yyyy-MM-dd HH:mm:ss") + "\n");
|
|
||||||
} else {
|
|
||||||
//定位失败
|
|
||||||
sb.append("定位失败" + "\n");
|
|
||||||
sb.append("错误码:" + location.getErrorCode() + "\n");
|
|
||||||
sb.append("错误信息:" + location.getErrorInfo() + "\n");
|
|
||||||
sb.append("错误描述:" + location.getLocationDetail() + "\n");
|
|
||||||
}
|
|
||||||
//定位之后的回调时间
|
|
||||||
sb.append("回调时间: " + formatUTC(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss") + "\n");
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static SimpleDateFormat sdf = null;
|
|
||||||
public 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取app的名称
|
|
||||||
* @param context
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public static String getAppName(Context context) {
|
|
||||||
String appName = "";
|
|
||||||
try {
|
|
||||||
PackageManager packageManager = context.getPackageManager();
|
|
||||||
PackageInfo packageInfo = packageManager.getPackageInfo(
|
|
||||||
context.getPackageName(), 0);
|
|
||||||
int labelRes = packageInfo.applicationInfo.labelRes;
|
|
||||||
appName = context.getResources().getString(labelRes);
|
|
||||||
} catch (Throwable e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return appName;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -74,7 +74,7 @@ public class BaseApplication extends Application {
|
|||||||
// }
|
// }
|
||||||
context = this;
|
context = this;
|
||||||
instance = this;
|
instance = this;
|
||||||
// if (SystemUtils.isMainProcessName(this, Process.myPid())) {
|
// if (SystemUtils.isMainProcessName(this, android.os.Process.myPid())) {
|
||||||
//非主进程不初始化
|
//非主进程不初始化
|
||||||
utilsInint();
|
utilsInint();
|
||||||
// }
|
// }
|
||||||
@@ -99,7 +99,6 @@ public class BaseApplication extends Application {
|
|||||||
ControlPanelManager.init(this);
|
ControlPanelManager.init(this);
|
||||||
DeviceManager.init(this);
|
DeviceManager.init(this);
|
||||||
AmapManager.init(this);
|
AmapManager.init(this);
|
||||||
AmapManager.getInstance().initAmap();
|
|
||||||
NetInterfaceManager.init(this);
|
NetInterfaceManager.init(this);
|
||||||
AppUsedTimeUtils.init(this);
|
AppUsedTimeUtils.init(this);
|
||||||
JGYUtils.hookWebView();
|
JGYUtils.hookWebView();
|
||||||
|
|||||||
@@ -2,12 +2,15 @@ package com.uiui.sn.manager;
|
|||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.os.SystemClock;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.amap.api.location.AMapLocation;
|
import com.baidu.location.BDAbstractLocationListener;
|
||||||
import com.amap.api.location.AMapLocationClient;
|
import com.baidu.location.BDLocation;
|
||||||
import com.amap.api.location.AMapLocationClientOption;
|
import com.baidu.location.LocationClient;
|
||||||
import com.amap.api.location.AMapLocationListener;
|
import com.baidu.location.LocationClientOption;
|
||||||
|
import com.baidu.location.Poi;
|
||||||
|
import com.baidu.location.PoiRegion;
|
||||||
import com.uiui.sn.utils.SPUtils;
|
import com.uiui.sn.utils.SPUtils;
|
||||||
|
|
||||||
public class AmapManager {
|
public class AmapManager {
|
||||||
@@ -16,10 +19,13 @@ public class AmapManager {
|
|||||||
private static AmapManager sInstance;
|
private static AmapManager sInstance;
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
@SuppressLint("StaticFieldLeak")
|
@SuppressLint("StaticFieldLeak")
|
||||||
public static AMapLocationClient locationClient = null;
|
// public static AMapLocationClient locationClient = null;
|
||||||
|
private LocationClient mLocationClient = null;
|
||||||
|
private LocationClientOption mOption;
|
||||||
|
|
||||||
private AmapManager(Context context) {
|
private AmapManager(Context context) {
|
||||||
this.mContext = context;
|
this.mContext = context;
|
||||||
|
initAmap();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void init(Context context) {
|
public static void init(Context context) {
|
||||||
@@ -29,68 +35,302 @@ public class AmapManager {
|
|||||||
if (sInstance == null) {
|
if (sInstance == null) {
|
||||||
sInstance = new AmapManager(context);
|
sInstance = new AmapManager(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AmapManager getInstance() {
|
public static AmapManager getInstance() {
|
||||||
if (sInstance == null) {
|
if (sInstance == null) {
|
||||||
throw new IllegalStateException("You must be init AmapManager first");
|
throw new IllegalStateException("You must be init AmapManager first");
|
||||||
}
|
}
|
||||||
|
|
||||||
return sInstance;
|
return sInstance;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AMapLocationClient getLocationClient() {
|
public void initAmap() {
|
||||||
if (null == locationClient) {
|
mLocationClient = new LocationClient(mContext);
|
||||||
|
mLocationClient.setLocOption(getDefaultLocationClientOption());
|
||||||
|
mLocationClient.registerLocationListener(mListener);
|
||||||
|
mLocationClient.stop();
|
||||||
|
mLocationClient.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public LocationClient getLocationClient() {
|
||||||
|
if (mLocationClient == null) {
|
||||||
initAmap();
|
initAmap();
|
||||||
}
|
}
|
||||||
return locationClient;
|
return mLocationClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void initAmap() {
|
/***
|
||||||
locationClient = new AMapLocationClient(mContext);
|
*
|
||||||
AMapLocationClientOption option = new AMapLocationClientOption();
|
* @return DefaultLocationClientOption 默认O设置
|
||||||
option.setLocationPurpose(AMapLocationClientOption.AMapLocationPurpose.SignIn);
|
*/
|
||||||
option.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
|
public LocationClientOption getDefaultLocationClientOption() {
|
||||||
option.setNeedAddress(true);
|
if (mOption == null) {
|
||||||
//获取一次定位结果:
|
mOption = new LocationClientOption();
|
||||||
//该方法默认为false。
|
mOption.setCoorType("bd09ll"); // 可选,默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll;
|
||||||
option.setOnceLocation(true);
|
mOption.setScanSpan(0); // 可选,默认0,即仅定位一次,设置发起连续定位请求的间隔需要大于等于1000ms才是有效的
|
||||||
//获取最近3s内精度最高的一次定位结果:
|
mOption.setIsNeedAddress(true); // 可选,设置是否需要地址信息,默认不需要
|
||||||
//设置setOnceLocationLatest(boolean b)接口为true,启动定位时SDK会返回最近3s内精度最高的一次定位结果。
|
mOption.setIsNeedLocationDescribe(true); // 可选,设置是否需要地址描述
|
||||||
// 如果设置其为true,setOnceLocation(boolean b)接口也会被设置为true,反之不会,默认为false。
|
mOption.setNeedDeviceDirect(false); // 可选,设置是否需要设备方向结果
|
||||||
option.setOnceLocationLatest(true);
|
mOption.setLocationNotify(false); // 可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
|
||||||
locationClient.setLocationOption(option);
|
mOption.setIgnoreKillProcess(true); // 可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop
|
||||||
//设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。
|
mOption.setIsNeedLocationDescribe(true); // 可选,默认false,设置是否需要位置语义化结果,可以在BDLocation
|
||||||
//设置定位监听
|
mOption.setIsNeedLocationPoiList(true); // 可选,默认false,设置是否需要POI结果,可以在BDLocation
|
||||||
locationClient.setLocationListener(new AMapLocationListener() {
|
mOption.SetIgnoreCacheException(false); // 可选,默认false,设置是否收集CRASH信息,默认收集
|
||||||
|
mOption.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); // 可选,默认高精度,设置定位模式,高精度,低功耗,仅设备,模糊
|
||||||
|
mOption.setIsNeedAltitude(false); // 可选,默认false,设置定位时是否需要海拔信息,默认不需要,除基础定位版本都可用
|
||||||
|
// 可选,设置首次定位时选择定位速度优先还是定位准确性优先,默认为速度优先
|
||||||
|
// mOption.setFirstLocType(LocationClientOption.FirstLocType.SPEED_IN_FIRST_LOC);
|
||||||
|
}
|
||||||
|
return mOption;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onLocationChanged(AMapLocation aMapLocation) {
|
/*****
|
||||||
StringBuilder sb = new StringBuilder();
|
*
|
||||||
//errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明
|
* 定位结果回调,重写onReceiveLocation方法,可以直接拷贝如下代码到自己工程中修改
|
||||||
if (aMapLocation.getErrorCode() == 0) {
|
*
|
||||||
Log.e(TAG, "onLocationChanged: " + "定位成功");
|
*/
|
||||||
Log.e(TAG, "onLocationChanged: " + aMapLocation.getAddress());
|
private BDAbstractLocationListener mListener = new BDAbstractLocationListener() {
|
||||||
sb.append(aMapLocation.getAddress()).append("\n");
|
|
||||||
SPUtils.put(mContext, "AmapAddress", aMapLocation.getAddress());
|
/**
|
||||||
SPUtils.put(mContext, "longitude", aMapLocation.getLongitude());
|
* 定位请求回调函数
|
||||||
SPUtils.put(mContext, "latitude", aMapLocation.getLatitude());
|
* @param location 定位结果
|
||||||
SPUtils.put(mContext, "AmapError", "");
|
*/
|
||||||
} else {
|
@Override
|
||||||
//定位失败
|
public void onReceiveLocation(BDLocation location) {
|
||||||
sb.append("定位失败" + "\n");
|
// TODO Auto-generated method stub
|
||||||
Log.e(TAG, "onLocationChanged: " + "定位失败");
|
if (null != location && location.getLocType() != BDLocation.TypeServerError) {
|
||||||
SPUtils.put(mContext, "AmapError", String.valueOf(aMapLocation.getErrorInfo()));
|
Log.e(TAG, "onLocationChanged: " + "定位成功");
|
||||||
}
|
Log.e(TAG, "onLocationChanged: " + location.getAddress());
|
||||||
Log.e(TAG, (String) SPUtils.get(mContext, "AmapAddress", "-"));
|
SPUtils.put(mContext, "AmapAddress", location.getAddress());
|
||||||
Log.e(TAG, (String) SPUtils.get(mContext, "AmapError", "-"));
|
SPUtils.put(mContext, "longitude", location.getLongitude());
|
||||||
Log.e(TAG, "amap: " + sb.toString());
|
SPUtils.put(mContext, "latitude", location.getLatitude());
|
||||||
|
SPUtils.put(mContext, "AmapError", "");
|
||||||
|
// int tag = 1;
|
||||||
|
// StringBuffer sb = new StringBuffer(256);
|
||||||
|
// sb.append("time : ");
|
||||||
|
// /**
|
||||||
|
// * 时间也可以使用systemClock.elapsedRealtime()方法 获取的是自从开机以来,每次回调的时间;
|
||||||
|
// * location.getTime() 是指服务端出本次结果的时间,如果位置不发生变化,则时间不变
|
||||||
|
// */
|
||||||
|
// sb.append(location.getTime());
|
||||||
|
// sb.append("\nsysTime : ");
|
||||||
|
// sb.append(SystemClock.elapsedRealtime());
|
||||||
|
// sb.append("\nlocType : ");// 定位类型
|
||||||
|
// sb.append(location.getLocType());
|
||||||
|
// sb.append("\nlocType description : ");// *****对应的定位类型说明*****
|
||||||
|
// sb.append(location.getLocTypeDescription());
|
||||||
|
// sb.append("\nlatitude : ");// 纬度
|
||||||
|
// sb.append(location.getLatitude());
|
||||||
|
// sb.append("\nlongtitude : ");// 经度
|
||||||
|
// sb.append(location.getLongitude());
|
||||||
|
// sb.append("\nradius : ");// 半径
|
||||||
|
// sb.append(location.getRadius());
|
||||||
|
// sb.append("\nCountryCode : ");// 国家码
|
||||||
|
// sb.append(location.getCountryCode());
|
||||||
|
// sb.append("\nProvince : ");// 获取省份
|
||||||
|
// sb.append(location.getProvince());
|
||||||
|
// sb.append("\nCountry : ");// 国家名称
|
||||||
|
// sb.append(location.getCountry());
|
||||||
|
// sb.append("\ncitycode : ");// 城市编码
|
||||||
|
// sb.append(location.getCityCode());
|
||||||
|
// sb.append("\ncity : ");// 城市
|
||||||
|
// sb.append(location.getCity());
|
||||||
|
// sb.append("\nDistrict : ");// 区
|
||||||
|
// sb.append(location.getDistrict());
|
||||||
|
// sb.append("\nTown : ");// 获取镇信息
|
||||||
|
// sb.append(location.getTown());
|
||||||
|
// sb.append("\nStreet : ");// 街道
|
||||||
|
// sb.append(location.getStreet());
|
||||||
|
// sb.append("\naddr : ");// 地址信息
|
||||||
|
// sb.append(location.getAddrStr());
|
||||||
|
// sb.append("\nStreetNumber : ");// 获取街道号码
|
||||||
|
// sb.append(location.getStreetNumber());
|
||||||
|
// sb.append("\nUserIndoorState: ");// *****返回用户室内外判断结果*****
|
||||||
|
// sb.append(location.getUserIndoorState());
|
||||||
|
// sb.append("\nDirection(not all devices have value): ");
|
||||||
|
// sb.append(location.getDirection());// 方向
|
||||||
|
// sb.append("\nlocationdescribe: ");
|
||||||
|
// sb.append(location.getLocationDescribe());// 位置语义化信息
|
||||||
|
// sb.append("\nPoi: ");// POI信息
|
||||||
|
// if (location.getPoiList() != null && !location.getPoiList().isEmpty()) {
|
||||||
|
// for (int i = 0; i < location.getPoiList().size(); i++) {
|
||||||
|
// Poi poi = (Poi) location.getPoiList().get(i);
|
||||||
|
// sb.append("poiName:");
|
||||||
|
// sb.append(poi.getName() + ", ");
|
||||||
|
// sb.append("poiTag:");
|
||||||
|
// sb.append(poi.getTags() + "\n");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if (location.getPoiRegion() != null) {
|
||||||
|
// sb.append("PoiRegion: ");// 返回定位位置相对poi的位置关系,仅在开发者设置需要POI信息时才会返回,在网络不通或无法获取时有可能返回null
|
||||||
|
// PoiRegion poiRegion = location.getPoiRegion();
|
||||||
|
// sb.append("DerectionDesc:"); // 获取POIREGION的位置关系,ex:"内"
|
||||||
|
// sb.append(poiRegion.getDerectionDesc() + "; ");
|
||||||
|
// sb.append("Name:"); // 获取POIREGION的名字字符串
|
||||||
|
// sb.append(poiRegion.getName() + "; ");
|
||||||
|
// sb.append("Tags:"); // 获取POIREGION的类型
|
||||||
|
// sb.append(poiRegion.getTags() + "; ");
|
||||||
|
// sb.append("\nSDK版本: ");
|
||||||
|
// }
|
||||||
|
//// int permission = checkPermission(getApplicationContext(), android.Manifest.permission.ACCESS_FINE_LOCATION);
|
||||||
|
//// sb.append("\npermsission: " + permission);
|
||||||
|
//// sb.append(locationService.getSDKVersion()); // 获取SDK版本
|
||||||
|
// if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果
|
||||||
|
// sb.append("\nspeed : ");
|
||||||
|
// sb.append(location.getSpeed());// 速度 单位:km/h
|
||||||
|
// sb.append("\nsatellite : ");
|
||||||
|
// sb.append(location.getSatelliteNumber());// 卫星数目
|
||||||
|
// sb.append("\nheight : ");
|
||||||
|
// sb.append(location.getAltitude());// 海拔高度 单位:米
|
||||||
|
// sb.append("\ngps status : ");
|
||||||
|
// sb.append(location.getGpsAccuracyStatus());// *****gps质量判断*****
|
||||||
|
// sb.append("\ndescribe : ");
|
||||||
|
// sb.append("gps定位成功");
|
||||||
|
// } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果
|
||||||
|
// // 运营商信息
|
||||||
|
// if (location.hasAltitude()) {// *****如果有海拔高度*****
|
||||||
|
// sb.append("\nheight : ");
|
||||||
|
// sb.append(location.getAltitude());// 单位:米
|
||||||
|
// }
|
||||||
|
// sb.append("\noperationers : ");// 运营商信息
|
||||||
|
// sb.append(location.getOperators());
|
||||||
|
// sb.append("\ndescribe : ");
|
||||||
|
// sb.append("网络定位成功");
|
||||||
|
// } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果
|
||||||
|
// sb.append("\ndescribe : ");
|
||||||
|
// sb.append("离线定位成功,离线定位结果也是有效的");
|
||||||
|
// } else if (location.getLocType() == BDLocation.TypeServerError) {
|
||||||
|
// sb.append("\ndescribe : ");
|
||||||
|
// sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");
|
||||||
|
// } else if (location.getLocType() == BDLocation.TypeNetWorkException) {
|
||||||
|
// sb.append("\ndescribe : ");
|
||||||
|
// sb.append("网络不同导致定位失败,请检查网络是否通畅");
|
||||||
|
// } else if (location.getLocType() == BDLocation.TypeCriteriaException) {
|
||||||
|
// sb.append("\ndescribe : ");
|
||||||
|
// sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");
|
||||||
|
// }
|
||||||
|
//// logMsg(sb.toString(), tag);
|
||||||
|
// Log.e(TAG, "onReceiveLocation: " + sb);
|
||||||
}
|
}
|
||||||
});
|
Log.e(TAG, (String) SPUtils.get(mContext, "AmapAddress", "-"));
|
||||||
//设置场景模式后最好调用一次stop,再调用start以保证场景模式生效
|
Log.e(TAG, (String) SPUtils.get(mContext, "AmapError", "-"));
|
||||||
locationClient.stopLocation();
|
}
|
||||||
locationClient.startLocation();
|
|
||||||
Log.e(TAG, "initAmap: " + "startLocation");
|
@Override
|
||||||
}
|
public void onConnectHotSpotMessage(String s, int i) {
|
||||||
|
super.onConnectHotSpotMessage(s, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 回调定位诊断信息,开发者可以根据相关信息解决定位遇到的一些问题
|
||||||
|
* @param locType 当前定位类型
|
||||||
|
* @param diagnosticType 诊断类型(1~9)
|
||||||
|
* @param diagnosticMessage 具体的诊断信息释义
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void onLocDiagnosticMessage(int locType, int diagnosticType, String diagnosticMessage) {
|
||||||
|
super.onLocDiagnosticMessage(locType, diagnosticType, diagnosticMessage);
|
||||||
|
// int tag = 2;
|
||||||
|
StringBuffer sb = new StringBuffer(256);
|
||||||
|
sb.append("诊断结果: ");
|
||||||
|
if (locType == BDLocation.TypeNetWorkLocation) {
|
||||||
|
if (diagnosticType == 1) {
|
||||||
|
sb.append("网络定位成功,没有开启GPS,建议打开GPS会更好");
|
||||||
|
sb.append("\n" + diagnosticMessage);
|
||||||
|
} else if (diagnosticType == 2) {
|
||||||
|
sb.append("网络定位成功,没有开启Wi-Fi,建议打开Wi-Fi会更好");
|
||||||
|
sb.append("\n" + diagnosticMessage);
|
||||||
|
}
|
||||||
|
} else if (locType == BDLocation.TypeOffLineLocationFail) {
|
||||||
|
if (diagnosticType == 3) {
|
||||||
|
sb.append("定位失败,请您检查您的网络状态");
|
||||||
|
sb.append("\n" + diagnosticMessage);
|
||||||
|
}
|
||||||
|
} else if (locType == BDLocation.TypeCriteriaException) {
|
||||||
|
if (diagnosticType == 4) {
|
||||||
|
sb.append("定位失败,无法获取任何有效定位依据");
|
||||||
|
sb.append("\n" + diagnosticMessage);
|
||||||
|
} else if (diagnosticType == 5) {
|
||||||
|
sb.append("定位失败,无法获取有效定位依据,请检查运营商网络或者Wi-Fi网络是否正常开启,尝试重新请求定位");
|
||||||
|
sb.append(diagnosticMessage);
|
||||||
|
} else if (diagnosticType == 6) {
|
||||||
|
sb.append("定位失败,无法获取有效定位依据,请尝试插入一张sim卡或打开Wi-Fi重试");
|
||||||
|
sb.append("\n" + diagnosticMessage);
|
||||||
|
} else if (diagnosticType == 7) {
|
||||||
|
sb.append("定位失败,飞行模式下无法获取有效定位依据,请关闭飞行模式重试");
|
||||||
|
sb.append("\n" + diagnosticMessage);
|
||||||
|
} else if (diagnosticType == 9) {
|
||||||
|
sb.append("定位失败,无法获取任何有效定位依据");
|
||||||
|
sb.append("\n" + diagnosticMessage);
|
||||||
|
}
|
||||||
|
} else if (locType == BDLocation.TypeServerError) {
|
||||||
|
if (diagnosticType == 8) {
|
||||||
|
sb.append("定位失败,请确认您定位的开关打开状态,是否赋予APP定位权限");
|
||||||
|
sb.append("\n" + diagnosticMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Log.e(TAG, "onLocationChanged: " + "定位失败");
|
||||||
|
SPUtils.put(mContext, "AmapError", sb);
|
||||||
|
Log.e(TAG, "onLocDiagnosticMessage: " + sb);
|
||||||
|
// logMsg(sb.toString(), tag);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// public AMapLocationClient getLocationClient() {
|
||||||
|
// if (null == locationClient) {
|
||||||
|
// initAmap();
|
||||||
|
// }
|
||||||
|
// return locationClient;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// public void initAmap() {
|
||||||
|
// locationClient = new AMapLocationClient(mContext);
|
||||||
|
// AMapLocationClientOption option = new AMapLocationClientOption();
|
||||||
|
// option.setLocationPurpose(AMapLocationClientOption.AMapLocationPurpose.SignIn);
|
||||||
|
// option.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
|
||||||
|
// option.setNeedAddress(true);
|
||||||
|
// //获取一次定位结果:
|
||||||
|
// //该方法默认为false。
|
||||||
|
// option.setOnceLocation(true);
|
||||||
|
// //获取最近3s内精度最高的一次定位结果:
|
||||||
|
// //设置setOnceLocationLatest(boolean b)接口为true,启动定位时SDK会返回最近3s内精度最高的一次定位结果。
|
||||||
|
// // 如果设置其为true,setOnceLocation(boolean b)接口也会被设置为true,反之不会,默认为false。
|
||||||
|
// option.setOnceLocationLatest(true);
|
||||||
|
// locationClient.setLocationOption(option);
|
||||||
|
// //设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。
|
||||||
|
// //设置定位监听
|
||||||
|
// locationClient.setLocationListener(new AMapLocationListener() {
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public void onLocationChanged(AMapLocation aMapLocation) {
|
||||||
|
// StringBuilder sb = new StringBuilder();
|
||||||
|
// //errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明
|
||||||
|
// if (aMapLocation.getErrorCode() == 0) {
|
||||||
|
// Log.e(TAG, "onLocationChanged: " + "定位成功");
|
||||||
|
// Log.e(TAG, "onLocationChanged: " + aMapLocation.getAddress());
|
||||||
|
// sb.append(aMapLocation.getAddress()).append("\n");
|
||||||
|
// SPUtils.put(mContext, "AmapAddress", aMapLocation.getAddress());
|
||||||
|
// SPUtils.put(mContext, "longitude", aMapLocation.getLongitude());
|
||||||
|
// SPUtils.put(mContext, "latitude", aMapLocation.getLatitude());
|
||||||
|
// SPUtils.put(mContext, "AmapError", "");
|
||||||
|
// } else {
|
||||||
|
// //定位失败
|
||||||
|
// sb.append("定位失败" + "\n");
|
||||||
|
// Log.e(TAG, "onLocationChanged: " + "定位失败");
|
||||||
|
// SPUtils.put(mContext, "AmapError", String.valueOf(aMapLocation.getErrorInfo()));
|
||||||
|
// }
|
||||||
|
// Log.e(TAG, (String) SPUtils.get(mContext, "AmapAddress", "-"));
|
||||||
|
// Log.e(TAG, (String) SPUtils.get(mContext, "AmapError", "-"));
|
||||||
|
// Log.e(TAG, "amap: " + sb.toString());
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
// //设置场景模式后最好调用一次stop,再调用start以保证场景模式生效
|
||||||
|
// locationClient.stopLocation();
|
||||||
|
// locationClient.startLocation();
|
||||||
|
// Log.e(TAG, "initAmap: " + "startLocation");
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ import android.content.Context;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.amap.api.location.AMapLocation;
|
import com.baidu.location.BDAbstractLocationListener;
|
||||||
import com.amap.api.location.AMapLocationClient;
|
import com.baidu.location.BDLocation;
|
||||||
import com.amap.api.location.AMapLocationListener;
|
import com.baidu.location.LocationClient;
|
||||||
import com.uiui.sn.manager.AmapManager;
|
import com.uiui.sn.manager.AmapManager;
|
||||||
import com.uiui.sn.network.NetInterfaceManager;
|
import com.uiui.sn.network.NetInterfaceManager;
|
||||||
import com.uiui.sn.service.ControlPanelService;
|
import com.uiui.sn.service.ControlPanelService;
|
||||||
@@ -50,13 +50,13 @@ public class BootReceiver extends BroadcastReceiver {
|
|||||||
context.startService(new Intent(context, ManagerService.class));
|
context.startService(new Intent(context, ManagerService.class));
|
||||||
context.startService(new Intent(context, ControlPanelService.class));
|
context.startService(new Intent(context, ControlPanelService.class));
|
||||||
} else if (SOS.equals(action)) {
|
} else if (SOS.equals(action)) {
|
||||||
AMapLocationClient aMapLocationClient = AmapManager.getInstance().getLocationClient();
|
LocationClient locationClient = AmapManager.getInstance().getLocationClient();
|
||||||
aMapLocationClient.stopLocation();
|
locationClient.stop();
|
||||||
aMapLocationClient.startLocation();
|
locationClient.start();
|
||||||
aMapLocationClient.setLocationListener(new AMapLocationListener() {
|
locationClient.registerLocationListener(new BDAbstractLocationListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onLocationChanged(AMapLocation aMapLocation) {
|
public void onReceiveLocation(BDLocation bdLocation) {
|
||||||
Log.e(TAG, "onLocationChanged: ");
|
Log.e(TAG, "onReceiveLocation: ");
|
||||||
NetInterfaceManager.getInstance().updateAdminInfo();
|
NetInterfaceManager.getInstance().updateAdminInfo();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -151,7 +151,7 @@ public class DownloadService extends Service {
|
|||||||
final String filepath = task.getFilePath();
|
final String filepath = task.getFilePath();
|
||||||
final String packageName = task.getExtendField();
|
final String packageName = task.getExtendField();
|
||||||
try {
|
try {
|
||||||
Log.e(TAG, "taskFail: " + "Exception: " + e.getMessage());
|
Log.e(TAG, "taskFail: " + "Exception: " + e.getLocalizedMessage());
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user