Opencv停止在Android 6.0上工作

Opencv停止在Android 6.0上工作,android,opencv,android-context,Android,Opencv,Android Context,我在我的应用程序上使用Opencv,它在安卓4.3上运行良好,但在安卓6.0上甚至无法打开 我在SO上查找了一个解决方案,找到了一个上面写着设置包名的解决方案。所以我做了 以下代码: public static boolean initOpenCV(String Version, final Context AppContext, final LoaderCallbackInterface Callback) { AsyncServiceHelper helper = n

我在我的应用程序上使用Opencv,它在安卓4.3上运行良好,但在安卓6.0上甚至无法打开

我在SO上查找了一个解决方案,找到了一个上面写着设置包名的解决方案。所以我做了

以下代码:

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;
    }
}
但现在我得到了以下错误:

11-18 10:14:43.447 24901-24930/br.com.ibramed.dermos E/AndroidRuntime:      android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
11-18 10:14:43.447 24901-24930/br.com.ibramed.dermos E/AndroidRuntime:     at android.view.ViewRootImpl.setView(ViewRootImpl.java:571)
11-18 10:14:43.447 24901-24930/br.com.ibramed.dermos E/AndroidRuntime:     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:310)
11-18 10:14:43.447 24901-24930/br.com.ibramed.dermos E/AndroidRuntime:     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
11-18 10:14:43.447 24901-24930/br.com.ibramed.dermos E/AndroidRuntime:     at android.app.Dialog.show(Dialog.java:319)
在以下代码中:

case InstallCallbackInterface.NEW_INSTALLATION:
        {
            Looper.prepare();
            Log.d("Debug", ""+mAppContext);
            AlertDialog InstallMessage = new AlertDialog.Builder(mAppContext).create();
            InstallMessage.setTitle("Package not found");
            InstallMessage.setMessage(callback.getPackageName() + " package was not found! Try to install it?");
            InstallMessage.setCancelable(false); // This blocks the 'BACK' button
            InstallMessage.setButton(AlertDialog.BUTTON_POSITIVE, "Yes", new OnClickListener()
            {
                public void onClick(DialogInterface dialog, int which)
                {
                    callback.install();
                }
            });

            InstallMessage.setButton(AlertDialog.BUTTON_NEGATIVE, "No", new OnClickListener() {

                public void onClick(DialogInterface dialog, int which)
                {
                    callback.cancel();
                }
            });

            InstallMessage.show();
        } break;
我搜索并发现一些人说要跟踪主上下文,因为线程没有上下文。但我的应用程序已经做到了这一点,并使用主上下文创建AlertDialogs,但仍然无法工作

当应用程序显示AlertDialog时出错


我真的不知道还能做什么。有人能帮忙吗?

据我所知,在服务或应用程序类中,您无法通过android 6.0的视图获取上下文,因此当OpenCv尝试显示AlertDialog时,它不知道绑定到哪个活动对话框并崩溃。 使用前,请尝试在Activity onCreate方法中初始化OpenCv

我在MainActivity中的工作init方法(kotlin上的代码):


据我所知,在服务或应用程序类中,您无法使用android 6.0的View获取上下文,因此,当OpenCv尝试显示AlertDialog时,它不知道绑定对话框的活动是什么,并且会崩溃。 使用前,请尝试在Activity onCreate方法中初始化OpenCv

我在MainActivity中的工作init方法(kotlin上的代码):


您在代码的这一部分中所做的任何事情都需要许可吗?我在Marshmallow上运行东西时遇到的唯一问题是在Marshmallow的代码中处理权限的新方法。可能是为了下载opencv包而使用Internet。但我读到,互联网是一个正常的要求,只有包括在清单是足够的。我也试着在安卓5.3上运行,它运行正常。好吧,我所做的只是一个临时解决方案。我从Google Play手动安装了OpenCV管理器,应用程序开始工作。您在该代码部分所做的任何事情都需要许可吗?我在Marshmallow上运行东西时遇到的唯一问题是在Marshmallow的代码中处理权限的新方法。可能是为了下载opencv包而使用Internet。但我读到,互联网是一个正常的要求,只有包括在清单是足够的。我也试着在安卓5.3上运行,它运行正常。好吧,我所做的只是一个临时解决方案。我从Google Play手动安装了OpenCV管理器,应用程序开始工作。
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_9, this, object : BaseLoaderCallback(this@HistoryActivity) {
                override fun onManagerConnected(status: Int) {
                    if (LoaderCallbackInterface.SUCCESS == status)
                        Log.i(TAG, "OpenCV was loaded")
                    else
                        super.onManagerConnected(status)
                }
            })
    }