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 - ошибкой отсутствия прав доступа.