Обнаружение соседних устройств Bluetooth, не показывающих ничего
Я новичок в Xamarin
В качестве задания для начинающих я попросил показать список ближайших активных устройств Bluetooth (только в Android). без использования каких-либо NuGet
пакет (кроме призмы)
Я следовал этому руководству и также искал здесь мои ссылки в моем OnReceive
функция я получаю BluetoothAdapter.ActionDiscoveryStarted
а также BluetoothAdapter.ActionDiscoveryFinished
но не BluetoothDevice.ActionFound
Я запустил новое приложение-шаблон призмы с контейнером dryioc.
Я запускаю приложение на своем телефоне 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 ответ
Из вашего кода вы установили 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;
}
}