Commit 9d6c8b7e authored by wanglei's avatar wanglei

init

parent aec16d9b
......@@ -2,6 +2,19 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" /> <!-- 大致位置,依赖网络 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 精确的位置,GPS -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- Recommended for Android 9 (API level 28) and lower. -->
<!-- Required for Android 10 (API level 29) and higher. -->
<!-- <service -->
<!-- android:foregroundServiceType="location" -->
<!-- android:name="MyNavigationService" /> -->
<!-- Required only when requesting background location access on Android 10 (API level 29) and higher. -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<application
android:name=".helper.MyApplication"
android:allowBackup="true"
......
package com.base.locationsharewhite.map
import android.content.Context
import android.view.View
import com.base.locationsharewhite.utils.BitmapUtils.getBitmapDescriptorFromLayoutResId
import com.google.android.gms.maps.CameraUpdateFactory
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.model.LatLng
import com.google.android.gms.maps.model.MarkerOptions
object MapUtils {
fun GoogleMap.addLocationMarker(
marker: View,
pair: Pair<Double, Double>,
tittle: String = "",
) {
val latLng = LatLng(pair.first, pair.second)
val bitmapDescriptor = getBitmapDescriptorFromLayoutResId(marker)
addMarker(
MarkerOptions()
.icon(bitmapDescriptor)
.position(latLng)
.title(tittle)
)
}
fun GoogleMap.moveCameraZoom(
pair: Pair<Double, Double>,
zoom: Float = 15f
) {
val latLng = LatLng(pair.first, pair.second)
moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, zoom))
}
}
\ No newline at end of file
package com.base.locationsharewhite.ui.main
import android.Manifest
import android.content.Intent
import android.graphics.Color
import android.os.Build
import android.view.LayoutInflater
import androidx.core.view.updatePadding
import com.base.locationsharewhite.R
import com.base.locationsharewhite.databinding.ActivityMainBinding
import com.base.locationsharewhite.helper.BaseActivity
import com.base.locationsharewhite.helper.MyApplication
import com.base.locationsharewhite.map.MapUtils.addLocationMarker
import com.base.locationsharewhite.map.MapUtils.moveCameraZoom
import com.base.locationsharewhite.ui.howuse.HowUseActivity
import com.base.locationsharewhite.ui.locationmap.LocationMapActivity
import com.base.locationsharewhite.ui.set.SettingActivity
import com.base.locationsharewhite.utils.BarUtils
import com.base.locationsharewhite.utils.LocationUtils.getLastKnowLocation
import com.base.locationsharewhite.utils.LogEx
import com.base.locationsharewhite.utils.PermissionUtils.checkLocationPermission
import com.google.android.gms.maps.CameraUpdateFactory
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.OnMapReadyCallback
import com.google.android.gms.maps.SupportMapFragment
import com.google.android.gms.maps.model.BitmapDescriptorFactory
import com.google.android.gms.maps.model.LatLng
import com.google.android.gms.maps.model.MarkerOptions
class MainActivity : BaseActivity<ActivityMainBinding>() {
class MainActivity : BaseActivity<ActivityMainBinding>(), OnMapReadyCallback {
private val TAG = "MainActivity"
......@@ -20,12 +35,32 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
ActivityMainBinding.inflate(layoutInflater)
}
private var map: GoogleMap? = null
override fun initView() {
LogEx.logDebug(TAG, "initView")
BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
if (!checkLocationPermission()) {
launcher.launch(arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION)) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
launcher.launch(arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION)) {
}
}
}
}
val mapFragment =
supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
mapFragment?.getMapAsync(this)
}
override fun initListener() {
......@@ -36,6 +71,9 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
binding.ivFangda.setOnClickListener {
startActivity(Intent(this, LocationMapActivity::class.java))
}
binding.llMap.setOnClickListener {
startActivity(Intent(this, LocationMapActivity::class.java))
}
binding.flMyLocationCode.setOnClickListener {
startActivity(Intent(this, LocationCodeActivity::class.java))
}
......@@ -61,4 +99,16 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
}
LogEx.logDebug(TAG, "onResume isRecreate=$isRecreate")
}
override fun onMapReady(googleMap: GoogleMap) {
map = googleMap
val pair = getLastKnowLocation()
LogEx.logDebug(TAG, "getLastKnowLocation ${pair.first} ${pair.second}")
val myAvatar = LayoutInflater.from(this).inflate(R.layout.avatar_me, null)
map?.moveCameraZoom(pair)
map?.addLocationMarker(myAvatar, pair, "my")
}
}
\ No newline at end of file
package com.base.locationsharewhite.utils
import android.content.Context
import android.graphics.Bitmap
import android.graphics.Canvas
import android.view.LayoutInflater
import android.view.View
import com.google.android.gms.maps.model.BitmapDescriptor
import com.google.android.gms.maps.model.BitmapDescriptorFactory
object BitmapUtils {
private fun createBitmapFromView(view: View): Bitmap {
view.measure(
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
)
view.layout(0, 0, view.measuredWidth, view.measuredHeight)
// 创建一个和布局大小一样的 Bitmap
val bitmap = Bitmap.createBitmap(view.measuredWidth, view.measuredHeight, Bitmap.Config.ARGB_8888)
// 使用 Canvas 将布局绘制到 Bitmap 上
val canvas = Canvas(bitmap)
view.draw(canvas)
return bitmap
}
// 方法:将 XML 布局资源 ID 转换为 BitmapDescriptor
fun getBitmapDescriptorFromLayoutResId(view: View): BitmapDescriptor {
val bitmap = createBitmapFromView(view)
return BitmapDescriptorFactory.fromBitmap(bitmap)
}
}
\ No newline at end of file
package com.base.locationsharewhite.utils
import android.annotation.SuppressLint
import android.content.Context
import android.location.Criteria
import android.location.Location
import android.location.LocationManager
import androidx.core.content.ContextCompat
object LocationUtils {
@SuppressLint("MissingPermission")
fun Context.getLastKnowLocation(): Pair<Double, Double> {
val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager?
if (locationManager != null) {
val provider: String? = locationManager.getBestProvider(Criteria(), true)
if (provider != null) {
val lastKnownLocation: Location? = locationManager.getLastKnownLocation(provider)
val latitude: Double = lastKnownLocation?.latitude ?: 0.0//维度
val longitude: Double = lastKnownLocation?.longitude ?: 0.0//经度
return Pair(latitude, longitude)
}
}
return Pair(0.0, 0.0)
}
}
\ No newline at end of file
package com.base.locationsharewhite.utils
import android.Manifest
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.provider.Settings
import androidx.core.app.ActivityCompat
object PermissionUtils {
fun Context.checkStorePermission(): Boolean {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
Environment.isExternalStorageManager()
} else {
val readPermission = ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
val writePermission = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
return readPermission == PackageManager.PERMISSION_GRANTED && writePermission == PackageManager.PERMISSION_GRANTED;
}
}
fun Context.checkNotificationPermission(): Boolean {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
ActivityCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED
} else {
return true
}
}
fun Context.checkLocationPermission(): Boolean {
val fineLocationPermission = ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
val accessCoarsePermission = ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
return fineLocationPermission == PackageManager.PERMISSION_GRANTED && accessCoarsePermission == PackageManager.PERMISSION_GRANTED;
}
fun Context.requestStoragePermission(
launcher: ActivityLauncher,
jumpAction: (() -> Unit)? = null,
result: (flag: Boolean) -> Unit
) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
val intent =
Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
intent.addCategory("android.intent.category.DEFAULT")
intent.data = Uri.parse("package:${packageName}")
jumpAction?.invoke()
launcher.launch(intent) {
result.invoke(checkStorePermission())
}
} else {
launcher.launch(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { map ->
result(map.values.all { it })
}
}
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:src="@mipmap/dingweibg"
tools:ignore="ContentDescription" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="8dp"
android:src="@mipmap/my"
tools:ignore="ContentDescription" />
</FrameLayout>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment