在我们做的项目中需要一个推送消息的功能,在网上找了下相关的技术之后(有很多分析Android推送技术优劣的文章,这里就不再多说了),决定采用IBM的MQTT协议进行推送,一来这个协议比较简单方便,二来这种方式用的比较多,网上有现成的程序可以借鉴。
但是,根据网上的文章配置好了PHP的服务器端之后,下载了
AndroidPushNotificationsDemo-master
这个例子程序,先是在eclipse中打开编译运行只后总是出错。网上说是wmqtt这个jar包没有导入成功,于是我又重新建了个libs文件夹把jar包又导入了一次,发现还是会出错
08-23 02:28:44.404: E/AndroidRuntime(282): java.lang.VerifyError:
com.tokudu.demo.PushService
08-23 02:28:44.404: E/AndroidRuntime(282): at
com.tokudu.demo.PushActivity$1.onClick(PushActivity.java:32)
08-23 02:28:44.404: E/AndroidRuntime(282): at
android.view.View.performClick(View.java:2408)
08-23 02:28:44.404: E/AndroidRuntime(282): at
android.view.View$PerformClick.run(View.java:8816)
08-23 02:28:44.404: E/AndroidRuntime(282): at
android.os.Handler.handleCallback(Handler.java:587)
08-23 02:28:44.404: E/AndroidRuntime(282): at
android.os.Handler.dispatchMessage(Handler.java:92)
08-23 02:28:44.404: E/AndroidRuntime(282): at
android.os.Looper.loop(Looper.java:123)
08-23 02:28:44.404: E/AndroidRuntime(282): at
android.app.ActivityThread.main(ActivityThread.java:4627)
08-23 02:28:44.404: E/AndroidRuntime(282): at
java.lang.reflect.Method.invokeNative(Native Method)
08-23 02:28:44.404: E/AndroidRuntime(282): at
java.lang.reflect.Method.invoke(Method.java:521)
08-23 02:28:44.404: E/AndroidRuntime(282): at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-23 02:28:44.404: E/AndroidRuntime(282): at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-23 02:28:44.404: E/AndroidRuntime(282): at
dalvik.system.NativeStart.main(Native Method)
网上都是在说是因为wmqtt包导入不成功引起的,而且这个解决方法到处都是,我又重新试了好多次都不行。因为我用的是android studio来开发的,所以我又把代码转到了android studio中试了一下还是不行。通过logcat的追踪信息显示的信息
01-05 15:04:40.873 26196-26196/com.app.yiyeqianshan:push01 I/PushService﹕ Connectivity changed: connected=true
01-05 15:04:40.873 26196-26196/com.app.yiyeqianshan:push01 I/PushService﹕ Reconnecting...
01-05 15:04:40.873 26196-26196/com.app.yiyeqianshan:push01 I/PushService﹕ Connecting...
01-05 15:04:40.875 26196-26196/com.app.yiyeqianshan:push01 I/PushService﹕ MqttException: NULL XXX
01-05 15:04:40.876 26196-26196/com.app.yiyeqianshan:push01 I/PushService﹕ Rescheduling connection in 160000ms.
这说明包导入是没有问题的,只是在connet的时候抛出异常了,是包内部函数的问题。
仔细比对了我的程序和例子程序之后发现问题出在minSdkVersion=3上面。
选择Min SDK Version 低于 10 即可。
并且不要填写 Target/Max SDK Version ,
project.properties 文件中的版本控制这当前编译时调用的 android 支持包的版本。
由于我们用了fragment,最低支持版本是10,这个就没办法了。后来在网上看到了一种解决方案,就是在调用之前加上
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
}
这个就OK了。问题解决。。。