SmartBand Reader App在不知不觉中崩溃

时间:2017-09-18 12:42:40

标签: c# android xamarin google-fit sony-smartwatch

这是一个移动应用程序,用于从索尼的SmartBand2获取数据,然后将其上传到网站以显示每个人的信息。

然而,到目前为止尝试测试应用程序时,它崩溃了,我不确定为什么。它正确地请求用户访问,但后来我从Visual Studio得到一个异常未处理的消息,但它没有说什么。这是代码。

 using System;

using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;

using Android.Gms.Common.Apis;
using Android.Gms.Fitness.Request;
using Android.Gms.Common;
using Android.Gms.Fitness;
using Android.Gms.Fitness.Data;
using Android.Gms.Fitness.Result;
using Android.Util;
using Android.Content;
using System.Threading.Tasks;
using Java.Util.Concurrent;

    namespace AndroidReader
    {
        [Activity(Label = "AndroidReader", MainLauncher = true)]
        public class MainActivity : Activity
        {
            public const string TAG = "StepReader";

            const int REQUEST_OAUTH = 1;

            const string AUTH_PENDING = "auth_state_pending";
            bool authInProgress;

            GoogleApiClient mClient;

            IOnDataPointListener mListener;

            protected override void OnCreate(Bundle bundleInstance)
            {
                base.OnCreate(bundleInstance);
                SetContentView(Resource.Layout.Main);

                if (bundleInstance != null)
                {
                    authInProgress = bundleInstance.GetBoolean(AUTH_PENDING);
                }

                BuildFitnessClient();
            }
            void BuildFitnessClient()
            {

                var clientConnectionCallback = new ClientConnectionCallback();
                clientConnectionCallback.OnConnectedImpl = async () => await FindFitnessDataSources();
                mClient = new GoogleApiClient.Builder(this)
                    .AddApi(FitnessClass.SENSORS_API)
                    .AddScope(new Scope(Scopes.FitnessLocationRead))
                    .AddConnectionCallbacks(clientConnectionCallback)
                    .AddOnConnectionFailedListener((ConnectionResult result) =>
                    {
                        Log.Info(TAG, "Connection failed. Cause: " + result);
                        if (!result.HasResolution)
                        {
                            // Show the localized error dialog
                            GoogleApiAvailability api = GoogleApiAvailability.Instance;
                            int resultCode = api.IsGooglePlayServicesAvailable(this);
                            return;
                        }
                        if (!authInProgress)
                        {
                            try
                            {
                                Log.Info(TAG, "Attempting to resolve failed connection");
                                authInProgress = true;
                                result.StartResolutionForResult(this, REQUEST_OAUTH);
                            }
                            catch (IntentSender.SendIntentException e)
                            {
                                Log.Error(TAG, "Exception while starting resolution activity", e);
                            }
                        }
                    }).Build();
            }


            class ClientConnectionCallback : Java.Lang.Object, GoogleApiClient.IConnectionCallbacks
            {
                public Action OnConnectedImpl { get; set; }

                public void OnConnected(Bundle connectionHint)
                {
                    Log.Info(TAG, "Connected!!!");

                    OnConnectedImpl();
                }

                public void OnConnectionSuspended(int cause)
                {
                    if (cause == GoogleApiClient.ConnectionCallbacks.CauseNetworkLost)
                    {
                        Log.Info(TAG, "Connection lost.  Cause: Network Lost.");
                    }
                    else if (cause == GoogleApiClient.ConnectionCallbacks.CauseServiceDisconnected)
                    {
                        Log.Info(TAG, "Connection lost.  Reason: Service Disconnected");
                    }
                }
            }

            protected override void OnStart()
            {
                base.OnStart();
                Log.Info(TAG, "Connecting...");
                mClient.Connect();
            }

            protected override void OnStop()
            {
                base.OnStop();
                if (mClient.IsConnected)
                {
                    mClient.Disconnect();
                }
            }

            protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
            {
                if (requestCode == REQUEST_OAUTH)
                {
                    authInProgress = false;
                    if (resultCode == Result.Ok)
                    {
                        if (!mClient.IsConnecting && !mClient.IsConnected)
                        {
                            mClient.Connect();
                        }
                    }
                }
            }

            protected override void OnSaveInstanceState(Bundle outState)
            {
                base.OnSaveInstanceState(outState);
                outState.PutBoolean(AUTH_PENDING, authInProgress);
            }

            async Task FindFitnessDataSources()
            {
                var dataSourcesResult = await FitnessClass.SensorsApi.FindDataSourcesAsync(mClient, new DataSourcesRequest.Builder()
                    .SetDataTypes(Android.Gms.Fitness.Data.DataType.TypeLocationSample)
                    .SetDataSourceTypes(DataSource.TypeRaw)
                    .Build());

                Log.Info(TAG, "Result: " + dataSourcesResult.Status);
                foreach (DataSource dataSource in dataSourcesResult.DataSources)
                {
                    Log.Info(TAG, "Data source found: " + dataSource);
                    Log.Info(TAG, "Data Source type: " + dataSource.DataType.Name);

                    //Let's register a listener to receive Activity data!
                    if (dataSource.DataType == Android.Gms.Fitness.Data.DataType.TypeStepCountDelta && mListener == null)
                    {
                        Log.Info(TAG, "Data source for LOCATION_SAMPLE found!  Registering.");
                        await RegisterFitnessDataListener(dataSource, Android.Gms.Fitness.Data.DataType.TypeStepCountDelta);
                    }
                }
            }

            async Task RegisterFitnessDataListener(DataSource dataSource, Android.Gms.Fitness.Data.DataType dataType)
            {
                // [START register_data_listener]
                mListener = new OnDataPointListener();
                var status = await FitnessClass.SensorsApi.AddAsync(mClient, new SensorRequest.Builder()
                    .SetDataSource(dataSource) // Optional but recommended for custom data sets.
                    .SetDataType(dataType) // Can't be omitted.
                    .SetSamplingRate(10, TimeUnit.Seconds)
                    .Build(),
                    mListener);
                if (status.IsSuccess)
                {
                    Log.Info(TAG, "Listener registered!");
                }
                else
                {
                    Log.Info(TAG, "Listener not registered.");
                }
            }

            class OnDataPointListener : Java.Lang.Object, IOnDataPointListener
            {
                public void OnDataPoint(DataPoint dataPoint)
                {
                    foreach (var field in dataPoint.DataType.Fields)
                    {
                        Value val = dataPoint.GetValue(field);
                        Log.Info(TAG, "Detected DataPoint field: " + field.Name);
                        Log.Info(TAG, "Detected DataPoint value: " + val);

                    }
                }

            }

            async Task UnregisterFitnessDataListener()
            {
                if (mListener == null)
                {
                    return;
                }

                var status = await FitnessClass.SensorsApi.RemoveAsync(mClient, mListener);

                if (status.IsSuccess)
                {
                    Log.Info(TAG, "Listener was removed!");
                }
                else
                {
                    Log.Info(TAG, "Listener was not removed.");
                }
            }
        }
    }

0 个答案:

没有答案