Я пытаюсь подключить Polar H10 к моему приложению xamarin для Android с помощью Ble. Клиент https://developers.google.com/fit/android/ble-sensors Я искал в Интернете любые образцы для xamarin android, но тщетно. У кого-нибудь есть идеи?
Я инициализирую API-клиент нажатием кнопки во фрагменте; Поэтому, когда ScanButton нажат, я вызываю функцию ScanButton_Click и инициализирую клиент Google Api, который успешно подключается.
Я не уверен, как получить результаты, когда я начинаю сканировать устройства ble. На данный момент я считаю, что просто печатаю список, который не выглядит как список в консоли, но выглядит как «com.google.android.gms.internal.zzbsz@8bb6de0
», когда выполняется строка Console.WriteLine(list);
.
Мой клиентский код GoogleAPI:
private void ScanButton_Click(object sender, EventArgs e)
{
InitializeGoogleAPIClient();
mClient.Connect();
}
private void InitializeGoogleAPIClient()
{
var clientConnectionCallback = new ClientConnectionCallback();
mClient = new GoogleApiClient.Builder(mActivity)
.AddApi(FitnessClass.BLE_API)
.AddApi(FitnessClass.SENSORS_API)
.AddApi(FitnessClass.RECORDING_API)
.AddScope(new Scope(Scopes.FitnessActivityRead))
.AddScope(new Scope(Scopes.FitnessBodyReadWrite))
.AddScope(new Scope(Scopes.FitnessLocationReadWrite))
.AddConnectionCallbacks(clientConnectionCallback)
.AddOnConnectionFailedListener((ConnectionResult result) => {
Console.WriteLine("Connection failed. Cause: " + result);
if (!result.HasResolution)
{
// Show the localized error dialog
GooglePlayServicesUtil.GetErrorDialog(result.ErrorCode, mActivity, 0).Show();
return;
}
if (!authInProgress)
{
try
{
Console.WriteLine("Attempting to resolve failed connection");
authInProgress = true;
result.StartResolutionForResult(mActivity, REQUEST_OAUTH);
}
catch (IntentSender.SendIntentException e)
{
Console.WriteLine("Exception while starting resolution activity", e);
}
}
}).Build();
//OnConnected? start calling Fit APIs
clientConnectionCallback.OnConnectedImpl = () => InvokeBLEApi();
}
private async void InvokeBLEApi()
{
var bleScanCallback = new BleConnectionCallBack(mClient);
bleScanCallback.OnDevice = (device) => ClaimBle(device);
StartBleScanRequest request = new StartBleScanRequest.Builder()
.SetDataTypes(Android.Gms.Fitness.Data.DataType.TypeHeartRateBpm)
.SetBleScanCallback(bleScanCallback)
.Build();
PendingResult pendingResult = FitnessClass.BleApi.StartBleScan(mClient, request);
}
private void ClaimBle(BleDevice device)
{
PendingResult pending_result = FitnessClass.BleApi.ClaimBleDevice(mClient, device);
PendingResult list = FitnessClass.BleApi.ListClaimedBleDevices(mClient);
Console.WriteLine(list);
}
Классы, которые я использовал выше:
class BleConnectionCallBack : BleScanCallback
{
private GoogleApiClient mClient;
private BleDevice mdevice;
public Action<BleDevice> OnDevice { get; set; }
public BleConnectionCallBack(GoogleApiClient Client)
{
mClient = Client;
}
public override void OnDeviceFound(BleDevice device)
{
var hr_sensor = device.Name;
OnDevice(device);
//PendingResult pendingResult = FitnessClass.BleApi.ClaimBleDevice(mClient, device);
}
public override void OnScanStopped()
{
}
}
class ClientConnectionCallback : Java.Lang.Object, GoogleApiClient.IConnectionCallbacks
{
public Action OnConnectedImpl { get; set; }
public void OnConnected(Bundle connectionHint)
{
//once we get the callback we can start calling the Fit APIs
Console.WriteLine("Connected!!!");
OnConnectedImpl();
}
public void OnConnectionSuspended(int cause)
{
if (cause == GoogleApiClient.ConnectionCallbacksConsts.CauseNetworkLost)
{
Console.WriteLine("Connection lost. Cause: Network Lost.");
}
else if (cause == GoogleApiClient.ConnectionCallbacksConsts.CauseServiceDisconnected)
{
Console.WriteLine("Connection lost. Reason: Service Disconnected");
}
}
}