Xamarin中async void的使用是否正确?附Facebook登录代码
嘿,看起来你已经迈出了Xamarin中集成Facebook登录的第一步,这很棒!我帮你梳理下这段代码的完善方向和关键注意点,让你的登录功能更健壮:
关于Xamarin中Facebook登录实现的优化与补全
1. 补全完整的登录逻辑代码
你给出的代码片段只完成了初始化开头,这里帮你补全闭环的实现,确保登录流程能正常跑通:
public class MainActivity : Activity, IFacebookCallback { private LoginButton loginButton; ICallbackManager callbackManager; protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.Main); // 初始化Facebook回调管理器 callbackManager = CallbackManagerFactory.Create(); loginButton = FindViewById<LoginButton>(Resource.Id.login_button); // 设置需要获取的用户权限(根据你的业务需求调整) loginButton.SetReadPermissions(new List<string> { "public_profile", "email" }); // 绑定回调接口,接收登录结果 loginButton.RegisterCallback(callbackManager, this); } // 登录成功时的回调处理 public void OnSuccess(Java.Lang.Object result) { var loginResult = result as LoginResult; if (loginResult != null) { AccessToken accessToken = loginResult.AccessToken; Toast.MakeText(this, $"登录成功!Token: {accessToken.Token}", ToastLength.Short).Show(); // 可以在这里调用Graph API获取用户详细信息 FetchUserProfile(accessToken); } } // 登录被取消时的处理 public void OnCancel() { Toast.MakeText(this, "登录已取消", ToastLength.Short).Show(); } // 登录出错时的处理 public void OnError(FacebookException error) { Toast.MakeText(this, $"登录失败:{error.Message}", ToastLength.Short).Show(); } // 必须重写此方法,将页面结果传递给Facebook回调管理器 protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) { base.OnActivityResult(requestCode, resultCode, data); callbackManager.OnActivityResult(requestCode, (int)resultCode, data); } // 调用Facebook Graph API获取用户信息示例 private void FetchUserProfile(AccessToken accessToken) { GraphRequest request = GraphRequest.NewMeRequest( accessToken, (obj, response) => { if (response.Error == null) { var userJson = response.JSONObject; string userName = userJson.GetString("name"); string userEmail = userJson.Has("email") ? userJson.GetString("email") : "未获取到邮箱"; Toast.MakeText(this, $"欢迎回来,{userName}!你的邮箱:{userEmail}", ToastLength.Long).Show(); } else { Toast.MakeText(this, $"获取用户信息失败:{response.Error.Message}", ToastLength.Short).Show(); } }); // 指定需要返回的用户字段 Bundle parameters = new Bundle(); parameters.PutString("fields", "name,email"); request.Parameters = parameters; request.ExecuteAsync(); } }
2. 不可缺少的配置项
要让Facebook登录正常工作,必须在Android项目中完成以下配置:
- AndroidManifest.xml配置:在
<application>节点内添加:<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/> <activity android:name="com.facebook.FacebookActivity" android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" android:label="@string/app_name" /> <provider android:name="com.facebook.FacebookContentProvider" android:authorities="com.facebook.app.FacebookContentProvider{你的Facebook应用ID}" android:exported="true"/> - 添加应用ID字符串:在
Resources/values/strings.xml中加入你的Facebook开发者平台申请的AppID:<string name="facebook_app_id">你的AppID</string> - 权限声明:在Manifest根节点添加网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
3. 从原生Android迁移到Xamarin的小建议
既然你正在做项目迁移,分享几个实用小技巧:
- 原生Android的Facebook SDK逻辑可以直接对应到Xamarin绑定库,API用法几乎一致,不用从零重新学。
- 如果后续要扩展iOS端,建议用Xamarin.Forms的
DependencyService封装登录逻辑,业务代码可以跨端复用。 - 务必通过NuGet安装
Xamarin.Facebook.Android包,不要手动导入原生SDK,避免依赖冲突。
内容的提问来源于stack exchange,提问作者ygetarts
相关产品推荐
相关产品推荐

