Android 使用Google Play Games接收成就时不会显示弹出窗口

Android 使用Google Play Games接收成就时不会显示弹出窗口,android,google-play-games,google-api-client,Android,Google Play Games,Google Api Client,我发现了一堆有类似问题的帖子,但大多数都在使用我没有的BaseGameUtils或GoogleApiClient。 一个建议的答案是添加,Games.setViewForPopups(getApiClient(),findViewById(R.id.gps_popup))除非我有GoogleAppClient,否则我不能这样做 成就代码: public void achieve(String achievement) { Games.getAchievementsClient(this,

我发现了一堆有类似问题的帖子,但大多数都在使用我没有的
BaseGameUtils
GoogleApiClient
。 一个建议的答案是添加,
Games.setViewForPopups(getApiClient(),findViewById(R.id.gps_popup))除非我有
GoogleAppClient
,否则我不能这样做

成就代码:

public void achieve(String achievement) {
    Games.getAchievementsClient(this, signedInAccount).unlock(achievement);
}

public void increment(String achievement, int i) {
    Games.getAchievementsClient(this, signedInAccount).increment(achievement, i);
}
登录代码:

@Override
protected void onCreate(Bundle _savedInstanceState) {
    ...
    signInSilently();
}

private void signInSilently() {
    GoogleSignInClient signInClient = GoogleSignIn.getClient(this, GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN);
    signInClient.silentSignIn().addOnCompleteListener(this,
            new OnCompleteListener<GoogleSignInAccount>() {
                @Override
                public void onComplete(@NonNull Task<GoogleSignInAccount> task) {
                    if (task.isSuccessful()) {
                        signedInAccount = task.getResult();
                        findViewById(R.id.achievements_btn).setVisibility(View.VISIBLE);
                    } else {
                        startSignInIntent();
                    }
                }
            });
}

private void startSignInIntent() {
    GoogleSignInClient signInClient = GoogleSignIn.getClient(this,
            GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN);
    Intent intent = signInClient.getSignInIntent();
    startActivityForResult(intent, RC_SIGN_IN);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == RC_SIGN_IN) {
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        if (result.isSuccess()) {
            signedInAccount = result.getSignInAccount();
            findViewById(R.id.achievements_btn).setVisibility(View.VISIBLE);
            Toast.makeText(getApplicationContext(), "Signed In", Toast.LENGTH_SHORT).show();
        } else {
            String message = result.getStatus().getStatusMessage();
            if (message == null || message.isEmpty()) {
                message = "Error";
            }
            Toast.makeText(getApplicationContext(), "Sign In Failed, please check internet connection and restart the app to use achievements.", Toast.LENGTH_LONG).show();
            cancelledSignIn = true;
        }
    }
}


private void showAchievements() {
    Games.getAchievementsClient(this, signedInAccount)
            .getAchievementsIntent()
            .addOnSuccessListener(new OnSuccessListener<Intent>() {
                @Override
                public void onSuccess(Intent intent) {
                    startActivityForResult(intent, RC_ACHIEVEMENT_UI);
                }
            });
}
@覆盖
创建时受保护的void(Bundle\u savedInstanceState){
...
显著地();
}
私人空间明显无效{
GoogleSignInClient signInClient=GoogleSignIn.getClient(这是GoogleSignInOptions.DEFAULT\u GAMES\u SIGN\u IN);
signInClient.silentSignIn().addOnCompleteListener(此,
新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
signedAccount=task.getResult();
findviewbyd(R.id.progressions\u btn).setVisibility(View.VISIBLE);
}否则{
StartSigningent();
}
}
});
}
私有无效启动信号(){
GoogleSignInClient signInClient=GoogleSignIn.getClient(此,
谷歌登录。默认(游戏登录);
Intent=signInClient.getsigningent();
startActivityForResult(意向、RC登录);
}
@凌驾
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
if(requestCode==RC\u登录){
GoogleSignInResult结果=Auth.GoogleSignInApi.getSignInResultFromIntent(数据);
if(result.issucess()){
signedAccount=result.getSignInAccount();
findviewbyd(R.id.progressions\u btn).setVisibility(View.VISIBLE);
Toast.makeText(getApplicationContext(),“已登录”,Toast.LENGTH\u SHORT.show();
}否则{
字符串消息=result.getStatus().getStatusMessage();
if(message==null | | message.isEmpty()){
message=“Error”;
}
Toast.makeText(getApplicationContext(),“登录失败,请检查internet连接并重新启动应用程序以使用成就。”,Toast.LENGTH_LONG).show();
取消签名=真;
}
}
}
个人成就(){
Games.getAchievementsClient(此,已签名帐户)
.getAchievementsIntent()
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时的公共无效(意图){
startActivityForResult(意图、成就);
}
});
}
不知道该怎么办,这一切都运作良好,除了弹出窗口从未显示。我从未使用过
GoogleAppClient
,如果我需要,你能告诉我为什么以及如何使用吗?
非常感谢您的帮助

我也有同样的问题,没有使用
BaseGameUtils
GoogleAppClient

我将以下内容添加到我的
OnConnected
from

它给出了一个lint警告,
GoogleSignIn.GetLastSignedAccount(this))
可能为空,因此我将其包装在一个
if语句中,列出以下内容:

if(GoogleSignIn.getLastSignedInAccount(this) != null){
GamesClient gamesClient = Games.getGamesClient(MainActivity.this, 
GoogleSignIn.getLastSignedInAccount(context));
gamesClient.setViewForPopups(findViewById(R.id.gps_popup));
}

这可能不是一个很好的答案,但它对我很有用,所以我希望你能发现它有用,祝你好运。

如果你正在测试游戏服务,并且弹出窗口没有显示成就,原因可能是你没有为该成就添加图标。我发现,弹出窗口仅显示带有图标的成就

我尝试了这个,还在我的主布局中添加了视图块
gps\u弹出窗口
。我没有收到任何错误,但也没有看到任何弹出窗口。@MattVine我将代码从我的
OnCreate
移动到
OnConnected
,它工作得更好。在登录过程中,我尝试将其移动到不同的位置,并通过登录和退出应用程序来解决问题,直到其表现符合要求,并且Google Play Games用户名将在视图上浮动并消失。我找不到连接的
OnConnected
。在我的代码中,
OnConnected
放在哪里?@MattVine我相信我们使用了一种不同的技术来连接Google Play Games服务。我学习了Google TypeANumber教程,其中包括一个
OnConnected
函数。您也可以在Github上查看我在遵循Google教程时创建的项目,该教程实现了此修复。我已仔细检查,我的所有成就在开发人员控制台中都有图标。@MattVine您是否尝试过清除Play Games Service app的缓存?
if(GoogleSignIn.getLastSignedInAccount(this) != null){
GamesClient gamesClient = Games.getGamesClient(MainActivity.this, 
GoogleSignIn.getLastSignedInAccount(context));
gamesClient.setViewForPopups(findViewById(R.id.gps_popup));
}