小编Ami*_*val的帖子

GCM:MulticastResult - 哪个结果来自哪个设备?

GCM:入门指南的最后一部分之后,在收到结果后需要完成一些簿记.

引言:

现在有必要解析结果并在以下情况下采取适当的措施:

  • 如果消息已创建但结果返回了规范的注册ID,则必须将当前注册
    ID替换为规范注册ID.
  • 如果返回的错误是NotRegistered,则必须删除该注册ID,因为该应用程序已从设备中卸载.

这是一个处理这两个条件的代码片段:

if (result.getMessageId() != null) {
 String canonicalRegId = result.getCanonicalRegistrationId();
 if (canonicalRegId != null) {
   // same device has more than on registration ID: update database
 }
} else {
 String error = result.getErrorCodeName();
 if (error.equals(Constants.ERROR_NOT_REGISTERED)) {
   // application has been removed from device - unregister database
 }
}
Run Code Online (Sandbox Code Playgroud)

上面的指南是指单个结果,而不是指多播情况.我不知道如何处理多播案例:

    ArrayList<String> devices = new ArrayList<String>();

    for (String d : relevantDevices) {
        devices.add(d);
    }

    Sender sender = new Sender(myApiKey);
    Message message …
Run Code Online (Sandbox Code Playgroud)

android google-cloud-messaging

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

Android:在onPostExecute()中得到了CalledFromWrongThreadException - 它怎么可能?

我有一个应用程序正在生产几周,使用ACRA,我没有错误,直到今天报告一个奇怪的错误.

我有:

    android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
Run Code Online (Sandbox Code Playgroud)

来自堆栈跟踪中的此方法(已回溯):

at my.app.CountdownFragment$1.void onPostExecute(java.lang.Object)(SourceFile:1)
Run Code Online (Sandbox Code Playgroud)

这是相关的源代码段:

    private void addInstructionsIfNeeded() {
    if (S.sDisplayAssist) {
        new AsyncTask<String, Void, String>() {

            @Override
            protected String doInBackground(String... params) {
                return null;
            }

            /*
             * runs on the ui thread
             */
            protected void onPostExecute(String result) {

                Activity a = getActivity();

                if (S.sHelpEnabled && a != null) {

                    in = new InstructionsView(a.getApplicationContext());

                    RelativeLayout mv = (RelativeLayout) a
                            .findViewById(R.id.main_place);

                    mv.addView(in.prepareView());
                }

            };

        }.execute(""); …
Run Code Online (Sandbox Code Playgroud)

android

23
推荐指数
3
解决办法
4895
查看次数

如何在Eclipse中将源附加到Google Drive API或"Android Private Library"

我已使用菜单选项安装了Drive APIAdd Google APIs....
手动钻入Drive API下的任何一个jar时,源代码打开正常.

但手动钻入同一个罐子Android Private Libraries导致"未找到来源".

项目视图

因此,当使用open Declaration (F3)例如,我得到"未找到来源"页面.

构建系统使用名为的库链接所有jar Android Private Libraries.

我找不到将源或文档附加到Drive API的方法.

附加源对话框

附加任何内容的所有选项都被禁用.

有什么建议?

eclipse android google-drive-api

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

防止代码意外进入生产

我正在寻找一种简单的方法来确保static final boolean DEBUG在将我的Android项目导出到APK时将我的标志设置为false.

我已经尝试过使用这里提到的"STOPSHIP"评论标记,但它似乎对apk导出没有任何影响,或者我使用它错了.

为此目的建立一个lint扩展看起来有点过分,有没有更简单的方法呢?

编辑

使用自动生成的BuildConfig.DEBUG标志,结合一些难以错过的屏幕指示,你在调试模式下运行(加上心理记录永远不会在快速修复后凌晨4点上传apk) - 可能会让你满意.
它仍然不是我发布此问题的100%万无一失的方法.

仍然存在关于随机无法正常运作的抱怨BuildConfig.DEBUG.所以这个问题仍然是开放的 - 是否有一个lint技巧或类似的技巧呢?

android lint android-build android-lint

11
推荐指数
2
解决办法
4798
查看次数

Android:确定用户是否关闭了通知

NotificationManager.notify()在我的倒数计时器应用程序中使用Notifications()来发出警报,以防用户在其关闭时参与其他应用程序.

除非用户关闭通知(来自JellyBeans +中的快速设置),否则它的效果非常好.

如果关闭通知选项,我想检查代码,所以我可以选择不同的报警方法.

令人惊讶的是,我没有找到关于这个主题的信息,并且深入到Android代码中我看不到这样的选项NotificationManager,并且它无声地失败.

有办法吗?

notifications android android-intent

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

"eglConfig未初始化"错误,但我没有使用openGl

这很奇怪,因为我在我的应用程序中不使用任何opengl!

我得到了这个堆栈跟踪(感谢ACRA):

java.lang.RuntimeException: eglConfig not initialized
at android.view.HardwareRenderer$GlRenderer.initializeEgl(HardwareRenderer.java:582)
at android.view.HardwareRenderer$GlRenderer.initialize(HardwareRenderer.java:518)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1300)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4575)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

一些线索:

  • 它开始发生在我的应用程序的一个版本中,我添加了一个Widget.所以它可能与Widget渲染有关
  • 我发生了几次,它似乎来自同一台设备
  • 此设备每次报告不同的屏幕尺寸...

所有报告都有一些共同之处:

  • PHONE_MODEL = cm_tenderloin
  • BRAND =通用
  • PRODUCT =触摸板
  • ANDROID_VERSION = 4.0.4
  • 相同的"INSTALLATION_ID"
  • 相同的"SERIAL",这是不自然的长

