OpenCV服务意图必须是明确的,安卓5.0棒棒糖。

17

我正在为我的学士学位制作一个使用OpenCV的应用程序。 一切进行得都很好,直到我将手机的Android系统更新到5.0版本。

更新后,我的项目停止了工作,原因如下:

java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=org.opencv.engine.BIND }

我已经阅读并了解了Android 5.0中关于隐式意图的新限制,但是为了使OpenCV工作,我该怎么办?

我可以修改OpenCV SDK中的AsyncServiceHelper.java文件,以尝试解决这个问题,但是我该如何获取需要运行的OpenCV服务的Class对象,以便使用显式意图?

或者也许这种方法走不通,但是否有其他方法来解决这个问题,或者我的唯一选择是更新OpenCV SDK或降级我的设备的Android版本?


展示一下 bindService() 的代码。 - IgorGanapolsky
4个回答

50

我认为更改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贡献者,以推动热修复。

编辑: 根据下面的评论:对于其他想知道此功能位置的人,它位于src/main/java/org/opencv/android/AsyncServiceHelper.java


1
是的,setPackageName() 是解决Lollipop错误或启动服务的解决方案。 - IgorGanapolsky
3
谢谢 Simon。如果还有其他人想知道这个函数的位置,它在 src/main/java/org/opencv/android/AsyncServiceHelper.java 文件中。 - Nicolas
将此设置为问题的答案,因为它更像是一个解决方案,而不是一个变通方法。谢谢! :) 我也会使用您的解决方案更新我的项目。 - georgej
2
谢谢你的解决方案,但不知何故这对我不起作用。我的应用程序现在一直显示OpenCV Manager未安装,实际上已经安装了... - Vincent Hogendoorn
1
它要求安装OpenCV,但它已经是这个项目的一部分了。即使我们从外部源安装它,也会在之后强制关闭。 - Arun
Amulator Android API23,解决方案没有帮助。 - user25

7
我在工作时看到了这里的一个答案,测试了一下,问题就解决了。但似乎后来被删除了。为了参考,我再次发布它。
解决方案是将AndroidManifest.xml中的 android:targetSdkVersion 21 更改为 19 。简直不敢相信解决问题如此简单,我浪费了一天时间试图弄清楚它,但还是感谢最初发布答案的人:)
感谢stackoverflow!

4
如果你使用21 SDK的某些功能,那么这并不是一个解决方案。 - Marc Plano-Lesay
2
目前对我来说这不是一个问题,因为我认为这只是一个临时解决方案。我完全期待OpenCV的开发人员能够妥善解决这个问题。然而,对我来说更重要的是继续编码,并在出现更好的解决方案时切换到正确的解决方案... 但是,你是对的。这个解决方案并不理想,应该只被视为一个临时的解决方案。 - georgej
它要求安装OpenCV。即使我们从外部源安装它,之后也会强制关闭:P - Arun
那只是一个hack,而不是解决方案。 - Guillaume agis

0

我已将OpenCV版本更改为3.0,问题得到解决:

来自

OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallbck);

OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallbck);

-5
为了在任何版本的Android上运行应用程序,即最新版本。
请删除标签 - android:targetSdkVersion

如果未设置(android:targetSdkVersion),则默认值等于minSdkVersion给定的值。- 来自Android文档页面。这并不理想。 - georgej
请尝试删除标签,这不会对任何版本造成问题。 - AnkitRox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接