web-dev-qa-db-ja.com

OpenCVサービスインテントは明示的である必要がありますAndroid 5.0 Lollipop

私はOpenCVを使用する学士号のためにこのアプリケーションを構築しています。携帯電話のAndroidを5.0に更新するまで、すべてが順調に進んでいました。

更新後、次の理由でプロジェクトが機能しなくなりました。

Java.lang.IllegalArgumentException:サービスインテントは明示的である必要があります:インテント{act = org.opencv.engine.BIND}

Android 5.0の暗黙のインテントに関する新しい制限について読んで通知しましたが、OpenCVを機能させるためにこれを回避するにはどうすればよいですか?

これを修正するために、OpenCV SDKのAsyncServiceHelper.Javaファイルを変更できますが、使用するために実行する必要があるOpenCVサービスのClassオブジェクトを取得するにはどうすればよいですか?明示的な意図?

または、このアプローチは行き止まりですが、これに対する他のアプローチはありますか、それともOpenCV SDKを更新するか、デバイスのAndroidバージョンをダウングレードする)しかありませんか?

17
georgej

Android: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コミッターにこれについて教えて、ホットフィックスをプッシュすることができます。

EDIT:以下のコメントから:この関数の場所を知りたい人は、src/main/Java /にあります。 org/opencv/Android/AsyncServiceHelper.Java

49
Simon

私は仕事中にここで答えを見て、それをテストしました、そしてそれは問題を解決しました。どうやらそれはその間に削除されました。参考のために再度投稿する

解決策は次のように変更されました:Android:targetSdkVersion AndroidManifest.xmlで21から19に。それがこれほど簡単だったとは信じられません、そして私はそれを理解しようとして一日を失いました、ちょっと買ってください、最初の答えを投稿した人にもう一度感謝します:)

Stackoverflowに感謝します!

7
georgej

OpenCVのバージョンを3.0に変更しましたが、問題は解決しました。

From

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

宛先

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