OpenCV Service Intent должен быть явным, Android 5.0 Lollipop

Я создаю это приложение для своего диплом бакалавра, который использует OpenCV. Все шло хорошо, пока я не обновил свой телефон Android до 5.0.

После обновления мой проект перестает работать, из-за этого:

java.lang.IllegalArgumentException: служебное намерение должно быть явным: Intent {act = org.opencv.engine.BIND}

Я прочитал и сообщил о новых ограничениях на неявные намерения в Android 5.0, но как я могу обойти это, чтобы OpenCV работал?

Я могу изменить файл AsyncServiceHelper.java в SDK OpenCV, чтобы попытаться исправить это, но как я могу получить объект класса службы OpenCV, который должен быть запущен, чтобы использовать явное намерение?

Или, может быть, этот подход является тупиком, но есть ли какие-либо другие подходы к этому, или мои единственные варианты - либо обновление SDK OpenCV, либо понизить версию Android на моем устройстве?

Ответ 1

Я думаю, что изменение андроида: 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

Ответ 2

Я увидел ответ здесь, когда на работе, протестировал его и решил проблему. По-видимому, он был удален тем временем. Повторная отправка его для справки

Решение изменилось: android: targetSdkVersion в AndroidManifest.xml от 21 до 19. Не могу поверить, что это было так легко, и я потерял день, пытаясь понять это, купи, эй, спасибо еще тому, кто отправил исходный ответ:)

Спасибо stackoverflow!

Ответ 3

Я изменил версию OpenCV до 3.0 и проблема была решена.

from

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

to

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

Ответ 4

Чтобы запустить приложение в любой версии Android, то есть последней версии.

Удалить тег - android: targetSdkVersion.