我正在尝试使用以下代码通过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帐户并同意使用该应用程序后,该函数调用将永远不会返回。也不例外。
可能出了什么问题?
答案 0 :(得分: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-缺少权限错误。