ICloudStorage.GetChildren()永不返回

时间:2018-07-13 07:52:12

标签: xamarin.android google-drive-api cloudrail

我正在尝试使用以下代码通过CloudRail访问Google云端硬盘。

// 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 个答案:

答案 0 :(得分:1)

我得到了CloudRail支持团队的回复,并设法在他们的帮助下解决了该问题。

  

您需要在活动顶部添加IntentFilterLaunchModeSingleTask。   另外,您还需要放置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-缺少权限错误。