微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不调用 BLE onRequestPermissionResult 回调

如何解决不调用 BLE onRequestPermissionResult 回调

package com.example.coca_bt

import android.Manifest
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothManager
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import android.os.Looper
import android.util.Log
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.google.android.gms.location.*

@RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
class DeviceScanActivity : AppCompatActivity() {
    //Getting BluetoothAdapter from BluetoothManager
    private fun PackageManager.missingSystemFeature(name: String): Boolean = !hasSystemFeature(name)
    private var fusedLocationProvider: FusedLocationProviderClient? = null
    private val locationRequest: LocationRequest =  LocationRequest.create().apply {
        interval = 30
        fastestInterval = 10
        priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY
        maxWaitTime= 60
    }

    private var locationCallback: LocationCallback = object : LocationCallback() {
        override fun onLocationResult(locationResult: LocationResult) {
            val locationList = locationResult.locations
            if (locationList.isNotEmpty()) {
                val location = locationList.last()
                Toast.makeText(this@DeviceScanActivity,"Got Location: " + location.toString(),Toast.LENGTH_LONG).show()
            }
        }
    }

    private val bluetoothAdapter: BluetoothAdapter? by lazy(LazyThreadSafetyMode.NONE) {
        val bluetoothManager = getSystemService(BLUetoOTH_SERVICE) as BluetoothManager
        bluetoothManager.adapter
    }

    companion object {
        val PERMISSIONS = arrayOf(
            Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION
        )
        const val TAG: String = "Log"
        private const val MY_PERMISSIONS_REQUEST_LOCATION = 1

    }

    private val BluetoothAdapter.isdisabled: Boolean get() = !isEnabled
    private val REQUEST_ENABLE_BT = 1000


    //On memory
    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d(TAG,"DeviceScanActivity()")

        fusedLocationProvider = LocationServices.getFusedLocationProviderClient(this)
        checkLocationPermission()

        packageManager.takeIf {
            it.missingSystemFeature(PackageManager.FEATURE_BLUetoOTH_LE)
        }?.also {
            Toast.makeText(this,"R.string.ble_not_supported",Toast.LENGTH_SHORT).show()
            finish()
        }
        bluetoothAdapter?.takeIf { it.isdisabled }?.apply {
            val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
            startActivityForResult(enableBtIntent,REQUEST_ENABLE_BT)
        }
        finish()
    }

    override fun onResume() {
        super.onResume()
        if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)
            == PackageManager.PERMISSION_GRANTED) {

            fusedLocationProvider?.requestLocationUpdates(locationRequest,locationCallback,Looper.getMainLooper())
        }
    }

    override fun onPause() {
        super.onPause()
        if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)
            == PackageManager.PERMISSION_GRANTED) {

            fusedLocationProvider?.removeLocationUpdates(locationCallback)
        }
    }

    private fun checkLocationPermission() {
        if (ActivityCompat.checkSelfPermission(
                this,Manifest.permission.ACCESS_FINE_LOCATION
            ) != PackageManager.PERMISSION_GRANTED
        ) {
            
            if (ActivityCompat.shouldShowRequestPermissionRationale(
                    this,Manifest.permission.ACCESS_FINE_LOCATION
                )
            ) {
                
                AlertDialog.Builder(this)
                    .setTitle("Location Permission Needed")
                    .setMessage("This app needs the Location permission,please accept to use location functionality")
                    .setPositiveButton(
                        "OK"
                    ) { _,_ ->
                        //Prompt the user once explanation has been shown
                        requestLocationPermission()
                    }
                    .create()
                    .show()
            } else {
                
                requestLocationPermission()
            }
        }
    }

    private fun requestLocationPermission() {
        Log.d(TAG,"requestLocationPermission()")

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            ActivityCompat.requestPermissions(
                this,PERMISSIONS,MY_PERMISSIONS_REQUEST_LOCATION
            )

        } else {
            ActivityCompat.requestPermissions(
                this,arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),MY_PERMISSIONS_REQUEST_LOCATION
            )
        }
    }
    override fun onRequestPermissionsResult(
        requestCode: Int,permissions: Array<String>,grantResults: IntArray
    ) {
        Log.d(TAG,"permissionresult()")
        super.onRequestPermissionsResult(requestCode,permissions,grantResults)
        when (requestCode) {
            MY_PERMISSIONS_REQUEST_LOCATION -> {
                Log.d(TAG,"result()")
                if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    
                    if (ContextCompat.checkSelfPermission(
                            this,Manifest.permission.ACCESS_FINE_LOCATION
                        ) == PackageManager.PERMISSION_GRANTED
                    ) {
                        fusedLocationProvider?.requestLocationUpdates(
                            locationRequest,Looper.getMainLooper()
                        )
                    }

                } else {

                   
                    Toast.makeText(this,"permission denied",Toast.LENGTH_LONG).show()
                }
                return
            }
        }
    }

}

这是我获得 BLE 广告/扫描位置许可的代码。当我尝试运行该应用程序时,它会显示一个请求权限的弹出窗口,但是在我选择允许后,它看起来并没有真正获得权限。我认为问题出在回调上,因为它在 LogCat 上没有显示任何“permissionresult()”。我的请求许可有什么问题?

这是清单中的权限。

    <uses-permission android:name="android.permission.BLUetoOTH" />
    <uses-permission android:name="android.permission.BLUetoOTH_ADMIN" />
    <uses-permission android:name= "android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。