知道发生了什么事吗?

android android-widget

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

如何配置 Proguard 以删除重要的日志消息?

Proguard很好地去除了琐碎的Log 调用。(使用assumenosideeffects关键字)
但它处理非平凡的Log 调用很差。

通过“非平凡”,我的意思不仅仅是一个字符串。
例如:Log.i(TAG,"velocity="+velocity)“。
Proguard 保留了new StringBuilder("velocity="), 以及附加的变量,并保留了值,并没有太多地掩盖该变量。它只删除了对 Log 的最终调用。
字符串将保留在那里,浪费内存,cpu 周期并帮助破解者理解代码。


因此,要解决这个问题,我每包不平凡的我与应用程序的调试日志呼叫if(BuildConfig.DEBUG){...}。但是包装每个日志if(..){..}是乏味和容易出错的。
它当然不是 DRY(不要重复自己)。

有没有办法标记 Proguard(或通过任何其他方式)完全删除的方法,包括所有调用方法?

就像是:

@proguard_purge
public static void vanishingDebug(String whatever) {
  Log.i(TAG,whatever);
}
Run Code Online (Sandbox Code Playgroud)

那么该方法将被混淆器消失,并且对该方法的所有调用也将递归消失?

详细说明

混淆将优化代码并删除未使用或排除的方法。
但是代码编译会在方法调用之前生成额外的字节码,这些字节码将被删除,而前面的代码即使经过混淆也会保留下来,并留下如下代码:

new StringBuilder("velocity=").append(a)
Run Code Online (Sandbox Code Playgroud)

(假设a在编译时无法确定。要测试,请使用velocity=Math.random();

这使得混淆的代码很容易理解。
要重现该问题,您需要安装dex2jar将 apk 转换为 jar,并安装JAD将 jar 转换为 java 代码。
你会看到真正留下的东西,并感到震惊。

例子

@Override
protected void onCreate(Bundle savedInstanceState) …
Run Code Online (Sandbox Code Playgroud)

android proguard

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

Joda时间本地化 - getAsText(Locale ..)在某些语言环境中无法正常工作

getAsText() 应该打印本地化版本,根据设备Locale:

en例如,当语言环境一切正常时:

DateTime dt = new DateTime();
System.out.println(dt.dayOfWeek().getAsText()); 
| Tuesday
Run Code Online (Sandbox Code Playgroud)

但是如果将syslem语言更改为希伯来语,那么它就会被破坏:

System.out.println(dt.dayOfWeek().getAsText()); 
| 3        ( <-- supposed to be "??? ?????")
Run Code Online (Sandbox Code Playgroud)

如果覆盖设备区域设置,仍然有些区域设置似乎不起作用:

DateTime dt = new DateTime();
System.out.println(dt.dayOfWeek().getAsText(Locale.FRENCH)); // prints "mardi" = OK
System.out.println(dt.dayOfWeek().getAsText(new Locale("iw"))); // prints "3"
| mardi
| 3        ( <-- supposed to be "??? ?????")
Run Code Online (Sandbox Code Playgroud)

当改变系统区域设置为IW,该代码打印正确,意思翻译可用的地方:

System.out.println(DateUtils.formatDateTime(this, dt, DateUtils.FORMAT_SHOW_WEEKDAY)); 
| ??? ?????
Run Code Online (Sandbox Code Playgroud)

确保Locale可用:

Locale iw = new Locale("iw");
System.out.println(iw.getDisplayName() + " " + iw.toString()); // prints Hebrew iw == OK
| Hebrew …
Run Code Online (Sandbox Code Playgroud)

android localization jodatime

5
推荐指数
0
解决办法
473
查看次数

Protobuf 2.5.0 bug?

我已经从google protobuf v.2.4.1迁移到v.2.5.0(没有其他变化).

我使用2.4.1进行了完美的客户端 - 服务器[android <> gae dev server]通信.
现在有了2.5.0它就被打破了.

在没有对.proto文件进行任何修改的情况下,我使用新的2.5.0 jar设置了我的客户端和服务器,并且使用新的protoc可执行文件我已经从同一个proto文件为客户端和服务器生成了一个新的源文件.

现在,当我尝试解析消息时,我在服务器上收到此错误:

VerifyError: class ... overrides final method getUnknownFields.()Lcom/google/protobuf/UnknownFieldSet;
Run Code Online (Sandbox Code Playgroud)

全栈:

java.lang.VerifyError: class com.mta.pb.ACM$MyRequest overrides final method getUnknownFields.()Lcom/google/protobuf/UnknownFieldSet;
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:213)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:186)
at com.google.appengine.tools.development.agent.runtime.RuntimeHelper.checkRestricted(RuntimeHelper.java:70)
at com.google.appengine.tools.development.agent.runtime.Runtime.checkRestricted(Runtime.java:64)
**at com.mta.server.p.AndroidServletP.doPost(AndroidServletP.java:91)** <- my code
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.googlecode.objectify.cache.AsyncCacheFilter.doFilter(AsyncCacheFilter.java:57)
at …
Run Code Online (Sandbox Code Playgroud)

google-app-engine android protocol-buffers

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

将我的项目连接到Google+正在等待处理

在Google API的信息中心中,您可以选择申请与Google+信息页的连接.
我已要求连接到我在Google+中创建的产品页面,但自此(几周)以来,该页面一直处于"待处理"状态.
我没有找到任何错误或我应该做什么的线索.
有什么建议?

google-api google-plus

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