web-dev-qa-db-fra.com

Le service OpenCV doit être explicite, Android 5.0 Lollipop

Je construis cette application pour mon baccalauréat qui utilise OpenCV. Tout allait bien jusqu'à ce que j'ai mis à jour Android de mon téléphone à 5.0.

Après la mise à jour, mon projet a cessé de fonctionner, pour cette raison:

Java.lang.IllegalArgumentException: le service doit être explicite: intention {act = org.opencv.engine.BIND}

J'ai lu et me suis informé des nouvelles restrictions concernant les intentions implicites dans Android 5.0, mais comment puis-je contourner cela pour qu'OpenCV fonctionne? 

Je pourrais modifier le fichier AsyncServiceHelper.Java dans le kit de développement OpenCV pour essayer de résoudre ce problème, mais comment puis-je obtenir l'objet Class du service OpenCV à exécuter afin d'utiliser une intention explicite?

Ou peut-être que cette approche est une impasse, mais existe-t-il d'autres approches à ce problème ou est-ce que mes seules options sont une mise à jour du SDK OpenCV ou le déclassement de la version Android sur mon appareil?

17
georgej

Je pense que changer d'Android: targetSdkVersion n'est pas une solution très longue;) J'ai donc ajouté le nom du paquet pour rendre l'intention explicite: 

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;
    }
}

Peut-être que quelqu'un peut dire à un auteur de ce film de pousser un correctif. 

EDIT: D'après un commentaire ci-dessous: Pour ceux qui se demandent déjà où se trouve cette fonction, c'est dans src/main/Java/org/opencv/Android/AsyncServiceHelper.Java

48
Simon Heinen

J'ai vu une réponse ici au travail, l'ai testée et cela a résolu le problème. Apparemment, il a été supprimé entre-temps. Poster à nouveau pour référence

La solution changeait: Android: targetSdkVersion dans le fichier AndroidManifest.xml de 21 en 19 . Je ne peux pas croire que c'était aussi facile et j'ai perdu une journée à essayer de comprendre, achète, merci encore à celui qui a posté la réponse initiale :)

Merci stackoverflow!

7
georgej

J'ai changé la version d'OpenCV en 3.0 et le problème a été résolu: 

De

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

À

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