Commit 51f2637f authored by wanglei's avatar wanglei

...处理权限

parent 6ba72111
...@@ -4,17 +4,17 @@ ...@@ -4,17 +4,17 @@
<uses-permission android:name="android.permission.INTERNET" /> <!-- 大致位置,依赖网络 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 大致位置,依赖网络 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 精确的位置,GPS --> <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. --> <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. --> <!-- Required for Android 10 (API level 29) and higher. -->
<!-- <service --> <!-- <service -->
<!-- android:foregroundServiceType="location" --> <!-- android:foregroundServiceType="location" -->
<!-- android:name="MyNavigationService" /> --> <!-- android:name="MyNavigationService" /> -->
<!-- Required only when requesting background location access on Android 10 (API level 29) and higher. --> <!-- Required only when requesting background location access on Android 10 (API level 29) and higher. -->
<!-- <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />--> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<!-- 身体活动数据 --> <!-- 身体活动数据 -->
<!-- <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />--> <!-- <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />-->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
......
package com.base.locationsharewhite.ui.locationmap package com.base.locationsharewhite.ui.locationmap
import android.Manifest
import android.animation.ValueAnimator import android.animation.ValueAnimator
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Intent import android.content.Intent
import android.graphics.Color import android.graphics.Color
import android.net.Uri
import android.provider.Settings
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.animation.LinearInterpolator import android.view.animation.LinearInterpolator
...@@ -12,7 +15,6 @@ import androidx.lifecycle.lifecycleScope ...@@ -12,7 +15,6 @@ import androidx.lifecycle.lifecycleScope
import com.base.locationsharewhite.BuildConfig import com.base.locationsharewhite.BuildConfig
import com.base.locationsharewhite.R import com.base.locationsharewhite.R
import com.base.locationsharewhite.bean.ConstObject import com.base.locationsharewhite.bean.ConstObject
import com.base.locationsharewhite.bean.ViewerBean
import com.base.locationsharewhite.bean.ViewingBean import com.base.locationsharewhite.bean.ViewingBean
import com.base.locationsharewhite.databinding.ActivityLocationMapBinding import com.base.locationsharewhite.databinding.ActivityLocationMapBinding
import com.base.locationsharewhite.helper.BaseActivity import com.base.locationsharewhite.helper.BaseActivity
...@@ -26,10 +28,12 @@ import com.base.locationsharewhite.ui.set.RenameActivity.Companion.RENAME_VIEWIN ...@@ -26,10 +28,12 @@ import com.base.locationsharewhite.ui.set.RenameActivity.Companion.RENAME_VIEWIN
import com.base.locationsharewhite.ui.views.DialogView.showMapTypeDialog import com.base.locationsharewhite.ui.views.DialogView.showMapTypeDialog
import com.base.locationsharewhite.ui.views.DialogView.showViewerMoreDialog import com.base.locationsharewhite.ui.views.DialogView.showViewerMoreDialog
import com.base.locationsharewhite.utils.BarUtils import com.base.locationsharewhite.utils.BarUtils
import com.base.locationsharewhite.utils.IntentUtils.intentAppDetailsSettings
import com.base.locationsharewhite.utils.IntentUtils.intentLocationSetting
import com.base.locationsharewhite.utils.LogEx import com.base.locationsharewhite.utils.LogEx
import com.base.locationsharewhite.utils.PermissionUtils.checkLocationPermission import com.base.locationsharewhite.utils.PermissionUtils.checkLocationPermission
import com.base.locationsharewhite.utils.PermissionUtils.checkLocationPermissionDeniedByUser
import com.base.locationsharewhite.utils.SpStringUtils import com.base.locationsharewhite.utils.SpStringUtils
import com.base.locationsharewhite.utils.SpStringUtils.VIEWER_NICKNAME_KEY
import com.base.locationsharewhite.utils.SpStringUtils.VIEWING_NICKNAME_KEY import com.base.locationsharewhite.utils.SpStringUtils.VIEWING_NICKNAME_KEY
import com.base.locationsharewhite.utils.SpStringUtils._DEVICE_NICKNAME_ import com.base.locationsharewhite.utils.SpStringUtils._DEVICE_NICKNAME_
import com.base.locationsharewhite.utils.ToastUtils.toast import com.base.locationsharewhite.utils.ToastUtils.toast
...@@ -79,6 +83,7 @@ class LocationMapActivity : BaseActivity<ActivityLocationMapBinding>(), OnMapRea ...@@ -79,6 +83,7 @@ class LocationMapActivity : BaseActivity<ActivityLocationMapBinding>(), OnMapRea
showFriendGuideOrNoFriend() showFriendGuideOrNoFriend()
initAdapter() initAdapter()
initViewingData() initViewingData()
} }
private fun initAdapter() { private fun initAdapter() {
...@@ -231,6 +236,26 @@ class LocationMapActivity : BaseActivity<ActivityLocationMapBinding>(), OnMapRea ...@@ -231,6 +236,26 @@ class LocationMapActivity : BaseActivity<ActivityLocationMapBinding>(), OnMapRea
initViewingData() initViewingData()
} }
binding.bottomSheet.setOnClickListener { } binding.bottomSheet.setOnClickListener { }
binding.ivPermission.setOnClickListener {
launcher.launch(arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION)) { map ->
val result = map.values.all { it }
if (result) {
binding.ivPermission.visibility = View.INVISIBLE
} else {
val flag = checkLocationPermissionDeniedByUser()
if (flag) {
toast("Permission Denied By User")
launcher.launch(intentLocationSetting())
} else {
}
}
}
}
} }
...@@ -411,8 +436,11 @@ class LocationMapActivity : BaseActivity<ActivityLocationMapBinding>(), OnMapRea ...@@ -411,8 +436,11 @@ class LocationMapActivity : BaseActivity<ActivityLocationMapBinding>(), OnMapRea
} }
if (checkLocationPermission()) { if (checkLocationPermission()) {
binding.ivPermission.visibility = View.GONE
locationPresenter.requestLocationUpdates() locationPresenter.requestLocationUpdates()
locationPresenter.startUploadMyLocation() locationPresenter.startUploadMyLocation()
} else {
binding.ivPermission.visibility = View.VISIBLE
} }
refreshNickName() refreshNickName()
} }
......
...@@ -5,10 +5,10 @@ import android.app.Activity ...@@ -5,10 +5,10 @@ import android.app.Activity
import android.location.Location import android.location.Location
import android.os.Looper import android.os.Looper
import androidx.lifecycle.LifecycleCoroutineScope import androidx.lifecycle.LifecycleCoroutineScope
import com.base.locationsharewhite.BuildConfig
import com.base.locationsharewhite.location.LocationPositionUtils.uploadMyLocation import com.base.locationsharewhite.location.LocationPositionUtils.uploadMyLocation
import com.base.locationsharewhite.map.MapUtils.getLatLngByLocationManager import com.base.locationsharewhite.map.MapUtils.getLatLngByLocationManager
import com.base.locationsharewhite.utils.BatteryUtils.getBatteryLevel import com.base.locationsharewhite.utils.BatteryUtils.getBatteryLevel
import com.base.locationsharewhite.utils.LogEx
import com.google.android.gms.location.FusedLocationProviderClient import com.google.android.gms.location.FusedLocationProviderClient
import com.google.android.gms.location.LocationCallback import com.google.android.gms.location.LocationCallback
import com.google.android.gms.location.LocationRequest import com.google.android.gms.location.LocationRequest
...@@ -82,6 +82,8 @@ class LocationPresenter( ...@@ -82,6 +82,8 @@ class LocationPresenter(
oneShotLocationCallBack = null oneShotLocationCallBack = null
} }
}.addOnFailureListener { e ->
LogEx.logDebug(TAG, "e=$e")
} }
} }
......
package com.base.locationsharewhite.ui.main package com.base.locationsharewhite.ui.main
import android.Manifest import android.Manifest
import android.app.Dialog
import android.content.Intent import android.content.Intent
import android.graphics.Color import android.graphics.Color
import android.os.Build import android.os.Build
...@@ -11,19 +12,23 @@ import androidx.lifecycle.lifecycleScope ...@@ -11,19 +12,23 @@ import androidx.lifecycle.lifecycleScope
import com.base.locationsharewhite.BuildConfig import com.base.locationsharewhite.BuildConfig
import com.base.locationsharewhite.R import com.base.locationsharewhite.R
import com.base.locationsharewhite.databinding.ActivityMainBinding import com.base.locationsharewhite.databinding.ActivityMainBinding
import com.base.locationsharewhite.fcm.MsgMgr
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.helper.config.ConstConfig
import com.base.locationsharewhite.location.LocationLoginUtils import com.base.locationsharewhite.location.LocationLoginUtils
import com.base.locationsharewhite.map.MapUtils.addLocationMarker import com.base.locationsharewhite.map.MapUtils.addLocationMarker
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.ui.views.DialogView.showAppExitDialog import com.base.locationsharewhite.ui.views.DialogView.showAppExitDialog
import com.base.locationsharewhite.ui.views.LocationPermissionDialog.showLocationAllowAllTimeDialog
import com.base.locationsharewhite.utils.BarUtils import com.base.locationsharewhite.utils.BarUtils
import com.base.locationsharewhite.utils.LogEx import com.base.locationsharewhite.utils.LogEx
import com.base.locationsharewhite.utils.PermissionUtils.checkBackgroundLocationPermission
import com.base.locationsharewhite.utils.PermissionUtils.checkBackgroundLocationPermissionDeniedByUser
import com.base.locationsharewhite.utils.PermissionUtils.checkLocationPermission import com.base.locationsharewhite.utils.PermissionUtils.checkLocationPermission
import com.base.locationsharewhite.utils.PermissionUtils.checkLocationPermissionDeniedByUser
import com.base.locationsharewhite.utils.PermissionUtils.requestLocationAllowAllTime
import com.base.locationsharewhite.utils.ToastUtils.toast
import com.google.android.gms.maps.CameraUpdateFactory import com.google.android.gms.maps.CameraUpdateFactory
import com.google.android.gms.maps.GoogleMap import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.OnMapReadyCallback import com.google.android.gms.maps.OnMapReadyCallback
...@@ -31,9 +36,13 @@ import com.google.android.gms.maps.SupportMapFragment ...@@ -31,9 +36,13 @@ import com.google.android.gms.maps.SupportMapFragment
import com.google.android.gms.maps.model.LatLng import com.google.android.gms.maps.model.LatLng
import com.google.android.gms.maps.model.Marker import com.google.android.gms.maps.model.Marker
/**
* https://developer.android.com/about/versions/14/changes/data-safety?hl=zh-cn
*/
class MainActivity : BaseActivity<ActivityMainBinding>(), OnMapReadyCallback { class MainActivity : BaseActivity<ActivityMainBinding>(), OnMapReadyCallback {
private val TAG = "MainActivity" private val TAG = "MainActivity"
private var allowAllTimeDialog: Dialog? = null
override val binding: ActivityMainBinding by lazy { override val binding: ActivityMainBinding by lazy {
ActivityMainBinding.inflate(layoutInflater) ActivityMainBinding.inflate(layoutInflater)
...@@ -58,17 +67,16 @@ class MainActivity : BaseActivity<ActivityMainBinding>(), OnMapReadyCallback { ...@@ -58,17 +67,16 @@ class MainActivity : BaseActivity<ActivityMainBinding>(), OnMapReadyCallback {
actionId = intent.extras?.getInt("actionId") actionId = intent.extras?.getInt("actionId")
LogEx.logDebug(TAG, "initView actionId=$actionId", true) LogEx.logDebug(TAG, "initView actionId=$actionId", true)
if (!checkLocationPermission()) { val flag1 = checkLocationPermission()
launcher.launch(arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION)) { val flag2 = checkBackgroundLocationPermission()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { LogEx.logDebug(TAG, "权限自定义弹窗 flag1=$flag1 flag2=$flag2")
launcher.launch(arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION)) {
val denyFlag1 = checkLocationPermissionDeniedByUser()
val denyFlag2 = checkBackgroundLocationPermissionDeniedByUser()
LogEx.logDebug(TAG, "用户拒绝 denyFlag1=$denyFlag1 denyFlag2=$denyFlag2")
}
}
}
}
//访问运动数据 //访问运动数据
//https://developer.android.com/develop/sensors-and-location/location/transitions?hl=zh-cn //https://developer.android.com/develop/sensors-and-location/location/transitions?hl=zh-cn
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
...@@ -82,8 +90,48 @@ class MainActivity : BaseActivity<ActivityMainBinding>(), OnMapReadyCallback { ...@@ -82,8 +90,48 @@ class MainActivity : BaseActivity<ActivityMainBinding>(), OnMapReadyCallback {
mapFragment?.getMapAsync(this) mapFragment?.getMapAsync(this)
LocationLoginUtils.login() LocationLoginUtils.login()
}
override fun onResume() {
super.onResume()
val isRecreate = updateAppLanguage(MyApplication.mainLanguage, TAG) {
MyApplication.mainLanguage = it
}
if (isRecreate) {
return
}
mainPresenter.requestLocationUpdates()
mainPresenter.startLocationJob(lifecycleScope)
showAllowAllTimeDialog()
isRunning = true
} }
private fun showAllowAllTimeDialog() {
if (!checkLocationPermission() || !checkBackgroundLocationPermission()) {
// toast("显示权限始终允许弹窗")
if (allowAllTimeDialog == null) {
allowAllTimeDialog =
showLocationAllowAllTimeDialog(
setAction = {
requestLocationAllowAllTime(launcher, jumpOutAction = {}, permissionAllowAction = {})
},
dismissAction = {
allowAllTimeDialog = null
})
}
} else {
// toast("不显示权限始终允许弹窗")
allowAllTimeDialog?.dismiss()
allowAllTimeDialog = null
}
}
override fun initListener() { override fun initListener() {
super.initListener() super.initListener()
if (isLanguageRecreate(MyApplication.mainLanguage)) { if (isLanguageRecreate(MyApplication.mainLanguage)) {
...@@ -114,27 +162,14 @@ class MainActivity : BaseActivity<ActivityMainBinding>(), OnMapReadyCallback { ...@@ -114,27 +162,14 @@ class MainActivity : BaseActivity<ActivityMainBinding>(), OnMapReadyCallback {
startActivity(Intent(this, SettingActivity::class.java)) startActivity(Intent(this, SettingActivity::class.java))
} }
binding.tvTittle.setOnClickListener { binding.tvTittle.setOnClickListener {
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
MsgMgr.sendNotification(this, ConstConfig.ACTION_SHARE_LOCATION)
} }
} }
} }
override fun onResume() {
super.onResume()
val isRecreate = updateAppLanguage(MyApplication.mainLanguage, TAG) {
MyApplication.mainLanguage = it
}
if (isRecreate) {
return
}
mainPresenter.requestLocationUpdates()
mainPresenter.startLocationJob(lifecycleScope)
isRunning = true
}
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
if (isRunning) { if (isRunning) {
......
...@@ -6,6 +6,7 @@ import android.location.Location ...@@ -6,6 +6,7 @@ import android.location.Location
import android.os.Looper import android.os.Looper
import androidx.lifecycle.LifecycleCoroutineScope import androidx.lifecycle.LifecycleCoroutineScope
import com.base.locationsharewhite.map.MapUtils.getLatLngByLocationManager import com.base.locationsharewhite.map.MapUtils.getLatLngByLocationManager
import com.base.locationsharewhite.utils.LogEx
import com.google.android.gms.location.FusedLocationProviderClient import com.google.android.gms.location.FusedLocationProviderClient
import com.google.android.gms.location.LocationCallback import com.google.android.gms.location.LocationCallback
import com.google.android.gms.location.LocationRequest import com.google.android.gms.location.LocationRequest
...@@ -23,6 +24,8 @@ class MainPresenter( ...@@ -23,6 +24,8 @@ class MainPresenter(
val activity: Activity val activity: Activity
) { ) {
private val TAG = "MainPresenter"
//google的地理位置服务 //google的地理位置服务
private var fusedLocationClient: FusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(activity) private var fusedLocationClient: FusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(activity)
private var googleLocation: LatLng? = null private var googleLocation: LatLng? = null
...@@ -31,9 +34,11 @@ class MainPresenter( ...@@ -31,9 +34,11 @@ class MainPresenter(
private fun getGoogleServiceLocation() { private fun getGoogleServiceLocation() {
fusedLocationClient.lastLocation fusedLocationClient.lastLocation
.addOnSuccessListener { location: Location? -> .addOnSuccessListener { location: Location? ->
LogEx.logDebug(TAG, "getGoogleServiceLocation location=$location")
if (location != null) { if (location != null) {
val latLng = LatLng(location.latitude, location.longitude) val latLng = LatLng(location.latitude, location.longitude)
googleLocation = latLng googleLocation = latLng
LogEx.logDebug(TAG, "getGoogleServiceLocation latLng=$latLng")
} }
} }
} }
...@@ -43,6 +48,7 @@ class MainPresenter( ...@@ -43,6 +48,7 @@ class MainPresenter(
*/ */
private fun getMyLocation(): LatLng? { private fun getMyLocation(): LatLng? {
var latLng = activity.getLatLngByLocationManager() var latLng = activity.getLatLngByLocationManager()
LogEx.logDebug(TAG, "getMyLocation latLng=$latLng")
if (latLng == null) { if (latLng == null) {
latLng = googleLocation latLng = googleLocation
} }
......
package com.base.locationsharewhite.ui.views
import android.app.AlertDialog
import android.content.Context
import android.view.Gravity
import android.view.LayoutInflater
import android.widget.LinearLayout
import com.base.locationsharewhite.R
import com.base.locationsharewhite.databinding.DialogAllowAllTimeLocationBinding
object LocationPermissionDialog {
fun Context.showLocationAllowAllTimeDialog(
setAction: (() -> Unit)? = null,
dismissAction: (() -> Unit)? = null
): AlertDialog {
val dialog = AlertDialog.Builder(this).create()
val binding = DialogAllowAllTimeLocationBinding.inflate(LayoutInflater.from(this))
dialog.setView(binding.root)
dialog.setCanceledOnTouchOutside(true)
dialog.show()
val params = dialog.window?.attributes
params?.width = resources.getDimensionPixelOffset(R.dimen.dp_345)
params?.height = LinearLayout.LayoutParams.WRAP_CONTENT
params?.gravity = Gravity.CENTER
dialog.window?.attributes = params
dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
binding.flClose.setOnClickListener {
dialog.dismiss()
}
binding.tvSettings.setOnClickListener {
dialog.dismiss()
setAction?.invoke()
}
dialog.setOnDismissListener {
dismissAction?.invoke()
}
return dialog
}
}
\ No newline at end of file
package com.base.locationsharewhite.utils
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.provider.Settings
object IntentUtils {
fun intentAppDetailsSettings(context: Context): Intent {
val intent: Intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
val uri = Uri.fromParts("package", context.packageName, null)
intent.setData(uri)
return intent
}
fun intentLocationSetting(): Intent {
val intent: Intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
return intent
}
}
\ No newline at end of file
package com.base.locationsharewhite.utils package com.base.locationsharewhite.utils
import android.Manifest import android.Manifest
import android.app.Activity
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
...@@ -9,6 +10,10 @@ import android.os.Build ...@@ -9,6 +10,10 @@ import android.os.Build
import android.os.Environment import android.os.Environment
import android.provider.Settings import android.provider.Settings
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import com.base.locationsharewhite.utils.IntentUtils.intentAppDetailsSettings
import com.base.locationsharewhite.utils.PermissionUtils.checkBackgroundLocationPermissionDeniedByUser
import com.base.locationsharewhite.utils.PermissionUtils.checkLocationPermissionDeniedByUser
import com.base.locationsharewhite.utils.ToastUtils.toast
object PermissionUtils { object PermissionUtils {
...@@ -38,6 +43,33 @@ object PermissionUtils { ...@@ -38,6 +43,33 @@ object PermissionUtils {
return fineLocationPermission == PackageManager.PERMISSION_GRANTED && accessCoarsePermission == PackageManager.PERMISSION_GRANTED; return fineLocationPermission == PackageManager.PERMISSION_GRANTED && accessCoarsePermission == PackageManager.PERMISSION_GRANTED;
} }
fun Activity.checkLocationPermissionDeniedByUser(): Boolean {
val deniedByUser1 =
!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)
val deniedByUser2 =
!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_COARSE_LOCATION)
LogEx.logDebug("checkLocationPermissionDeniedByUser", "accessCoarsePermission=$deniedByUser1")
LogEx.logDebug("checkLocationPermissionDeniedByUser", "fineLocationPermission=$deniedByUser2")
return deniedByUser1 && deniedByUser2
}
fun Context.checkBackgroundLocationPermission(): Boolean {
return ActivityCompat.checkSelfPermission(
this, Manifest.permission.ACCESS_BACKGROUND_LOCATION
) == PackageManager.PERMISSION_GRANTED
}
fun Activity.checkBackgroundLocationPermissionDeniedByUser(): Boolean {
val deniedByUser1 =
!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_BACKGROUND_LOCATION)
return deniedByUser1
}
fun Context.requestStoragePermission( fun Context.requestStoragePermission(
launcher: ActivityLauncher, launcher: ActivityLauncher,
jumpAction: (() -> Unit)? = null, jumpAction: (() -> Unit)? = null,
...@@ -60,4 +92,54 @@ object PermissionUtils { ...@@ -60,4 +92,54 @@ object PermissionUtils {
} }
} }
fun Activity.requestLocationAllowAllTime(
launcher: ActivityLauncher,
jumpOutAction: (() -> Unit)? = null,//跳转到设置
permissionAllowAction: (() -> Unit)? = null//权限同意
) {
val TAG = "requestLocationAllowAllTime"
launcher.launch(
arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
)
) { map ->
val result = map.values.all { it }
LogEx.logDebug(TAG, "定位权限回调 result=$result")
if (result) {
//跳转到后台位置设置
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
launcher.launch(arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION)) { map ->
val backLocationResult = map.values.all { it }
LogEx.logDebug(TAG, "后台位置权限回调 backLocationResult=$backLocationResult")
if (backLocationResult) {
// toast("权限请求完毕")
permissionAllowAction?.invoke()
} else {
val userBackLocationDeny = this.checkBackgroundLocationPermissionDeniedByUser()
LogEx.logDebug(TAG, "userBackLocationDeny userBackLocationDeny=$userBackLocationDeny 跳转设置")
if (userBackLocationDeny) {
jumpOutAction?.invoke()
launcher.launch(intentAppDetailsSettings(this))
}
}
}
} else {
permissionAllowAction?.invoke()
// toast("权限请求完毕")
}
} else {
val userDeny = checkLocationPermissionDeniedByUser()
LogEx.logDebug(TAG, "userDeny userDeny=$userDeny 跳转设置")
if (userDeny) {
jumpOutAction?.invoke()
launcher.launch(intentAppDetailsSettings(this))
}
}
}
}
} }
\ No newline at end of file
...@@ -53,6 +53,17 @@ ...@@ -53,6 +53,17 @@
app:layout_constraintTop_toBottomOf="@id/iv_change_map_type" app:layout_constraintTop_toBottomOf="@id/iv_change_map_type"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
<ImageView
android:id="@+id/iv_permission"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginEnd="14dp"
android:src="@mipmap/tishi"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/iv_location"
tools:ignore="ContentDescription" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<FrameLayout <FrameLayout
...@@ -105,7 +116,7 @@ ...@@ -105,7 +116,7 @@
app:layout_constraintBottom_toBottomOf="@id/tv_friend" app:layout_constraintBottom_toBottomOf="@id/tv_friend"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/tv_friend" app:layout_constraintTop_toTopOf="@id/tv_friend"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription,ImageContrastCheck" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
......
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="345dp"
android:layout_height="wrap_content"
android:background="@drawable/bg_ffffff_15"
android:orientation="vertical">
<FrameLayout
android:id="@+id/fl_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="6dp"
android:padding="15dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/guanbi"
tools:ignore="ContentDescription" />
</FrameLayout>
<ImageView
android:id="@+id/iv_tishi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="58dp"
android:src="@mipmap/tishi_permission"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/tv_tip"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="36dp"
android:layout_marginTop="27dp"
android:gravity="center_horizontal"
android:text="@string/allow_all_time_tip"
android:textColor="#001725"
android:textSize="20sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/iv_tishi" />
<LinearLayout
android:id="@+id/ll_step"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:orientation="vertical"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_tip">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/allow_all_time_step_1"
android:textColor="#81888D"
android:textSize="15sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/allow_all_time_step_2"
android:textColor="#81888D"
android:textSize="15sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/allow_all_time_step_3"
android:textColor="#81888D"
android:textSize="15sp" />
</LinearLayout>
<androidx.cardview.widget.CardView
android:id="@+id/cardview"
android:layout_width="238dp"
android:layout_height="64dp"
android:layout_marginTop="50dp"
app:cardBackgroundColor="@color/white"
app:cardCornerRadius="10dp"
app:cardElevation="5dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ll_step">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:ignore="UseCompoundDrawables">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="22dp"
android:src="@mipmap/yuan_permission"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="16dp"
android:text="@string/allow_all_the_time"
android:textColor="#001725"
android:textSize="18sp" />
</LinearLayout>
</androidx.cardview.widget.CardView>
<TextView
android:id="@+id/tv_settings"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginHorizontal="15dp"
android:layout_marginTop="34dp"
android:layout_marginBottom="27dp"
android:background="@drawable/bg_03b988_10"
android:gravity="center"
android:text="@string/open_settings"
android:textColor="@color/white"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/cardview" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
...@@ -24,4 +24,5 @@ ...@@ -24,4 +24,5 @@
<dimen name="dp_225">225dp</dimen> <dimen name="dp_225">225dp</dimen>
<dimen name="dp_235">235dp</dimen> <dimen name="dp_235">235dp</dimen>
<dimen name="dp_146">146dp</dimen> <dimen name="dp_146">146dp</dimen>
<dimen name="dp_345">345dp</dimen>
</resources> </resources>
\ No newline at end of file
...@@ -65,4 +65,11 @@ ...@@ -65,4 +65,11 @@
<string name="location_sharing_not_enabled_yet">Location sharing not enabled yet</string> <string name="location_sharing_not_enabled_yet">Location sharing not enabled yet</string>
<string name="copy_my_code_to_a_friend_to_view_his_her_location">Copy my code to a friend to view his/her location!</string> <string name="copy_my_code_to_a_friend_to_view_his_her_location">Copy my code to a friend to view his/her location!</string>
<string name="open">Open</string> <string name="open">Open</string>
<string name="sort_by">Sort by</string>
<string name="allow_all_time_tip">You\'ll need to set \"Location\"\ to \"Allow all the time \" in settings. If not, this app will not work correctly.</string>
<string name="allow_all_time_step_1">1. Click the below \"Open Settings\"</string>
<string name="allow_all_time_step_2">2.Click "Permissions" and then \"Location\"</string>
<string name="allow_all_time_step_3">3. Set to Allow all the time</string>
<string name="allow_all_the_time">Allow all the time</string>
<string name="open_settings">OPEN SETTINGS</string>
</resources> </resources>
\ 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