Я уже несколько дней безуспешно пытаюсь показать таблицу лидеров Google Play для своей игры из своего класса игровых кнопок. Тем не менее, я могу показать таблицу лидеров из основной деятельности без проблем.
Вот код, который находится на моей MainActivity:
public void showLeaderboard() {
Games.getLeaderboardsClient(this, GoogleSignIn.getLastSignedInAccount(this))
.getLeaderboardIntent(getString(R.string.leaderboard_id))
.addOnSuccessListener(new OnSuccessListener<Intent>() {
@Override
public void onSuccess(Intent intent) {
startActivityForResult(intent,2000);
}
});
}
Однако, когда я пытаюсь вызвать этот код с моей кнопки, я получаю всевозможные сбои и ошибки. Вот мой класс кнопок:
package com.nexxiom.zombieassault.GameObjects.Buttons;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.Log;
import android.view.MotionEvent;
import static com.nexxiom.zombieassault.Scaling.DrawX;
import static com.nexxiom.zombieassault.Scaling.DrawY;
public class LeaderBoardButton {
Context context;
public Bitmap image;
public Rect rect;
public boolean isVisible;
Paint p;
public LeaderBoardButton(Context context,Bitmap image,int x,int y) {
this.context = context;
this.image = image;
this.rect = new Rect(x - image.getWidth()/2,y - image.getHeight()/2,x - image.getWidth()/2+image.getWidth(),y - image.getHeight()/2+image.getHeight());
this.isVisible = true;
p = new Paint();
}
public void draw(Canvas canvas){
canvas.drawBitmap(image, DrawX(rect.left), DrawY(rect.top), null);
}
public boolean onTouchEvent(MotionEvent e){
float posX = e.getX();
float posY = e.getY();
switch (e.getActionMasked()) {
case MotionEvent.ACTION_UP: {
if (posX > DrawX(rect.left) && posX < DrawX(rect.right) && posY > DrawY(rect.top) && posY < DrawY(rect.bottom)) {
try{
//showLeaderboard();
}catch (Exception ex){
Log.d("LEADERBOARD",ex.getMessage());
}
}
}
break;
}
return false;
}
}
Вы заметите, что у меня есть строка showLeaderboard (), закомментированная в onTouchEvent (). Здесь я хочу запустить таблицу лидеров.
Вещи, которые я пробовал. Сделайте showLeaderBoard stati c, переместите код в класс кнопки, расширяя активность на кнопку и т. Д. c.
Моя основная деятельность выглядит следующим образом:
public class MainActivity extends AppCompatActivity{
public static Context context;
DisplayMetrics displayMetrics;
static int DPI = 0;
public static int SCREEN_WIDTH;
public static int SCREEN_HEIGHT;
@SuppressLint("SourceLockedOrientationActivity")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View decorView = getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
decorView.setSystemUiVisibility(uiOptions);
signInSilently();
displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
SCREEN_HEIGHT = displayMetrics.heightPixels;
SCREEN_WIDTH = displayMetrics.widthPixels;
DPI = displayMetrics.densityDpi;
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setContentView(new GameView(this));
}
public void showLeaderboard() {
Games.getLeaderboardsClient(this, GoogleSignIn.getLastSignedInAccount(this))
.getLeaderboardIntent(getString(R.string.leaderboard_id))
.addOnSuccessListener(new OnSuccessListener<Intent>() {
@Override
public void onSuccess(Intent intent) {
startActivityForResult(intent,2000);
}
});
}
private void signInSilently() {
GoogleSignInOptions signInOptions = GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN;
GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
if (GoogleSignIn.hasPermissions(account, signInOptions.getScopeArray())) {
// Already signed in.
// The signed in account is stored in the 'account' variable.
GoogleSignInAccount signedInAccount = account;
} else {
// Haven't been signed-in before. Try the silent sign-in first.
GoogleSignInClient signInClient = GoogleSignIn.getClient(this, signInOptions);
signInClient
.silentSignIn()
.addOnCompleteListener(
this,
new OnCompleteListener<GoogleSignInAccount>() {
@Override
public void onComplete(@NonNull Task<GoogleSignInAccount> task) {
if (task.isSuccessful()) {
// The signed in account is stored in the task's result.
GoogleSignInAccount signedInAccount = task.getResult();
//Log.d("SIGNIN","TRUE");
} else {
startSignInIntent();
}
}
});
}
}
private void startSignInIntent() {
GoogleSignInClient signInClient = GoogleSignIn.getClient(this,
GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN);
Intent intent = signInClient.getSignInIntent();
startActivityForResult(intent, 1000);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1000) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (result.isSuccess()) {
// The signed in account is stored in the result.
GoogleSignInAccount signedInAccount = result.getSignInAccount();
} else {
String message = result.getStatus().getStatusMessage();
if (message == null || message.isEmpty()) {
message = "Sign In Error";
}
new AlertDialog.Builder(this).setMessage(message)
.setNeutralButton(android.R.string.ok, null).show();
}
}
}
}
Как я могу запустить код showleaderboard для mainacctivity из моего класса кнопок?