17

我正在为使用 OpenCV 的学士文凭构建此应用程序。一切都很顺利,直到我将手机的 Android 更新到 5.0。

更新后我的项目停止工作,因为:

java.lang.IllegalArgumentException:服务意图必须是明确的:意图 { act=org.opencv.engine.BIND }

我已阅读并告知自己有关 Android 5.0 中隐式意图的新限制,但如何解决此问题以使 OpenCV 正常工作?

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

或者这种方法可能是一个死胡同,但是有没有其他方法可以解决这个问题,或者我唯一的选择是更新 OpenCV SDK,还是降级我设备上的 Android 版本?

4

4 回答 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

于 2015-02-19T18:13:49.150 回答
7

我在工作时在这里看到了答案,对其进行了测试并解决了问题。显然它同时被删除了。再次发帖以供参考

解决方案正在改变: AndroidManifest.xml 中的android:targetSdkVersion2119。不敢相信这很容易,我花了一天的时间试图弄清楚,买嘿,再次感谢发布最初答案的人:)

感谢堆栈溢出!

于 2014-12-15T20:20:16.463 回答
0

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

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

OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallbck);
于 2015-10-20T05:22:43.710 回答
-5

为了在任何版本的 android 即最新版本上运行应用程序。

删除标签 - android:targetSdkVersion

于 2015-01-14T09:39:14.397 回答