Tam*_*mal 5 java android leaderboard google-play-services android-studio
我在我的应用程序(游戏)中添加了排行榜.当我从Android工作室直接在手机中运行应用程序时,它工作正常.但是在googleplay中从alpha测试下载应用程序后,排行榜无效.
它显示app错误配置的错误.
RESULT_APP_MISCONFIGURED
我已正确地在google开发者控制台中添加了SHA1密钥.我再次检查了SHA1密钥,发现密钥是正确的.
我在stackoverflow中搜索了这个主题,但找不到任何解决我问题的方法.我也检查了这个解决方案,但它没有解决问题.
请参阅以下我从谷歌开发者控制台拍摄的屏幕截图.为了安全起见,我从屏幕截图中删除了包名/ sha1键和其他私有内容.
以下是我在代码中使用的游戏辅助类.
class GameHelperUtils {
public static final int R_UNKNOWN_ERROR = 0;
public static final int R_SIGN_IN_FAILED = 1;
public static final int R_APP_MISCONFIGURED = 2;
public static final int R_LICENSE_FAILED = 3;
private final static String[] FALLBACK_STRINGS = {
"*Unknown error.",
"*Failed to sign in. Please check your network connection and try again.",
"*The application is incorrectly configured. Check that the package name and signing certificate match the client ID created in Developer Console. Also, if the application is not yet published, check that the account you are trying to sign in with is listed as a tester account. See logs for more information.",
"*License check failed."
};
private final static int[] RES_IDS = {
R.string.gamehelper_unknown_error, R.string.gamehelper_sign_in_failed,
R.string.gamehelper_app_misconfigured, R.string.gamehelper_license_failed
};
static String activityResponseCodeToString(int respCode) {
switch (respCode) {
case Activity.RESULT_OK:
return "RESULT_OK";
case Activity.RESULT_CANCELED:
return "RESULT_CANCELED";
case GamesActivityResultCodes.RESULT_APP_MISCONFIGURED:
return "RESULT_APP_MISCONFIGURED";
case GamesActivityResultCodes.RESULT_LEFT_ROOM:
return "RESULT_LEFT_ROOM";
case GamesActivityResultCodes.RESULT_LICENSE_FAILED:
return "RESULT_LICENSE_FAILED";
case GamesActivityResultCodes.RESULT_RECONNECT_REQUIRED:
return "RESULT_RECONNECT_REQUIRED";
case GamesActivityResultCodes.RESULT_SIGN_IN_FAILED:
return "SIGN_IN_FAILED";
default:
return String.valueOf(respCode);
}
}
static String errorCodeToString(int errorCode) {
switch (errorCode) {
case ConnectionResult.DEVELOPER_ERROR:
return "DEVELOPER_ERROR(" + errorCode + ")";
case ConnectionResult.INTERNAL_ERROR:
return "INTERNAL_ERROR(" + errorCode + ")";
case ConnectionResult.INVALID_ACCOUNT:
return "INVALID_ACCOUNT(" + errorCode + ")";
case ConnectionResult.LICENSE_CHECK_FAILED:
return "LICENSE_CHECK_FAILED(" + errorCode + ")";
case ConnectionResult.NETWORK_ERROR:
return "NETWORK_ERROR(" + errorCode + ")";
case ConnectionResult.RESOLUTION_REQUIRED:
return "RESOLUTION_REQUIRED(" + errorCode + ")";
case ConnectionResult.SERVICE_DISABLED:
return "SERVICE_DISABLED(" + errorCode + ")";
case ConnectionResult.SERVICE_INVALID:
return "SERVICE_INVALID(" + errorCode + ")";
case ConnectionResult.SERVICE_MISSING:
return "SERVICE_MISSING(" + errorCode + ")";
case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED:
return "SERVICE_VERSION_UPDATE_REQUIRED(" + errorCode + ")";
case ConnectionResult.SIGN_IN_REQUIRED:
return "SIGN_IN_REQUIRED(" + errorCode + ")";
case ConnectionResult.SUCCESS:
return "SUCCESS(" + errorCode + ")";
default:
return "Unknown error code " + errorCode;
}
}
static void printMisconfiguredDebugInfo(Context ctx) {
Log.w("GameHelper", "****");
Log.w("GameHelper", "****");
Log.w("GameHelper", "**** APP NOT CORRECTLY CONFIGURED TO USE GOOGLE PLAY GAME SERVICES");
Log.w("GameHelper", "**** This is usually caused by one of these reasons:");
Log.w("GameHelper", "**** (1) Your package name and certificate fingerprint do not match");
Log.w("GameHelper", "**** the client ID you registered in Developer Console.");
Log.w("GameHelper", "**** (2) Your App ID was incorrectly entered.");
Log.w("GameHelper", "**** (3) Your game settings have not been published and you are ");
Log.w("GameHelper", "**** trying to log in with an account that is not listed as");
Log.w("GameHelper", "**** a test account.");
Log.w("GameHelper", "****");
if (ctx == null) {
Log.w("GameHelper", "*** (no Context, so can't print more debug info)");
return;
}
Log.w("GameHelper", "**** To help you debug, here is the information about this app");
Log.w("GameHelper", "**** Package name : " + ctx.getPackageName());
Log.w("GameHelper", "**** Cert SHA1 fingerprint: " + getSHA1CertFingerprint(ctx));
Log.w("GameHelper", "**** App ID from : " + getAppIdFromResource(ctx));
Log.w("GameHelper", "****");
Log.w("GameHelper", "**** Check that the above information matches your setup in ");
Log.w("GameHelper", "**** Developer Console. Also, check that you're logging in with the");
Log.w("GameHelper", "**** right account (it should be listed in the Testers section if");
Log.w("GameHelper", "**** your project is not yet published).");
Log.w("GameHelper", "****");
Log.w("GameHelper", "**** For more information, refer to the troubleshooting guide:");
Log.w("GameHelper", "**** http://developers.google.com/games/services/android/troubleshooting");
}
static String getAppIdFromResource(Context ctx) {
try {
Resources res = ctx.getResources();
String pkgName = ctx.getPackageName();
int res_id = res.getIdentifier("app_id", "string", pkgName);
return res.getString(res_id);
} catch (Exception ex) {
ex.printStackTrace();
return "??? (failed to retrieve APP ID)";
}
}
static String getSHA1CertFingerprint(Context ctx) {
try {
Signature[] sigs = ctx.getPackageManager().getPackageInfo(
ctx.getPackageName(), PackageManager.GET_SIGNATURES).signatures;
if (sigs.length == 0) {
return "ERROR: NO SIGNATURE.";
} else if (sigs.length > 1) {
return "ERROR: MULTIPLE SIGNATURES";
}
byte[] digest = MessageDigest.getInstance("SHA1").digest(sigs[0].toByteArray());
StringBuilder hexString = new StringBuilder();
for (int i = 0; i < digest.length; ++i) {
if (i > 0) {
hexString.append(":");
}
byteToString(hexString, digest[i]);
}
return hexString.toString();
} catch (PackageManager.NameNotFoundException ex) {
ex.printStackTrace();
return "(ERROR: package not found)";
} catch (NoSuchAlgorithmException ex) {
ex.printStackTrace();
return "(ERROR: SHA1 algorithm not found)";
}
}
static void byteToString(StringBuilder sb, byte b) {
int unsigned_byte = b < 0 ? b + 256 : b;
int hi = unsigned_byte / 16;
int lo = unsigned_byte % 16;
sb.append("0123456789ABCDEF".substring(hi, hi + 1));
sb.append("0123456789ABCDEF".substring(lo, lo + 1));
}
static String getString(Context ctx, int whichString) {
whichString = whichString >= 0 && whichString < RES_IDS.length ? whichString : 0;
int resId = RES_IDS[whichString];
try {
return ctx.getString(resId);
} catch (Exception ex) {
ex.printStackTrace();
Log.w(GameHelper.TAG, "*** GameHelper could not found resource id #" + resId + ". " +
"This probably happened because you included it as a stand-alone JAR. " +
"BaseGameUtils should be compiled as a LIBRARY PROJECT, so that it can access " +
"its resources. Using a fallback string.");
return FALLBACK_STRINGS[whichString];
}
}
}
Run Code Online (Sandbox Code Playgroud)
请帮我解决这个问题.提前致谢.
这可能是错误的来源:
“您应该创建两个客户端 ID,一个包含发布证书指纹,另一个包含调试证书指纹。请确保两者使用相同的包名称。这允许 Google Play 游戏服务识别来自已链接 APK 签名的调用任一证书。有关 Android 证书签名的更多信息,请参阅对您的应用程序进行签名。”
因此,请在游戏服务中“取消发布您的游戏”。然后“删除排行榜”,并在发布游戏后同时发布游戏服务排行榜。在发布游戏之前,请勿在手机上安装 apk 文件!
| 归档时间: |
|
| 查看次数: |
672 次 |
| 最近记录: |