Commit 9d6c8b7e authored by wanglei's avatar wanglei

init

parent aec16d9b
...@@ -2,6 +2,19 @@ ...@@ -2,6 +2,19 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"> 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 <application
android:name=".helper.MyApplication" android:name=".helper.MyApplication"
android:allowBackup="true" 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 package com.base.locationsharewhite.ui.main
import android.Manifest
import android.content.Intent import android.content.Intent
import android.graphics.Color import android.graphics.Color
import android.os.Build
import android.view.LayoutInflater
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import com.base.locationsharewhite.R
import com.base.locationsharewhite.databinding.ActivityMainBinding import com.base.locationsharewhite.databinding.ActivityMainBinding
import com.base.locationsharewhite.helper.BaseActivity import com.base.locationsharewhite.helper.BaseActivity
import com.base.locationsharewhite.helper.MyApplication 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.howuse.HowUseActivity
import com.base.locationsharewhite.ui.locationmap.LocationMapActivity import com.base.locationsharewhite.ui.locationmap.LocationMapActivity
import com.base.locationsharewhite.ui.set.SettingActivity import com.base.locationsharewhite.ui.set.SettingActivity
import com.base.locationsharewhite.utils.BarUtils import com.base.locationsharewhite.utils.BarUtils
import com.base.locationsharewhite.utils.LocationUtils.getLastKnowLocation
import com.base.locationsharewhite.utils.LogEx 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" private val TAG = "MainActivity"
...@@ -20,12 +35,32 @@ class MainActivity : BaseActivity<ActivityMainBinding>() { ...@@ -20,12 +35,32 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
ActivityMainBinding.inflate(layoutInflater) ActivityMainBinding.inflate(layoutInflater)
} }
private var map: GoogleMap? = null
override fun initView() { override fun initView() {
LogEx.logDebug(TAG, "initView") LogEx.logDebug(TAG, "initView")
BarUtils.setStatusBarLightMode(this, true) BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT) BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight()) 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() { override fun initListener() {
...@@ -36,6 +71,9 @@ class MainActivity : BaseActivity<ActivityMainBinding>() { ...@@ -36,6 +71,9 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
binding.ivFangda.setOnClickListener { binding.ivFangda.setOnClickListener {
startActivity(Intent(this, LocationMapActivity::class.java)) startActivity(Intent(this, LocationMapActivity::class.java))
} }
binding.llMap.setOnClickListener {
startActivity(Intent(this, LocationMapActivity::class.java))
}
binding.flMyLocationCode.setOnClickListener { binding.flMyLocationCode.setOnClickListener {
startActivity(Intent(this, LocationCodeActivity::class.java)) startActivity(Intent(this, LocationCodeActivity::class.java))
} }
...@@ -61,4 +99,16 @@ class MainActivity : BaseActivity<ActivityMainBinding>() { ...@@ -61,4 +99,16 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
} }
LogEx.logDebug(TAG, "onResume isRecreate=$isRecreate") 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