Android.Gms.Drive Скачать файл Assistance - PullRequest
0 голосов
/ 15 сентября 2018

Я создаю приложение на Android (потенциально расширяющееся до IOS, но в первую очередь на Android), которое в качестве функции загружает сохраненные пользователем данные для приложения в Google Drive и может также загрузить его.

Я использую API Android.Gms.Drive для достижения этой цели, как это предлагается на странице Google dev.Я дошел до того, что пользователь может входить и выходить из системы, а также загружать сохраненный файл, но я не могу понять, как загрузить файл.

Я могу найти метаданные для файла, который хочуДля загрузки я не уверен, как использовать это, чтобы открыть файл.

Вот код, который я использовал для подключения, он собран из некоторых примеров, поэтому я не уверен, правильно ли я это сделал

namespace TestApp.Droid
{
    [Activity(Label = "TestApp", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    const string TAG = "MainActivity";

    const int RC_SIGN_IN = 9001;
    GoogleApiClient mGoogleApiClient;
    protected override void OnCreate(Bundle bundle)
    {

       base.OnCreate(bundle);
        // [START configure_signin]
        // Configure sign-in to request the user's ID, email address, and basic
        // profile. ID and basic profile are included in DEFAULT_SIGN_IN.
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DefaultSignIn)    
            .RequestEmail()
            .RequestScopes(new Scope(Constants.scopes))
            .RequestScopes(DriveClass.ScopeFile)
            .RequestScopes(DriveClass.ScopeAppfolder)
             .Build();

        // [END configure_signin]

        // [START build_client]
        // Build a GoogleApiClient with access to the Google Sign-In API and the
        // options specified by gso.
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .AddApi(Auth.GOOGLE_SIGN_IN_API,gso)
                .AddApi(DriveClass.API)
              .AddOnConnectionFailedListener(OnConnectionFailed)
                .Build();
        if (!mGoogleApiClient.IsConnected) { 
            mGoogleApiClient.Connect(GoogleApiClient.SignInModeOptional);
     }
    // [END build_client]
    global::Xamarin.Forms.Forms.Init(this, bundle);
        LoadApplication(new App());
    }
    protected override void OnStart()
    {
        base.OnStart();

       var opr = Auth.GoogleSignInApi.SilentSignIn(mGoogleApiClient);
        if (opr.IsDone)
        {

            var result = opr.Get() as GoogleSignInResult;
            HandleSignInResult(result);
        }
    }

    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);
        if (requestCode == RC_SIGN_IN)
        {
            var result = Auth.GoogleSignInApi.GetSignInResultFromIntent(data);
            HandleSignInResult(result);
        }
    }

    public void HandleSignInResult(GoogleSignInResult result)
    {
        if (result.IsSuccess)
        {
            // Signed in successfully, show authenticated UI.
            var acct = result.SignInAccount;
            if (!mGoogleApiClient.IsConnected)
            {
                mGoogleApiClient.Connect(GoogleApiClient.SignInModeOptional);
            }
        }
        else {
            GoogleInfo.GetInstance().Result = result.Status.ToString(); ;
        }
    }

    public void SignIn()
    {
        var signInIntent = Auth.GoogleSignInApi.GetSignInIntent(mGoogleApiClient);
        StartActivityForResult(signInIntent, RC_SIGN_IN);
    }

    public void SignOut()
    {
       Auth.GoogleSignInApi.SignOut(mGoogleApiClient);
    }

    void RevokeAccess()
    {
        Auth.GoogleSignInApi.RevokeAccess(mGoogleApiClient);
    }

    protected override void OnStop()
    {
        base.OnStop();
        mGoogleApiClient.Disconnect();
    }
}

}

Это то, что я использовал для получения метаданных

  DriveClass.DriveApi.GetRootFolder(mGoogleApiClient).ListChildrenAsync(mGoogleApiClient);

, который возвращает все данные правильно.

Любая помощь будет оценена,Спасибо заранее

1 Ответ

0 голосов
/ 15 сентября 2018

Не бери в голову, я нашел решение.

        IDriveFile file = DriveClass.DriveApi.GetFile(GoogleInfo.GetInstance().SignInApi, driveID);
        file.GetMetadata(mGoogleApiClient).SetResultCallback(metadataRetrievedCallback());
        Task.Run(() =>
        {

            var driveContentsResult = file.Open(mGoogleApiClient,
                DriveFile.ModeReadOnly, null).Await();

            IDriveContents driveContents = driveContentsResult.JavaCast<IDriveApiDriveContentsResult>().DriveContents;

            Stream inputstream = driveContents.InputStream;

            byte[] buffer = new byte[16 * 1024];
            int read;
            MemoryStream output = new MemoryStream();

            while ((read = inputstream.Read(buffer, 0, buffer.Length)) > 0)
            {
                output.Write(buffer, 0, read);
            }
...