ICloudStorage.GetChildren() никогда не возвращается

Я пытаюсь получить доступ к Google Диску с помощью CloudRail, используя следующие коды.

// Actual string value removed.
private const string GDRIVE_CLIENT_ID = "client_id";
private const string ANDROID_PACKAGE_NAME = "package_name";
private const string CLOUDRAIL_APP_KEY = "app_key";
private readonly string REDIRECT_URL = $"{ANDROID_PACKAGE_NAME}:/oauth2redirect";

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    // Set CloudRail application key.
    CloudRail.AppKey = CLOUDRAIL_APP_KEY;

    // Set our view from the "main" layout resource
    SetContentView(Resource.Layout.Main);

    try
    {
        var googleDrive = new GoogleDrive(this, GDRIVE_CLIENT_ID, "", REDIRECT_URL, "state");
        googleDrive.UseAdvancedAuthentication();
        m_Service = googleDrive;

        Action act = () =>
        {
            var list = m_Service.GetChildren(@"/");
            // The function call never return.
        };
        var thread = new Thread(new ThreadStart(act));
        thread.Start();
    }
    catch (Exception ex)
    {
    }
}

После звонка в ICloudStorage.GetChildren()мои приложения перенаправляются для входа в учетную запись Google. После того, как пользователь вошел в учетную запись Google и дал согласие на приложение, вызов функции никогда не вернется. Не исключение также не пойман.

Что могло пойти не так?

1 ответ

Решение

Я получил ответ от службы поддержки CloudRail и смог решить проблему с их помощью.

Вы должны включить IntentFilter а также LaunchMode в SingleTask в верхней части вашей деятельности. Также нужно поставить OnNewIntent метод, как показано ниже:

[Activity(Label = "Awesome.Android", LaunchMode = Android.Content.PM.LaunchMode.SingleTask)]
[IntentFilter(new[] { Intent.ActionView }, Categories = new[] { Intent.CategoryBrowsable, Intent.CategoryDefault }, DataScheme = "Android_Package_Name")]
public class MainActivity : Activity
{
    protected override void OnNewIntent(Intent intent)
    {
        CloudRail.AuthenticationResponse = intent;
        base.OnNewIntent(Intent);
    }
}

Ключ в том, что соответствующий Activity класс (в моем случае, MainActivity) должен быть украшен IntentFilter, Также, OnNewItent должен быть переопределен и передать ответ обратно CloudRail.AuthenticationResponse в переопределении.

Я также обнаружил, что имя пакета Android должно быть в нижнем регистре, иначе оно также не будет работать.

Редактировать [2018.07.19]

Имя пакета Android должно содержать хотя бы один символ точки (.), В противном случае вы можете столкнуться с invalid_request - ошибкой отсутствия прав доступа.

Другие вопросы по тегам