Google Drive API реализация Xamarin для Android

xamarin google-drive-api xamarin.android

4306 просмотра

1 ответ

49 Репутация автора

Наше приложение должно иметь функцию сохранения файлов приложения на Google Drive. Конечно, используя локально настроенную учетную запись.

Из Android API я попытался выяснить кое-что. Но Android API с реализацией Xamarin кажется мне очень сложным.

Я установил Сервисы Google Play - Drive от Xamarin Components, но в списке нет примеров, из которых мы могли бы ссылаться на поток и функциональность.

Автор: UnableToGoogle Источник Размещён: 18.07.2016 08:59

Ответы (1)


3 плюса

59248 Репутация автора

Решение

Основные шаги (см. Ссылку ниже для более подробной информации):

  • Создать GoogleApiClientс Drive API и Scope

  • Попробуйте подключиться (войти) GoogleApiClient

  • При первой попытке подключения произойдет сбой, поскольку пользователь не выбрал учетную запись Google, которую следует использовать.

    • Используйте StartResolutionForResultдля обработки этого условия
  • Когда GoogleApiClientподключен

    • Запросить содержимое диска ( DriveContentsResult) для записи содержимого файла.

    • Когда результат будет получен, запишите данные в содержимое диска.

    • Установите метаданные для файла

    • Создайте файл на основе диска с содержимым диска

Примечание . В этом примере предполагается, что на вашем устройстве / эмуляторе установлен Google Диск, и вы зарегистрировали свое приложение в консоли API разработчика Google с включенным Google Drive API.

Пример C #:

[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();
        }
    }
}

Ссылка: https://developers.google.com/drive/android/create-file

Автор: SushiHangover Размещён: 18.07.2016 10:39
Вопросы из категории :
32x32