Google Drive API implementation Xamarin Android

后端 未结 1 1827
Happy的楠姐
Happy的楠姐 2020-12-16 08:42

Our application should have the functionality to save Application files to Google Drive. Of course, using the local configured account.

From Android API i tried to

相关标签:
1条回答
  • 2020-12-16 09:14

    The basic steps (see the link below for full details):

    • Create GoogleApiClient with the Drive API and Scope

    • Try to connect (login) the GoogleApiClient

    • The first time you try to connect it will fail as the user has not selected a Google Account that should be used

      • Use StartResolutionForResult to handle this condition
    • When GoogleApiClient is connected

      • Request a Drive content (DriveContentsResult) to write the file contents to.

      • When the result is obtained, write data into the Drive content.

      • Set the metadata for the file

      • Create the Drive-based file with the Drive content

    Note: This example assumes that you have Google Drive installed on your device/emulator and you have registered your app in Google's Developer API Console with the Google Drive API Enabled.

    C# Example:

    [Activity(Label = "DriveOpen", MainLauncher = true, Icon = "@mipmap/icon")]
    public class MainActivity : Activity, GoogleApiClient.IConnectionCallbacks, IResultCallback, IDriveApiDriveContentsResult
    {
        const string TAG = "GDriveExample";
        const int REQUEST_CODE_RESOLUTION = 3;
    
        GoogleApiClient _googleApiClient;
    
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
    
            SetContentView(Resource.Layout.Main);
    
            Button button = FindViewById<Button>(Resource.Id.myButton);
            button.Click += delegate
            {
                if (_googleApiClient == null)
                {
                    _googleApiClient = new GoogleApiClient.Builder(this)
                      .AddApi(DriveClass.API)
                      .AddScope(DriveClass.ScopeFile)
                      .AddConnectionCallbacks(this)
                      .AddOnConnectionFailedListener(onConnectionFailed)
                      .Build();
                }
                if (!_googleApiClient.IsConnected)
                    _googleApiClient.Connect();
            };
        }
    
        protected void onConnectionFailed(ConnectionResult result)
        {
            Log.Info(TAG, "GoogleApiClient connection failed: " + result);
            if (!result.HasResolution)
            {
                GoogleApiAvailability.Instance.GetErrorDialog(this, result.ErrorCode, 0).Show();
                return;
            }
            try
            {
                result.StartResolutionForResult(this, REQUEST_CODE_RESOLUTION);
            }
            catch (IntentSender.SendIntentException e)
            {
                Log.Error(TAG, "Exception while starting resolution activity", e);
            }
        }
    
        public void OnConnected(Bundle connectionHint)
        {
            Log.Info(TAG, "Client connected.");
            DriveClass.DriveApi.NewDriveContents(_googleApiClient).SetResultCallback(this);
        }
    
        protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
        {
            base.OnActivityResult(requestCode, resultCode, data);
            if (requestCode == REQUEST_CODE_RESOLUTION)
            {
                switch (resultCode)
                {
                    case Result.Ok:
                        _googleApiClient.Connect();
                        break;
                    case Result.Canceled:
                        Log.Error(TAG, "Unable to sign in, is app registered for Drive access in Google Dev Console?");
                        break;
                    case Result.FirstUser:
                        Log.Error(TAG, "Unable to sign in: RESULT_FIRST_USER");
                        break;
                    default:
                        Log.Error(TAG, "Should never be here: " + resultCode);
                        return;
                }
            }
        }
    
        void IResultCallback.OnResult(Java.Lang.Object result)
        {
            var contentResults = (result).JavaCast<IDriveApiDriveContentsResult>();
            if (!contentResults.Status.IsSuccess) // handle the error
                return;
            Task.Run(() =>
            {
                var writer = new OutputStreamWriter(contentResults.DriveContents.OutputStream);
                writer.Write("Stack Overflow");
                writer.Close();
                MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
                       .SetTitle("New Text File")
                       .SetMimeType("text/plain")
                       .Build();
                DriveClass.DriveApi
                          .GetRootFolder(_googleApiClient)
                          .CreateFile(_googleApiClient, changeSet, contentResults.DriveContents);
            });
        }
    
        public void OnConnectionSuspended(int cause)
        {
            throw new NotImplementedException();
        }
    
        public IDriveContents DriveContents
        {
            get
            {
                throw new NotImplementedException();
            }
        }
    
        public Statuses Status
        {
            get
            {
                throw new NotImplementedException();
            }
        }
    }
    

    Ref: https://developers.google.com/drive/android/create-file

    0 讨论(0)
提交回复
热议问题