我正在为使用OpenCV的学士学位文凭构建此应用程序。一切都很顺利,直到我将手机的Android更新为5.0。
更新后,我的项目停止了工作,因为:
java.lang.IllegalArgumentException:服务意图必须是显式的:Intent {act = org.opencv.engine.BIND}
我已阅读并告知自己有关Android 5.0中隐式意图的新限制,但我怎样才能解决这个问题,以便OpenCV能够正常工作?
我可以修改OpenCV SDK中的 AsyncServiceHelper.java 文件以尝试修复此问题,但是我怎样才能获得需要运行的OpenCV服务的Class对象,按顺序使用明确的意图?
或者这种方法可能是死路一条,但是有没有其他方法,或者我唯一的选择是更新OpenCV SDK,还是降级我的设备上的Android版本?
答案 0 :(得分:48)
我认为更改android:targetSdkVersion不是很长时间的解决方案;)所以我添加了包名以使意图明确:
public static boolean initOpenCV(String Version, final Context AppContext,
final LoaderCallbackInterface Callback) {
AsyncServiceHelper helper = new AsyncServiceHelper(Version, AppContext,
Callback);
Intent intent = new Intent("org.opencv.engine.BIND");
intent.setPackage("org.opencv.engine");
if (AppContext.bindService(intent, helper.mServiceConnection,
Context.BIND_AUTO_CREATE)) {
return true;
} else {
AppContext.unbindService(helper.mServiceConnection);
InstallService(AppContext, Callback);
return false;
}
}
也许有人可以告诉opencv comitter这个,推送修补程序。
编辑: 来自下面的评论:对于其他任何想知道此功能位置的人,它都在src / main / java / org / opencv /中机器人/ AsyncServiceHelper.java
答案 1 :(得分:7)
我在工作时看到了答案,对其进行了测试并解决了这个问题。显然它同时被删除了。再次发布以供参考
解决方案正在改变:AndroidManifest.xml中的 android:targetSdkVersion ,从 21 到 19 。不能相信这很容易,我失去了一天试图找出来,买嘿,再次感谢那个发布最初答案的人:)
感谢stackoverflow!
答案 2 :(得分:0)
我已将OpenCV版本更改为3.0,问题已解决:
发件人强>
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallbck);
要强>
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallbck);
答案 3 :(得分:-5)
为了在任何版本的android(即最新版本)上运行应用程序。
删除代码 - android:targetSdkVersion 。