обнаружение соседних устройств Bluetooth, не показывающих ничего - PullRequest
0 голосов
/ 14 января 2019

Я новичок в Xamarin, в качестве задачи для начинающих я попросил показать список ближайших активных устройств Bluetooth (в только для Android ). без использования пакета NuGet ( кроме Prism )

Я следовал этому руководству и также искал здесь для моих ссылок в моей функции OnReceive я получаю BluetoothAdapter.ActionDiscoveryStarted и BluetoothAdapter.ActionDiscoveryFinished, но не BluetoothDevice.ActionFound

Я запустил новое приложение-шаблон призмы с dryioc container

Я запускаю приложение на своем телефоне OnePlus A6003 (Android 9.0 - API 28), и у меня есть 2 готовых для подключения устройства Bluetooth, одно на моем старом телефоне и на моем ноутбуке (windows 10), и я проверил их оба если они могут подключиться к моему устройству и все работает нормально

в моем AndroidManifest.xml я добавил

  <uses-permission android:name="android.permission.BLUETOOTH" />
  <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

мой класс BroadcastReceiver

public class BluetoothDeviceReceiver : BroadcastReceiver
    {
        public static BluetoothAdapter Adapter => BluetoothAdapter.DefaultAdapter;

        public override void OnReceive(Context context, Intent intent)
        {
            var action = intent.Action;
            // Found a device
            switch (action)
            {
                case BluetoothDevice.ActionFound:
                    // Get the device
                    var device = (BluetoothDevice)intent.GetParcelableExtra(BluetoothDevice.ExtraDevice);

                    // Only update the adapter with items which are not bonded
                    if (device.BondState != Bond.Bonded)
                    {                       
                    }
                    break;
                case BluetoothAdapter.ActionDiscoveryStarted:

                    break;
                case BluetoothAdapter.ActionDiscoveryFinished:

                    break;
                default:
                    break;
            }
        }
    }

и моя основная активность

 protected override void OnCreate(Bundle bundle)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            base.OnCreate(bundle);

            var coarseLocationPermissionGranted =
                 ContextCompat.CheckSelfPermission(this, Manifest.Permission.AccessCoarseLocation);
            var fineLocationPermissionGranted =
                ContextCompat.CheckSelfPermission(this, Manifest.Permission.AccessFineLocation);

            if (coarseLocationPermissionGranted != Permission.Denied ||
                fineLocationPermissionGranted == Permission.Denied)
                ActivityCompat.RequestPermissions(this, LocationPermissions, LocationPermissionsRequestCode);

            // Register for broadcasts when a device is discovered
            _receiver = new BluetoothDeviceReceiver();          

            global::Xamarin.Forms.Forms.Init(this, bundle);
            LoadApplication(new App(new AndroidInitializer()));
        }


        private void RegisterBluetoothReceiver()
        {
            if (_isReceiveredRegistered) return;

            RegisterReceiver(_receiver, new IntentFilter(BluetoothDevice.ActionFound));
            RegisterReceiver(_receiver, new IntentFilter(BluetoothAdapter.ActionDiscoveryStarted));
            RegisterReceiver(_receiver, new IntentFilter(BluetoothAdapter.ActionDiscoveryFinished));
            _isReceiveredRegistered = true;
        }

        private static void StartScanning()
        {
            if (!BluetoothDeviceReceiver.Adapter.IsDiscovering)
                BluetoothDeviceReceiver.Adapter.StartDiscovery();
        }

        protected override void OnResume()
        {
            base.OnResume();

            StartScanning();

            // Register broadcast listeners
            RegisterBluetoothReceiver();
        }

что мне не хватает? перезапуск телефона или других устройств не работает

1 Ответ

0 голосов
/ 15 января 2019

Из вашего кода вы установили permission в AndroidManifest.xml. Возможно, проблема также в разрешении, есть два способа выбора:

Легко , просто нужно установить targetSdkVersion Менее 23.

Два , необходимо добавить Динамически добавлять разрешения, как в OnCreate() метод:

if (Build.VERSION.SdkInt >= Build.VERSION_CODES.M)
            {
                if (this.CheckSelfPermission(Manifest.Permission.AccessCoarseLocation) != Permission.Granted)
                {
                    RequestPermissions(new String[] { Manifest.Permission.AccessCoarseLocation }, 1);
                }
            }

И в запросе сделать то, что вам нужно сделать:

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults)
    {
        base.OnRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode)
        {
            case 1:
                // todo request success  
                break;
            default:
                break;
        }


    }
...