因测试需要在荣耀9(Android 7.0)上开发了一个App,其中使用了OMA(API19),将该App安装到sansung S4(5.0.1)上后出现如下问题:
11-29 11:05:50.775 20045-20045/? E/MainActivity: 软件异常: Service Intent must be explicit: Intent { act=org.simalliance.openmobileapi.service.ISmartcardService }
java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=org.simalliance.openmobileapi.service.ISmartcardService }
at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:2052)
at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:2160)
at android.app.ContextImpl.bindService(ContextImpl.java:2138)
at android.content.ContextWrapper.bindService(ContextWrapper.java:559)
at org.simalliance.openmobileapi.SEService.<init>(SEService.java:144)
at com.hed.m25flashdetector.MainActivity.onSIMStateChanged(MainActivity.java:726)
at com.hed.content.SIMStateChangedReceiver.onReceive(SIMStateChangedReceiver.java:43)
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:923)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5942)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
经过查找相关资料,发现是因为Android5.0中service的intent一定要显性声明,当这样绑定的时候才不会报错。于是我将OMA版本更换成了21版本,然后再编译重试,但出现了新的问题:
V/SEService: bindingSuccessful: false
这下子郁闷了,一开始怀疑是否是SIM卡内置JAVA平台版本问题,更新SIM卡为联通Java平台后重试还是不行,我开始怀疑是OMA软件版本匹配问题,于是将该手机的org.simalliance.openmobileapi.jar pull下来,解压后发现里面只有清单文件,难道我pull的有问题,重试后还是一样,好郁闷!突然我想到以前采用eclipse开发OMA的App可以在该手机上运行,我就尝试将本App的targetSdkVersion改为19,并配合OMA 19版本进行编译,呵呵,可以成功收发数据了,原来是SDK版本匹配问题。
总结:后续我继续尝试更换OMA版本进行编译,发现我手头的OMA 21版本与该手机上的OMA不兼容。