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?
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
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!
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);