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

Posted

技术标签:

【中文标题】在android L上加载OpenCV时如何删除日志记录【英文标题】:How to remove logging statements when OpenCV is loaded on android L 【发布时间】:2015-01-23 06:12:37 【问题描述】:

我正在使用 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 ComponentInfomyclass: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent  act=org.opencv.engine.BIND 

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

【问题讨论】:

OpenCV 使用 java.util.logging。您最好的选择可能是配置一个您的 OpenCV 应用程序将在启动期间读取的日志文件:tutorials.jenkov.com/java-logging/configuration.html 至于您的java.lang.IllegalArgumentException: Service Intent must be explicit 运行时错误请看这里:Android L (API 21) Service Intent must be explicit 【参考方案1】:

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

    简单的方法:在您项目的build.gradle 中设置targetSdkVersion 19(由于您的最低sdk 版本为21,因此您还必须设置minSdkVersion 19 或更低)。 但如果您必须使用 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);

【讨论】:

以上是关于在android L上加载OpenCV时如何删除日志记录的主要内容,如果未能解决你的问题,请参考以下文章

Android studio 之 OpenCv库安装与Opencv图像灰度化测试(2023-2-13日)

c ++ opencv在窗口上显示图像

如何在使用 Gradle 时使用 opencv?

在 Android 上的 OpenCV 中旋转 VideoCapture

再次删除并添加平台后,Cordova 无法在 Android 上运行

在Android上使用OpenCV