Android 需要用户明确批准才能打开蓝牙

Posted

技术标签:

【中文标题】Android 需要用户明确批准才能打开蓝牙【英文标题】:Android need user explicitly give approval to turn on Bluetooth 【发布时间】:2019-12-15 21:11:55 【问题描述】:

我的APP在做室内定位。我们的解决方案是连续扫描 BLE 设备。但是我们遇到了第一个问题。 2-3 小时后,蓝牙 API 无法获得任何扫描结果。因此,我们尝试关闭蓝牙并再次打开以解决此问题。它适用于运行 android 6.0 及更低版本的设备。但是对于Android 7.0及以上,当我们尝试通过调用“BluetoothAdapter.enable()”打开蓝牙时,它总是要求用户对此给予明确的批准,这使得我的APP无法在不涉及用户的情况下在后台运行.

Android 的文档说蓝牙权限不是危险权限,不是吗?为什么需要用户参与才能对此给予批准?

【问题讨论】:

您的文档是什么版本的 Android?有时您可能需要在蓝牙中启用 Fine_access_location 权限。 【参考方案1】:

您至少需要在运行时调用ACCES_COARSE_LOCATION。这个答案可能会对你有所帮助。

Requesting multiple Bluetooth permissions in Android Marshmallow

(我仍然没有足够的积分来添加cmets,所以我将其发布为答案)

【讨论】:

【参考方案2】:

在棉花糖设备之上,您需要在运行时获得用户的许可。

public void onCheckingPermission() 

    if (ActivityCompat.checkSelfPermission(ProfileMakingActivity.this, Manifest.permission.BLUETOOTH) != PackageManager.PERMISSION_GRANTED
    ) 
        //  initQRCodeReaderView();
        //  Utils.log("Camera AllPermission Granted . ");
        requestPermission();

        Log.i("permission", "Requesting  AllPermission");


     else 
        Log.i("permission", "permission Granted");
        getVcardString();

        //   Toast.makeText(getApplicationContext(),"Permission Granted",Toast.LENGTH_SHORT).show();


    

 


    private void requestPermission() 


    if (ActivityCompat.shouldShowRequestPermissionRationale(ProfileMakingActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) 

        Snackbar.make(this.findViewById(android.R.id.content), "All permission are required to use this app",
                Snackbar.LENGTH_INDEFINITE).setAction("OK", new View.OnClickListener() 
            @RequiresApi(api = Build.VERSION_CODES.M)
            @Override
            public void onClick(View view) 
                requestPermissions(new String[]Manifest.permission.BLUETOOTH);
            
        ).show();
     else 
        Snackbar.make(this.findViewById(android.R.id.content), "Requesting contacts permission. Required for this app.",
                Snackbar.LENGTH_SHORT).show();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
            requestPermissions(new String[]Manifest.permission.BLUETOOTH);
        
    



    @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                       @NonNull int[] grantResults) 
    if (requestCode != MY_PERMISSIONS_REQUEST) 
        return;
    

    if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) 
        Snackbar.make(this.findViewById(android.R.id.content), "permission was granted. Now you can all contacts", Snackbar.LENGTH_SHORT).show();
        getVcardString();

     else 
        Snackbar.make(this.findViewById(android.R.id.content), "Need Allow Permisson to access the accounts", Snackbar.LENGTH_SHORT)
                .show();

    



只需调用 onCheckingPermission();在创建中

【讨论】:

以上是关于Android 需要用户明确批准才能打开蓝牙的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在自适应付款明确批准后确认付款

Android 蓝牙开发-打开蓝牙后能不能立即连接固定地址的蓝牙设备??还是需要进行判断啥的?

Android 低功耗蓝牙开发简述

Android 低功耗蓝牙开发简述

Android 低功耗蓝牙开发简述

android 怎么查看蓝牙设备