我正在实施新的"更简单"的Google Play服务实施(没有GoogleApiClient管理),并且因为错误而被修改为'GoogleSignIn被标记为内部,不应该从应用访问.此API已被标记为尚未达到的限制.尽管错误标志我的游戏应用程序仍然编译和运行,并已能够访问排行榜和成就.我想摆脱这个标志,并知道它是否应该只是隐藏在lint之外,因为我没有看到我如何在我的应用程序之外访问GoogleSignIn.
Games.getLeaderboardsClient(this, GoogleSignIn.getLastSignedInAccount(this))
.getLeaderboardIntent(leaderboard_id)
.addOnSuccessListener(new OnSuccessListener<Intent>() {
@Override
public void onSuccess(Intent intent) {
startActivityForResult(intent, RC_LEADERBOARD_UI);
}
});
Run Code Online (Sandbox Code Playgroud)
更新4/2/18:在修复了GoogleSignIn的12.0.1更新后,我一直在寻找更多Google Play服务代码错误标记.与之前的GoogleSignIn一样,它们不会影响编译或运行,但仍然令人恼火.
在旧的 Android 计费实现中,您将构建一个 sku 列表来查询产品:
List<String> skuList = new ArrayList<>();
skuList.add(SKU_POTION);
skuList.add(SKU_SWORD);
skuList.add(SKU_BOW);
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
Run Code Online (Sandbox Code Playgroud)
新的计费实施更加复杂,并且似乎限制您只能将一种产品添加到查询列表中:
ImmutableList<QueryProductDetailsParams.Product> productList = ImmutableList.from(QueryProductDetailsParams.Product.newBuilder()
.setProductId(SKU_POTION)
.setProductType(BillingClient.ProductType.INAPP)
.build());
QueryProductDetailsParams params = QueryProductDetailsParams.newBuilder()
.setProductList(productList)
.build();
billingClient.queryProductDetailsAsync(
params,
new ProductDetailsResponseListener() {
public void onProductDetailsResponse(BillingResult billingResult, List<ProductDetails> productDetailsList) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && productDetailsList != null) {
for (ProductDetails skuDetails : productDetailsList) {
mProductDetailsMap.put(skuDetails.getProductId(), skuDetails);
}
}
}
}
);
Run Code Online (Sandbox Code Playgroud)
它使您可以为启动购买流程所需的 mProductDetailsMap 的productDetailsList 构建productList:
puchasestring=SKU_POTION;
initiatePurchaseFlow(mProductDetailsMap.get(puchasestring));
Run Code Online (Sandbox Code Playgroud)
如何将多个产品添加到开始实施的产品列表中?我不想为每个项目重复整个代码段以添加到 mProductDetailsMap,这是我现在使用的 Primitive Pete 方法。
我无意中接受了android studio的升级建议2.3(金丝雀),虽然我总是把它设置为检查开发者频道,而不是金丝雀,不知何故被切换.现在,我的"SDK Manager"窗口中不再有"启动独立SDK管理器"选项.
我出于各种原因喜欢独立管理器,包括它建议需要下载和升级的内容.常规的sdk经理列出了很多我希望我不需要的东西,比如'CMake','LLDB','Android的约束布局','ConstraintLayout的解算器','Google Play APK扩展库'('Google Play APK已经安装了扩展库rev 3',所以我也需要它吗?)等.
独立的sdk经理是否不适用于2.3 canary 2,或者我还需要做些什么才能获得它?
sdk android android-studio android-sdk-manager android-studio-2.3
我在用户名文件中看到这些文件夹,并想知道我是否可以删除其中两个:
.AndroidStudio1.2
.AndroidStudio1.3
.AndroidStudioPreview1.3
Run Code Online (Sandbox Code Playgroud)
在StudioPreviewpreview1.3需要1.3 G存储和Studio1.2需要773 MB的存储空间.我想知道这些文件夹中是否有任何内容现在可以执行任何操作.我收到的消息是更新的版本.
在实现 Firebase 的“性能”功能时,我在尝试同步 Gradle 时遇到以下错误:
Plugin with id 'com.google.firebase.firebase-perf' not found.
Run Code Online (Sandbox Code Playgroud)
我按照此处的说明实现了它: https://firebase.google.com/docs/perf-mon/get-started-android。特别是,它会引导您在根级别(项目级别)Gradle 文件中指定 com.google.firebase:perf-plugin 的类路径依赖项,而不是应用程序级别:
这是我的 Gradle,左侧是应用程序级,右侧是项目级:
我一直试图让AdMob在我的应用上工作一段时间.我一直在日志中获取onFailedToRecieveAd(无效广告请求)消息.我已将我的测试应用程序与此配对:
AdView adView;
LinearLayout ll;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
adView = new AdView(this, AdSize.BANNER, "pub-2...............");//inserted my 16 digit pub id here
adView.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL);
ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
ll.addView(adView);
setContentView(ll);
AdRequest adRequest = new AdRequest();
adRequest.addTestDevice("3...............");// 16 digits, tried other strings as
// follows:
//for addTestDevice I've tried several numbers, including the 16 digit device
// number given me by my "device id" application, the "0123456789ABCDEF" device number
// given by my console and device windows, the …Run Code Online (Sandbox Code Playgroud) 我注意到 android studio 中的 gradle 视图签名报告中显示的 SHA1 编号与我最初的不同。我想可能是一年前换电脑造成的。我的游戏应用程序仍然能够访问排行榜和成就。当我看到我的 Google API 仪表板时,我注意到“OAuth 客户端”有我的旧 SHA1。它不允许我将其更改为新的 SHA1,并说它“已被该客户端或另一个客户端使用”,尽管我没有其他客户端。神秘的“Anroid 客户端 1”和“Android 客户端 2”既没有旧的也没有新的 SHA1。在“OAuth 客户端”下面是“OAuth 客户端(由 google 服务自动创建)”,其中包含我的新 SHA1。我继续删除了那个,尽管它警告我它在上周已被使用了 147 次(我想这是我即将衰老的证据)。看来我必须删除它才能释放不是自动创建的“OAuth 客户端”的号码。
现在看来我完蛋了,因为当我尝试更改 SHA1 时,它仍然给我“已在使用的消息”,并且我的游戏应用程序根本无法再访问 Google Play 服务。我想我应该删除“OAuth 客户端”。我能从中恢复吗?随着时间的推移它会释放吗?另一篇文章建议 7 天删除客户端,尽管我没有看到删除整个客户端的按钮,并且担心同一页面上的 API 代码被删除。
编辑 3/30 - 看起来我可能已经永久丢失了这个数字,尽管(我希望)它只影响我的排行榜和成就,而不影响 Firebase、应用内购买或广告。无论如何,我可以在 Firebase 中推出自己的排行榜和成就。具有不同包名称的新项目在 Gradle 签名报告中为我提供了相同的无法使用的 SHA1。
为了将我的游戏应用程序分解为 Instant 和 Installable 版本,我对动态模块拆分 API 交付感到满意。我一直在关注此处的 Codelabs 教程https://codelabs.developers.google.com/codelabs/on-demand-dynamic-delivery/index.html#0。不幸的是,它使用 Kotlin 作为 MainActivity 代码,该代码不如 Java 特定,但如果您已经完成了 Kotlin 教程,仍然可以很好地遵循。该示例包括使用以下内容访问“资产”功能模块中“资产”文件夹中的文本图块:
private const val packageName = "com.google.android.samples.dynamicfeatures.ondemand"
val assetManager = createPackageContext(packageName, 0).assets
// Now treat it like any other asset file.
val assets = assetManager.open("assets.txt")
val assetContent = assets.bufferedReader()
.use {
it.readText()
}
Run Code Online (Sandbox Code Playgroud)
现在我只想访问动态功能模块的可绘制文件夹中的图形文件。我将只使用我的动态功能模块来存储大型图形,这些图形将使我超过 10 MG 的即时应用程序下载限制。什么是最干净的方法来做到这一点?
主要的“应用程序”模块:
“应用程序”中的 Java 代码:
loadTexture(R.drawable.aaa_image);
Bitmap bitmap;
public void loadTexture(final int resourceId){
bitmap = BitmapFactory.decodeResource(context.getResources(), resourceId, options);
***
Run Code Online (Sandbox Code Playgroud)
动态交付的“安装资产”模块:
'app'中的仍然是java代码,不会到达:
loadTexture(R.drawable.testgraphic);
cannot resolve symbol 'testgraphic'
Run Code Online (Sandbox Code Playgroud) 我有一本java游戏书建议尽可能将所有数据作为Int实现,该类型运行速度最快.它说Byte,Char和Boolean都是以Int的形式实现的,所以你不需要节省空间,因为Byte数据会使代码速度降低,所以你最终不得不在代码中进行转换.例如,需要演员表
a =(字节)(b + c);
因为加法结果是一个Int,即使a,b和c都被声明为Bytes.
我目前有一个巨大的2D数组声明为我的游戏Byte,以节省空间和按位操作.它真的节省空间吗?我也看到在例子中对Ints进行按位运算,按位运算按位运行吗?
This Handler class should be static or leaks may occur (null)
Run Code Online (Sandbox Code Playgroud)
这个消息的'class'是指'MyActivity',因为Handler是一个对象,我确实声明它是静态的.我应该忽略它还是应该添加一些内容,例如'MyActivity'声明中的'static'(我试过这个并且出错了).我注意到这种棉绒警告通常建议使用'WeakReference'.
public class MyActivity extends Activity{
...
static Handler handler;
...
handler = new Handler()
{
public void handleMessage(Message msg) {
Run Code Online (Sandbox Code Playgroud) 我经常在日志中看到类似这样的重复消息:
Method exceeds compiler instruction limit: 29278 in void com.xxxxxxapp.xxxxxx.MyGLRenderer.onDrawFrame(javax.microedition.khronos.opengles.GL10)
Method exceeds compiler instruction limit: 29278 in void com.xxxxxxapp.xxxxxx.MyGLRenderer.onDrawFrame(javax.microedition.khronos.opengles.GL10)
Method exceeds compiler instruction limit: 29278 in void com.xxxxxxapp.xxxxxx.MyGLRenderer.onDrawFrame(javax.microedition.khronos.opengles.GL10)
Run Code Online (Sandbox Code Playgroud)
分解代码通常会给出相同的消息,但数字较小:
Method exceeds compiler instruction limit: 22400 in void com.xxxxxxapp.xxxxxx.MyGLRenderer.onDrawFrame(javax.microedition.khronos.opengles.GL10)
Run Code Online (Sandbox Code Playgroud)
我认为 64000 是保留在此处的神奇数字。尽管有这样的烦人消息,我的游戏代码似乎总是运行良好,而且不仅仅是在 opengl onDrawFrame 方法中。尽管更新代码比绘制代码更容易分解,但我在低于 64K 的更新方法中收到了类似的消息。
搜索“方法超出编译器指令限制”刚刚让我链接到可怕的“Dalvik 编译器对 64K 方法的限制”错误。我必须继续忽略这一点吗?
我的所有游戏纹理都以JPG开头.我一直在将它们转换为PNG用于我的安卓游戏,因为从我所看到的这似乎是推荐的默认格式,但是当原始文件是JPG时,我还没有看到任何关于JPG的理由.我知道JPG和PNG(有损与无损)之间的区别,并且从JPG转换的PNG质量不能高于原始JPG,但无论如何,文件大小在转换中都会显着增加.我一直在这样做,以防PNG文件在我的游戏中处理得更快或在手机屏幕上显示得更好.其中任何一种都是这种情况,或者我应该将原始JPG中的所有内容都保留下来以节省内存和时间.
我讨厌问这个问题,但我一直无法在我当前的 PC 上找到我的 Java 文件夹。我想找到它,这样我就可以使用密钥库命令来查找我的 SHA 并知道它在哪里。我通过 gradlewindow/签名报告找到了一个 SHA 号码,但现在 api 页面不接受它,所以我想检查一个“keystore”命令,你显然必须使用在 Java 中某处设置的命令行文件夹路径来调用它文件夹。这是我的两个程序文件。我已经在这台 PC 上成功开发和发布我的 android 游戏一年了,所以我想我必须在某个地方有一个 Java 文件夹。工具栏搜索框没有帮助(它从来没有帮助),它只是通过 Bing 为我提供网站建议。