Since marshmallow update Bluetooth discovery using BluetoothAdapter.getDefaultAdapter().startDiscovery(); is broken

前端 未结 3 635
面向向阳花
面向向阳花 2020-12-03 21:26

I have an app using bluetooth and connecting to devices, can\'f find any devices using BluetoothAdapter.getDefaultAdapter().startDiscovery(); It worked fine just before disc

3条回答
  •  再見小時候
    2020-12-03 21:53

    From API level 23, location access permission (ACCESS_FINE_LOCATION or ACCESS_COARSE_LOCATION ) is also needed for bluetooth discovery.

    https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-hardware-id

    And just adding permission into manifest file is not sufficient as the permission belongs to "dangerous" protection level. User consent is needed to request the permission at runtime.

    Added permission into AndroidManifest.xml:

    
    
    
    
    

    Request for ACCESS_FINE_LOCATION or ACCESS_COARSE_LOCATION at run time:

    private void accessLocationPermission() {
        int accessCoarseLocation = checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION);
        int accessFineLocation   = checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION);
    
        List listRequestPermission = new ArrayList();
    
        if (accessCoarseLocation != PackageManager.PERMISSION_GRANTED) {
            listRequestPermission.add(android.Manifest.permission.ACCESS_COARSE_LOCATION);
        }
        if (accessFineLocation != PackageManager.PERMISSION_GRANTED) {
            listRequestPermission.add(android.Manifest.permission.ACCESS_FINE_LOCATION);
        }
    
        if (!listRequestPermission.isEmpty()) {
            String[] strRequestPermission = listRequestPermission.toArray(new String[listRequestPermission.size()]);
            requestPermissions(strRequestPermission, REQUEST_CODE_LOC);
        }
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case REQUEST_CODE_LOC:
                if (grantResults.length > 0) {
                    for (int gr : grantResults) {
                        // Check if request is granted or not
                        if (gr != PackageManager.PERMISSION_GRANTED) {
                            return;
                        }
                    }
    
                    //TODO - Add your code here to start Discovery
    
                }
                break;
            default:
                return;
        }
    }
    

    More details about permission: https://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/en

提交回复
热议问题