java - 如何在 android L 上加载 OpenCV 时删除日志记录语句

标签 java android c++ c opencv

我正在使用 OpenCV 库 2.4.9。为了初始化 OpenCv 库,我使用了调用

OpenCvLoaded.initDebug()

但是这个调用产生了很多日志语句。我找不到像 OpenCvLoaded.initRelease() 这样的东西。此外,当我使用以下代码时

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status) {
            case LoaderCallbackInterface.SUCCESS: {

            }
            break;
            default: {
                super.onManagerConnected(status);
            }
            break;
        }
    }
};

我得到了错误

 Unable to start activity ComponentInfo{myclass}: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=org.opencv.engine.BIND }

如何删除那些日志语句。我正在 android L 上构建我的应用程序。我的最小 sdk 是 21。

最佳答案

据我所知,目前有两种方法可以让 OpenCV 与 Android 5.0(“Lollipop”)一起工作。

  1. 最简单的方法:在项目的 build.gradle 中设置 targetSdkVersion 19(因为您的最低 sdk 版本是 21,所以您还必须设置 minSdkVersion 19 或更少)。
  2. 但如果您必须使用 Android 5.0 版,则上述解决方法对您不起作用。相反,您可以导入 Android OpenCV sources作为项目中的模块,将主应用程序项目设置为依赖于它,以及 调整 OpenCV 文件 src/main/java/org/opencv/android/AsyncServiceHelper.java 如下:

将方法 createExplicitFromImplicitIntent(see the link 上面给出的 FoggyDay)添加到 AsyncServiceHelper 类。

然后将 AsyncServiceHelper 类的 initOpenCV 方法修改为:

public static boolean initOpenCV(String Version, final Context AppContext,
        final LoaderCallbackInterface Callback)
{
    AsyncServiceHelper helper = new AsyncServiceHelper(Version, AppContext, Callback);
    Intent expIntent = createExplicitFromImplicitIntent(AppContext, new Intent("org.opencv.engine.BIND"));
    if (AppContext.bindService(expIntent,
            helper.mServiceConnection, Context.BIND_AUTO_CREATE))
    {
        return true;
    }
    else
    {
        AppContext.unbindService(helper.mServiceConnection);
        InstallService(AppContext, Callback);
        return false;
    }
}

最后不要忘记添加必要的导入:

import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import java.util.List; 

至于日志消息泛滥,另一种停止这些行输出的方法...

02-01 02:25:10.489  29887-29998/com.ABC.opencv_someapp D/CameraBridge? mStretch value: 1.125
02-01 02:25:10.521  29887-29887/com.ABC.opencv_someapp D/JavaCameraView? Preview Frame received. Frame size: 1843200

...可以将 OpenCV 源代码包含到您的项目中,如上图所示,然后在以下文件中删除或注释这些行:

src/main/java/org/opencv/android/CameraBridgeViewBase.java line 408: Log.d(TAG, "mStretch value: " + mScale);

src/main/java/org/opencv/android/JavaCameraView.java line 276: Log.d(TAG, "Preview Frame received. Frame size: " + frame.length);

关于java - 如何在 android L 上加载 OpenCV 时删除日志记录语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28104022/

相关文章:

java - 使用 DataNucleus JPAReplicationManager 时出现 ClassCastException

java - jssc getInputStream() getOutputstream()

java - 使用 OpenMap API 我应该使用哪个类从 shapefile 中提取点数据?

android - 如何排除某些 Firebase 数据库节点的持久化?

Android Espresso 测试错误 : No static method loadSingleServiceOrNull()

java - 处理 HTTP 响应状态的更好方法是什么?

c++ - 从列表中选择项目到其他列表的 Qt 实现(双列表、累加器、列表构建器、TwoListSelection ...)

c++ - 如何获取 curlpp 响应头

c++ - 使用了自动释放但仍然泄漏

java - Gurobi Java model.set(GRB.IntParam.LazyConstraints, 1);抛出错误