From 0357fcf6b3a7f271ac9fdad1359d486f8831989c Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Tue, 25 Feb 2025 16:15:54 +0800 Subject: [PATCH] 0225_1615 --- positions/build.gradle | 22 +- positions/build.properties | 2 +- positions/src/main/AndroidManifest.xml | 2 +- .../studio/positions/Main2Activity.java | 2 +- ...nActivity.java => MainSimpleActivity.java} | 6 +- .../positions/fragments/TXMSFragment.java | 461 ++++++++++++++++++ ...vity_main.xml => activity_main_simple.xml} | 0 .../src/main/res/layout/fragment_txms.xml | 51 ++ 8 files changed, 525 insertions(+), 21 deletions(-) rename positions/src/main/java/cc/winboll/studio/positions/{MainActivity.java => MainSimpleActivity.java} (98%) create mode 100644 positions/src/main/java/cc/winboll/studio/positions/fragments/TXMSFragment.java rename positions/src/main/res/layout/{activity_main.xml => activity_main_simple.xml} (100%) create mode 100644 positions/src/main/res/layout/fragment_txms.xml diff --git a/positions/build.gradle b/positions/build.gradle index 03efb7b..62567e9 100644 --- a/positions/build.gradle +++ b/positions/build.gradle @@ -27,10 +27,12 @@ if (localFile.exists()) { def mapsdkkey = properties.getProperty('mapsdk.key', "") android { - compileSdkVersion 29 + compileSdkVersion 30 + buildToolsVersion "30.0.3" + defaultConfig { applicationId "cc.winboll.studio.positions" - minSdkVersion 22 + minSdkVersion 26 targetSdkVersion 29 versionCode 1 // versionName 更新后需要手动设置 @@ -62,7 +64,9 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'androidx.recyclerview:recyclerview:1.1.0' implementation 'androidx.appcompat:appcompat:1.1.0' - implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'androidx.viewpager:viewpager:1.0.0' + implementation 'androidx.fragment:fragment:1.0.0' + implementation 'com.google.android.material:material:1.4.0' implementation 'pub.devrel:easypermissions:2.0.1' // 地图 implementation 'com.tencent.map:tencent-map-vector-sdk:6.2.1.250120.3f971009.140342819' @@ -72,20 +76,8 @@ dependencies { implementation 'com.tencent.map.geolocation:TencentLocationSdk-openplatform:7.5.4.3' implementation 'com.google.code.gson:gson:2.8.5' - // 二维码使用的类库 - implementation 'com.google.zxing:core:3.4.1' - implementation 'com.journeyapps:zxing-android-embedded:3.6.0' - implementation 'io.github.medyo:android-about-page:2.0.0' implementation 'com.github.getActivity:ToastUtils:10.5' - implementation 'com.jcraft:jsch:0.1.55' - implementation 'org.jsoup:jsoup:1.13.1' - implementation 'com.squareup.okhttp3:okhttp:4.4.1' - - //api 'androidx.appcompat:appcompat:1.1.0' - implementation 'androidx.viewpager:viewpager:1.0.0' - implementation 'androidx.fragment:fragment:1.0.0' - implementation 'com.google.android.material:material:1.4.0' implementation 'cc.winboll.studio:libapputils:9.3.2' implementation 'cc.winboll.studio:libappbase:1.5.6' diff --git a/positions/build.properties b/positions/build.properties index 51dee90..311254f 100644 --- a/positions/build.properties +++ b/positions/build.properties @@ -1,5 +1,5 @@ #Created by .winboll/winboll_app_build.gradle -#Mon Feb 24 22:42:06 GMT 2025 +#Tue Feb 25 05:04:52 GMT 2025 stageCount=0 libraryProject= baseVersion=1.0 diff --git a/positions/src/main/AndroidManifest.xml b/positions/src/main/AndroidManifest.xml index e799961..7bf84d9 100644 --- a/positions/src/main/AndroidManifest.xml +++ b/positions/src/main/AndroidManifest.xml @@ -47,7 +47,7 @@ tools:ignore="AllowBackup,GoogleAppIndexingWarning" tools:targetApi="q"> - + diff --git a/positions/src/main/java/cc/winboll/studio/positions/Main2Activity.java b/positions/src/main/java/cc/winboll/studio/positions/Main2Activity.java index ba8c7c2..fbecf27 100644 --- a/positions/src/main/java/cc/winboll/studio/positions/Main2Activity.java +++ b/positions/src/main/java/cc/winboll/studio/positions/Main2Activity.java @@ -36,7 +36,7 @@ import java.util.List; import com.tencent.map.vector.demo.AbsListActivity; import com.tencent.map.vector.demo.AbsActivity; -final public class Main2Activity extends AbsActivity implements IWinBollActivity, ViewPager.OnPageChangeListener, View.OnClickListener { +final public class MainSimpleActivity extends AbsActivity implements IWinBollActivity, ViewPager.OnPageChangeListener, View.OnClickListener { public static final String TAG = "MainActivity"; diff --git a/positions/src/main/java/cc/winboll/studio/positions/MainActivity.java b/positions/src/main/java/cc/winboll/studio/positions/MainSimpleActivity.java similarity index 98% rename from positions/src/main/java/cc/winboll/studio/positions/MainActivity.java rename to positions/src/main/java/cc/winboll/studio/positions/MainSimpleActivity.java index a0c9542..140aae9 100644 --- a/positions/src/main/java/cc/winboll/studio/positions/MainActivity.java +++ b/positions/src/main/java/cc/winboll/studio/positions/MainSimpleActivity.java @@ -54,9 +54,9 @@ import java.util.List; import pub.devrel.easypermissions.EasyPermissions; import cc.winboll.studio.positions.beans.LocationJson; -public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks,LocationSource, TencentLocationListener { +public class MainSimpleActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks,LocationSource, TencentLocationListener { - public static final String TAG ="MainActivity"; + public static final String TAG ="MainSimpleActivity"; private static final int PERMISSION_REQUEST_CODE = 1; @@ -75,7 +75,7 @@ public class MainActivity extends AppCompatActivity implements EasyPermissions.P @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); + setContentView(R.layout.activity_main_simple); locationJsonList = new ArrayList(); diff --git a/positions/src/main/java/cc/winboll/studio/positions/fragments/TXMSFragment.java b/positions/src/main/java/cc/winboll/studio/positions/fragments/TXMSFragment.java new file mode 100644 index 0000000..38b65d5 --- /dev/null +++ b/positions/src/main/java/cc/winboll/studio/positions/fragments/TXMSFragment.java @@ -0,0 +1,461 @@ +package cc.winboll.studio.positions.fragments; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/02/25 12:44:39 + * @Describe 腾讯地图服务视图 + */ +import android.Manifest; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Matrix; +import android.location.Location; +import android.os.Bundle; +import android.os.Looper; +import android.os.SystemClock; +import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.TextView; +import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import cc.winboll.studio.libappbase.LogView; +import cc.winboll.studio.positions.R; +import cc.winboll.studio.positions.activities.SettingsActivity; +import cc.winboll.studio.positions.activities.TestMapViewActivity; +import cc.winboll.studio.positions.utils.LocationFileStorage; +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.google.android.material.snackbar.Snackbar; +import com.tencent.map.geolocation.TencentLocation; +import com.tencent.map.geolocation.TencentLocationListener; +import com.tencent.map.geolocation.TencentLocationManager; +import com.tencent.map.geolocation.TencentLocationRequest; +import com.tencent.tencentmap.mapsdk.maps.CameraUpdate; +import com.tencent.tencentmap.mapsdk.maps.CameraUpdateFactory; +import com.tencent.tencentmap.mapsdk.maps.LocationSource; +import com.tencent.tencentmap.mapsdk.maps.TencentMap; +import com.tencent.tencentmap.mapsdk.maps.TencentMapInitializer; +import com.tencent.tencentmap.mapsdk.maps.TextureMapView; +import com.tencent.tencentmap.mapsdk.maps.model.BitmapDescriptor; +import com.tencent.tencentmap.mapsdk.maps.model.BitmapDescriptorFactory; +import com.tencent.tencentmap.mapsdk.maps.model.CameraPosition; +import com.tencent.tencentmap.mapsdk.maps.model.LatLng; +import com.tencent.tencentmap.mapsdk.maps.model.Marker; +import com.tencent.tencentmap.mapsdk.maps.model.MarkerOptions; +import com.tencent.tencentmap.mapsdk.maps.model.MyLocationStyle; +import java.util.ArrayList; +import java.util.List; +import pub.devrel.easypermissions.EasyPermissions; +import cc.winboll.studio.positions.beans.LocationJson; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import androidx.fragment.app.Fragment; +import cc.winboll.studio.positions.R; +import cc.winboll.studio.libappbase.LogView; +import androidx.annotation.Nullable; +import androidx.annotation.NonNull; +import android.graphics.Color; +import android.widget.TextView; +import cc.winboll.studio.positions.views.GridMapView; +import com.tencent.tencentmap.mapsdk.maps.MapView; +import com.tencent.tencentmap.mapsdk.maps.TencentMap; +import com.tencent.tencentmap.mapsdk.maps.TextureMapView; + +public class TXMSFragment extends Fragment implements EasyPermissions.PermissionCallbacks,LocationSource, TencentLocationListener { + + public static final String TAG = "TXMSFragment"; + + + private static final String ARG_PAGE = "ARG_PAGE"; + private int mPage; + private TextureMapView mapView; + protected TencentMap tencentMap; + TextView mtvInfo; + private LocationSource.OnLocationChangedListener locationChangedListener; + + private TencentLocationManager locationManager; + private TencentLocationRequest locationRequest; + private MyLocationStyle locationStyle; + ArrayList locationJsonList; + + public static TXMSFragment newInstance(int page) { + Bundle args = new Bundle(); + args.putInt(ARG_PAGE, page); + TXMSFragment fragment = new GmsFragment(); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments()!= null) { + mPage = getArguments().getInt(ARG_PAGE); + } + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + View viewRoot = inflater.inflate(R.layout.fragment_gms, container, false); + locationJsonList = new ArrayList(); + + mLogView = viewRoot.findViewById(R.id.logview); + mLogView.start(); + + TencentMapInitializer.setAgreePrivacy(this, true); + TencentMapInitializer.start(this); + TencentLocationManager.setUserAgreePrivacy(true); + + + mapView = viewRoot.findViewById(R.id.mapview); + mapView.setOpaque(false); + //创建tencentMap地图对象,可以完成对地图的几乎所有操作 + tencentMap = mapView.getMap(); + + FloatingActionButton fab = viewRoot.findViewById(R.id.fab); + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Snackbar.make(view, "点击了悬浮按钮", Snackbar.LENGTH_LONG).show(); + } + }); + + mtvInfo = viewRoot.findViewById(R.id.tv_info); + + checkLocationPermission(); + + //设置显示定位的图标 + TencentLocationManager.setUserAgreePrivacy(true); + //建立定位 + //initLocation(); + //对地图操作类进行操作 + CameraUpdate cameraSigma = + CameraUpdateFactory.newCameraPosition(new CameraPosition( + new LatLng(22.984066, 116.307548), + 15, + 0f, + 0f)); + //移动地图 + tencentMap.moveCamera(cameraSigma); + + // 设置地图点击监听 + tencentMap.setOnMapClickListener(new TencentMap.OnMapClickListener(){ + + @Override + public void onMapClick(com.tencent.tencentmap.mapsdk.maps.model.LatLng latLng) { + //创建Marker对象之前,设置属性 + //LatLng position = new LatLng(40.011313,116.391907); + BitmapDescriptor custom = BitmapDescriptorFactory.fromResource(R.drawable.marker); + Location location = createLocationFromLatLng(latLng); + addLocationJson(location); + Marker mCustomMarker = tencentMap.addMarker(new MarkerOptions(latLng)); + + //创建Marker对象之后,修改属性 +// Animation animation = new AlphaAnimation(0.7f, 0f); +// animation.setDuration(2000); +// mCustomMarker.setAnimation(animation); +// mCustomMarker.startAnimation(); + } + }); + + + return viewRoot; + } + + void loadLocations() { + // 存储位置数据 +// Location location = new Location("gps"); +// location.setLatitude(22.984066); +// location.setLongitude(116.307548); +// location.setTime(System.currentTimeMillis()); +// +// // 方式1:保存到文件 +// List locations = new ArrayList<>(); +// locations.add(location); +// LocationFileStorage.saveToFile(this, locations); + + // 读取数据 + locationJsonList = LocationFileStorage.loadFromFile(this); + + for (LocationJson lj : locationJsonList) { + tencentMap.addMarker(new MarkerOptions(toTencentLatLng(lj.toLocation()))); + //LogUtils.d("Location", "Lat: " + loc.getLatitude() + ", Lng: " + loc.getLongitude()); + } + } + + void addLocationJson(Location location) { + // 存储位置数据 +// Location location = new Location("gps"); +// location.setLatitude(22.984066); +// location.setLongitude(116.307548); +// location.setTime(System.currentTimeMillis()); + + // 方式1:保存到文件 + //List locations = new ArrayList<>(); + locationJsonList.add(new LocationJson(location)); + LocationFileStorage.saveToFile(this, locationJsonList); + + // 读取数据 +// List loaded = LocationFileStorage.loadFromFile(this); +// for (Location loc : loaded) { +// tencentMap.addMarker(new MarkerOptions(toTencentLatLng(loc))); +// //LogUtils.d("Location", "Lat: " + loc.getLatitude() + ", Lng: " + loc.getLongitude()); +// } + } + + + +// 创建Location对象方法 + private Location createLocationFromLatLng(LatLng latLng) { + Location location = new Location("tencent_map_manual"); + + // 设置基础坐标 + location.setLatitude(latLng.getLatitude()); + location.setLongitude(latLng.getLongitude()); + + // 设置必要元数据 + location.setTime(System.currentTimeMillis()); + location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); + location.setAccuracy(5.0f); // 手动点击精度设为5米 + + return location; + } + + + public LatLng toTencentLatLng(Location location) { + return new LatLng( + location.getLatitude(), + location.getLongitude() + ); + } + + + // 添加标记方法 + private void addMarker(LatLng latLng) { + tencentMap.clearAllOverlays(); + MarkerOptions options = new MarkerOptions(latLng) + .icon(BitmapDescriptorFactory.defaultMarker()) + .title("点击保存"); + tencentMap.addMarker(options); + } + + /** + * mapview的生命周期管理 + */ + @Override + public void onStart() { + super.onStart(); + mapView.onStart(); + } + + @Override + public void onResume() { + super.onResume(); + mapView.onResume(); + } + + @Override + public void onPause() { + super.onPause(); + mapView.onPause(); + } + + @Override + public void onStop() { + super.onStop(); + mapView.onStop(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + mapView.onDestroy(); + } + + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); +// LatLng center = new LatLng(39.904556, 116.427242); +// tencentMap.moveCamera( +// CameraUpdateFactory.newLatLngZoom(center, 13f) // 注意 13 → 13f +// ); + loadLocations(); + } + + + /** + * 设置定位图标样式 + */ + private void setLocMarkerStyle() { + locationStyle = new MyLocationStyle(); + //创建图标 + BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromBitmap(getBitMap(R.drawable.marker)); + locationStyle.icon(bitmapDescriptor); + //设置定位圆形区域的边框宽度 + locationStyle.strokeWidth(3); + //设置圆区域的颜色 + locationStyle.fillColor(R.color.style); + + tencentMap.setMyLocationStyle(locationStyle); + } + + + + private Bitmap getBitMap(int resourceId) { + Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resourceId); + int width = bitmap.getWidth(); + int height = bitmap.getHeight(); + int newWidth = 55; + int newHeight = 55; + float widthScale = ((float)newWidth) / width; + float heightScale = ((float)newHeight) / height; + Matrix matrix = new Matrix(); + matrix.postScale(widthScale, heightScale); + bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); + return bitmap; + } + + + + /** + * 定位的一些初始化设置 + */ + private void initLocation() { + //用于访问腾讯定位服务的类, 周期性向客户端提供位置更新 + locationManager = TencentLocationManager.getInstance(this); + //设置坐标系 + locationManager.setCoordinateType(TencentLocationManager.COORDINATE_TYPE_GCJ02); + //创建定位请求 + locationRequest = TencentLocationRequest.create(); + //设置定位周期(位置监听器回调周期)为3s + locationRequest.setInterval(3000); + + //地图上设置定位数据源 + tencentMap.setLocationSource(this); + //设置当前位置可见 + tencentMap.setMyLocationEnabled(true); + //设置定位图标样式 + setLocMarkerStyle(); +// locationStyle = locationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE); + tencentMap.setMyLocationStyle(locationStyle); + } + /** + * 实现位置监听 + * @param tencentLocation + * @param i + * @param s + */ + @Override + public void onLocationChanged(TencentLocation tencentLocation, int i, String s) { + + if (i == TencentLocation.ERROR_OK && locationChangedListener != null) { + final Location location = new Location(tencentLocation.getProvider()); + //设置经纬度以及精度 + location.setLatitude(tencentLocation.getLatitude()); + location.setLongitude(tencentLocation.getLongitude()); + location.setAccuracy(tencentLocation.getAccuracy()); + locationChangedListener.onLocationChanged(location); + + //显示回调的实时位置信息 + runOnUiThread(new Runnable() { + @Override + public void run() { +// Rules.getEffectInfo(location); +// double distance = DistanceUtils.getDistance( +// locationA.getLatitude(), +// locationA.getLongitude(), +// locationB.getLatitude(), +// locationB.getLongitude() +// ); + mtvInfo.setText(String.format("\n%f %f", location.getLatitude(), location.getLongitude())); + //打印tencentLocation的json字符串 +// Toast.makeText(getApplicationContext(), new Gson().toJson(location), Toast.LENGTH_LONG).show(); + } + }); + } + } + + @Override + public void onStatusUpdate(String s, int i, String s1) { + //GPS, WiFi, Radio 等状态发生变化 + Log.v("State changed", s + "===" + s1); + } + + + @Override + public void activate(OnLocationChangedListener onLocationChangedListener) { + locationChangedListener = onLocationChangedListener; + + int err = locationManager.requestLocationUpdates(locationRequest, this, Looper.myLooper()); + switch (err) { + case 1: + Toast.makeText(this, "设备缺少使用腾讯定位服务需要的基本条件", Toast.LENGTH_SHORT).show(); + break; + case 2: + Toast.makeText(this, "manifest 中配置的 key 不正确", Toast.LENGTH_SHORT).show(); + break; + case 3: + Toast.makeText(this, "自动加载libtencentloc.so失败", Toast.LENGTH_SHORT).show(); + break; + + default: + break; + } + } + + @Override + public void deactivate() { + locationManager.removeUpdates(this); + locationManager = null; + locationRequest = null; + locationChangedListener = null; + } + + @Override + public void onPermissionsGranted(int requestCode, @NonNull List perms) { + Log.e("location quest: ", "success"); + } + + @Override + public void onPermissionsDenied(int requestCode, @NonNull List perms) { + Log.e("location quest: ", "failed"); + } + + private void checkLocationPermission() { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED + || ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(this, + new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, + PERMISSION_REQUEST_CODE); + } else { + // 权限已授予,可进行定位操作 + //startLocationUpdates(); + } + } + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (requestCode == PERMISSION_REQUEST_CODE) { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + //startLocationUpdates(); + } else { + // 用户拒绝了权限请求 + Toast.makeText(this, "请授予定位权限", Toast.LENGTH_SHORT).show(); + } + } + } + + +} diff --git a/positions/src/main/res/layout/activity_main.xml b/positions/src/main/res/layout/activity_main_simple.xml similarity index 100% rename from positions/src/main/res/layout/activity_main.xml rename to positions/src/main/res/layout/activity_main_simple.xml diff --git a/positions/src/main/res/layout/fragment_txms.xml b/positions/src/main/res/layout/fragment_txms.xml new file mode 100644 index 0000000..20d3b56 --- /dev/null +++ b/positions/src/main/res/layout/fragment_txms.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + +