小编And*_*der的帖子

对于新的Google Play服务实施,"GoogleSignIn被标记为内部,不应从应用访问"

我正在实施新的"更简单"的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 google-play-services android-studio

16
推荐指数
1
解决办法
1597
查看次数

将多个产品添加到 android billing 5.0.0 中的 queryProductDetailsAsync 的产品列表中

在旧的 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 方法。

java android play-billing-library

12
推荐指数
2
解决办法
6560
查看次数

Android Studio 2.3 canary在'SDK Manager'中缺少'Launch Standalone SDK Manager'选项

我无意中接受了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

9
推荐指数
2
解决办法
2万
查看次数

我现在应该删除.AndroidStudio1.2文件夹

我在用户名文件中看到这些文件夹,并想知道我是否可以删除其中两个:

.AndroidStudio1.2 

.AndroidStudio1.3 

.AndroidStudioPreview1.3
Run Code Online (Sandbox Code Playgroud)

StudioPreviewpreview1.3需要1.3 G存储和Studio1.2需要773 MB的存储空间.我想知道这些文件夹中是否有任何内容现在可以执行任何操作.我收到的消息是更新的版本.

android android-studio

7
推荐指数
1
解决办法
1763
查看次数

未找到 ID 为“com.google.firebase.firebase-perf”的插件

在实现 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,左侧是应用程序级,右侧是项目级:

在此输入图像描述

android firebase firebase-performance

6
推荐指数
3
解决办法
6324
查看次数

使用AdMob的onFailedToRecieveAd(无效广告请求)消息

我一直试图让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 admob

5
推荐指数
1
解决办法
5126
查看次数

您指定的指纹已被此项目或其他项目中的 Android OAuth2 客户端 ID 使用

我注意到 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。

在此输入图像描述

android sha google-api-console android-studio

5
推荐指数
1
解决办法
6871
查看次数

从主模块的动态特征模块的可绘制文件夹访问图形

为了将我的游戏应用程序分解为 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)

graphics android module dynamic-feature

5
推荐指数
2
解决办法
1187
查看次数

是否将Byte实现为Int?

我有一本java游戏书建议尽可能将所有数据作为Int实现,该类型运行速度最快.它说Byte,Char和Boolean都是以Int的形式实现的,所以你不需要节省空间,因为Byte数据会使代码速度降低,所以你最终不得不在代码中进行转换.例如,需要演员表

a =(字节)(b + c);

因为加法结果是一个Int,即使a,b和c都被声明为Bytes.

我目前有一个巨大的2D数组声明为我的游戏Byte,以节省空间和按位操作.它真的节省空间吗?我也看到在例子中对Ints进行按位运算,按位运算按位运行吗?

java int byte

4
推荐指数
1
解决办法
205
查看次数

此Handler类应该是静态的或可能发生泄漏(null)

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)

android handler

3
推荐指数
1
解决办法
1万
查看次数

低于 64K 的方法出现“方法超出编译器指令限制”消息

我经常在日志中看到类似这样的重复消息:

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 方法的限制”错误。我必须继续忽略这一点吗?

methods android limit

2
推荐指数
1
解决办法
3901
查看次数

将图形从jpg转换为png是否值得?

我的所有游戏纹理都以JPG开头.我一直在将它们转换为PNG用于我的安卓游戏,因为从我所看到的这似乎是推荐的默认格式,但是当原始文件是JPG时,我还没有看到任何关于JPG的理由.我知道JPG和PNG(有损与无损)之间的区别,并且从JPG转换的PNG质量不能高于原始JPG,但无论如何,文件大小在转换中都会显着增加.我一直在这样做,以防PNG文件在我的游戏中处理得更快或在手机屏幕上显示得更好.其中任何一种都是这种情况,或者我应该将原始JPG中的所有内容都保留下来以节省内存和时间.

performance png jpeg

1
推荐指数
1
解决办法
4262
查看次数

在 Program Files 中找不到 Java 文件夹

我讨厌问这个问题,但我一直无法在我当前的 PC 上找到我的 Java 文件夹。我想找到它,这样我就可以使用密钥库命令来查找我的 SHA 并知道它在哪里。我通过 gradlewindow/签名报告找到了一个 SHA 号码,但现在 api 页面不接受它,所以我想检查一个“keystore”命令,你显然必须使用在 Java 中某处设置的命令行文件夹路径来调用它文件夹。这是我的两个程序文件。我已经在这台 PC 上成功开发和发布我的 android 游戏一年了,所以我想我必须在某个地方有一个 Java 文件夹。工具栏搜索框没有帮助(它从来没有帮助),它只是通过 Bing 为我提供网站建议。

在此处输入图片说明

在此处输入图片说明

java android android-studio

0
推荐指数
1
解决办法
1万
查看次数