【问题标题】:OpenCV Service Intent must be explicit, Android 5.0 LollipopOpenCV Service Intent 必须是明确的,Android 5.0 Lollipop
【发布时间】:2015-02-12 17:43:24
【问题描述】:

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

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

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

我已阅读并告知自己有关 Android 5.0 中隐式 Intent 的新限制,但我该如何解决这个问题才能让 OpenCV 正常工作?

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

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

【问题讨论】:

  • 向我们展示 bindService() 的代码

标签: android opencv android-intent opencv4android


【解决方案1】:

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

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

感谢stackoverflow!

【讨论】:

  • 如果您使用 21 SDK 的某些功能,这不是一个解决方案……
  • 目前这对我来说不是一个问题,因为我认为它是一个临时解决方案。我完全希望 OpenCV 人员能够正确解决这个问题。然而,对我来说更重要的是继续编码,并在出现时切换到适当的解决方案......但是,你是对的。此方案并不理想,应仅视为临时方案
  • 它要求安装open CV。即使我们从外部源强制安装它之后:P
  • 这是一个技巧,而不是解决方案。
【解决方案2】:

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

移除标签 - android:targetSdkVersion.

【讨论】:

  • 如果 (android:targetSdkVersion) 未设置,则默认值等于给定的 minSdkVersion。 - 来自 android 文档页面。这并不理想..
  • 没有georgej,请尝试删除标签,它不会对任何版本造成任何问题。
【解决方案3】:

我认为更改 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 中。爪哇

【讨论】:

  • 是的,setPackageName() 是解决 Lollipop 错误或启动服务的方法。
  • 谢谢西蒙。对于其他想知道此函数位置的人,它位于 src/main/java/org/opencv/android/AsyncServiceHelper.java
  • 将此设置为问题的答案,因为它更像是一种解决方案,而不是一种解决方法。谢谢! :) 我也会用你的解决方案更新我的项目
  • 感谢您的解决方案,但不知何故这对我不起作用。我的应用程序现在一直说 OpenCV Manager 未安装,实际上已安装...
  • 它要求安装 OpenCV,而它是该项目的一部分。即使我们在那之后从外部源强制关闭安装它。
【解决方案4】:

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

来自

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

收件人

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多