如何在Libgdx的AndroidLauncher中使用Google Play服务并初始化GoogleApiClient?
解决Libgdx AndroidLauncher与GoogleApiClient.enableAutoManage的冲突问题
嘿,这个整合问题我碰到过好多次了——Libgdx的AndroidApplication确实不是FragmentActivity的子类,所以直接用enableAutoManage肯定会报错。这里给你两个靠谱的解决方案,按需选就行:
方案一:改用FragmentActivity承载Libgdx游戏
这个方案最直接,因为enableAutoManage本来就是为FragmentActivity设计的。我们可以把AndroidLauncher改成继承FragmentActivity,然后把Libgdx的游戏视图嵌入进去,步骤如下:
- 修改AndroidLauncher的继承关系,实现GoogleApiClient的回调接口
- 初始化GoogleApiClient时正常调用
enableAutoManage - 手动初始化Libgdx的
AndroidApplication,并把它的视图设置为Activity的内容视图
示例代码:
import android.os.Bundle; import androidx.fragment.app.FragmentActivity; import com.badlogic.gdx.backends.android.AndroidApplication; import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.games.Games; public class AndroidLauncher extends FragmentActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { private GoogleApiClient mGoogleApiClient; private AndroidApplication libgdxGameView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 初始化GoogleApiClient,现在可以放心用enableAutoManage了 mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(Games.API) .addScope(Games.SCOPE_GAMES_LITE) .enableAutoManage(this, this) // 这里不再报错 .build(); // 初始化Libgdx游戏实例 AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); libgdxGameView = new AndroidApplication(); libgdxGameView.initialize(new YourLibgdxGame(), config); // 将Libgdx的游戏视图设置为Activity的布局 setContentView(libgdxGameView.getView()); } // 实现GoogleApiClient的回调方法 @Override public void onConnected(Bundle bundle) { // 连接成功后的操作,比如同步成就、提交游戏分数 } @Override public void onConnectionSuspended(int cause) { // 连接暂停时的处理,比如提示用户重新连接 } @Override public void onConnectionFailed(ConnectionResult connectionResult) { // 连接失败的处理,比如引导用户登录Google Play账号 } }
优点:不用手动管理GoogleApiClient的生命周期,enableAutoManage会自动处理连接、断开等逻辑,减少出错概率。
方案二:手动管理GoogleApiClient生命周期(继续继承AndroidApplication)
如果你不想改动AndroidLauncher的继承结构,可以放弃enableAutoManage,自己在Activity的生命周期方法里控制GoogleApiClient的连接与断开:
示例代码:
import android.content.Intent; import android.os.Bundle; import android.widget.Toast; import com.badlogic.gdx.backends.android.AndroidApplication; import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.games.Games; public class AndroidLauncher extends AndroidApplication implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { private static final int RC_SIGN_IN = 9001; private GoogleApiClient mGoogleApiClient; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); initialize(new YourLibgdxGame(), config); // 初始化GoogleApiClient,不要调用enableAutoManage mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(Games.API) .addScope(Games.SCOPE_GAMES_LITE) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .build(); } @Override protected void onStart() { super.onStart(); // Activity启动时连接GoogleApiClient mGoogleApiClient.connect(); } @Override protected void onStop() { super.onStop(); // Activity停止时断开连接,避免内存泄漏 if (mGoogleApiClient.isConnected()) { mGoogleApiClient.disconnect(); } } // 实现回调方法 @Override public void onConnected(Bundle bundle) { // 处理连接成功逻辑 } @Override public void onConnectionSuspended(int cause) { // 处理连接暂停逻辑 } @Override public void onConnectionFailed(ConnectionResult connectionResult) { // 处理连接失败,比如启动登录界面 if (connectionResult.hasResolution()) { try { connectionResult.startResolutionForResult(this, RC_SIGN_IN); } catch (IntentSender.SendIntentException e) { mGoogleApiClient.connect(); } } else { Toast.makeText(this, "Google Play连接失败: " + connectionResult.getErrorMessage(), Toast.LENGTH_SHORT).show(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) { // 登录回调后重新连接 mGoogleApiClient.connect(); } } }
优点:不用修改原有继承结构,保持Libgdx项目的传统启动方式;缺点:需要自己处理所有生命周期逻辑,容易遗漏导致内存泄漏或连接异常。
小提示
如果选方案一,不用担心Libgdx的输入、权限等功能受影响——AndroidApplication的initialize方法已经处理了这些核心逻辑,嵌入到FragmentActivity中完全可以正常工作。
内容的提问来源于stack exchange,提问作者jemystack
相关产品推荐
相关产品推荐

