0

入力コマンドに似たAndroidプラットフォームアプリがあり、IWindowManagerにバインドしてキー入力を挿入します。

このコードを external/vncagent フォルダーの下に配置しました。私はそれを構築することができ、スクリプトのようにメインクラスを呼び出すシェルスクリプトを持っています。

実行すると、次の例外が発生します。入力 (つまり、frameworks/base/cmds/input) の同じコードは正常に動作するようです。

私が得ている例外は次のとおりです。

android.os.RemoteException: 不明なバインダー エラー コードです。0xffffff7
        android.os.BinderProxy.transact(ネイティブメソッド)で
        android.os.ServiceManagerProxy.getService(ServiceManagerNative.java:120) で
        android.os.ServiceManager.getService(ServiceManager.java:55) で
        mycom.service.vncapp.VNCController.getWinManager (VNCController.java:109) で
        mycom.service.vncapp.VNCController.sendKeyEvent (VNCController.java:120) で
        mycom.service.vncapp.VNCController.processCmd (VNCController.java:148) で
        mycom.service.vncapp.VNCController.access$200 (VNCController.java:29) で
        mycom.service.vncapp.VNCController$InjectInput.run(VNCController.java:237) で
        java.lang.Thread.run(Thread.java:856) で

これはそれを呼び出すコードです。

    プライベート同期 IWindowManager getWinManager()
    {
        if (null == m_winManager)
        {
            試す
            {
                m_winManager = IWindowManager.Stub.asInterface(ServiceManager.getService(Context.WINDOW_SERVICE));
            }
            catch(スロー可能指数)
            {

            }
        }
        m_winManager を返します。
    }

グーグルで調べた後、プラットフォーム証明書でアプリに署名する必要があると考えました。Android.mk ファイルに LOCAL_CERTIFICATE を追加しました。それは何の違いもありませんでした。

私のアプリは、標準のプラットフォーム入力コマンドと同じモデルに従っており、プラットフォームの一部としてビルドされています。それでも私のアプリは IWindowManager にアクセスできません。

以下は私の Android.mk ファイルです

# Copyright 2008 Android オープン ソース プロジェクト
#
LOCAL_PATH:= $(my-dir を呼び出す)
$(CLEAR_VARS) を含める

LOCAL_SRC_FILES := $(all-subdir-java-files を呼び出す)
LOCAL_MODULE := vncagent
LOCAL_MODULE_TAGS := オプション
LOCAL_CERTIFICATE := プラットフォーム
$(BUILD_JAVA_LIBRARY) を含める

#ALL_PREBUILT += $(TARGET_OUT)/bin/vncagent
$(TARGET_OUT)/bin/vncagent : $(LOCAL_PATH)/vncagent | $(ACP)
    $(事前構築済みターゲットへの変換)

jar がビルドされたら、jar とシェル スクリプトをターゲット ボードの /data/mycom/vnc フォルダーにプッシュし、adb シェルから起動します。

2013 年 4 月 30 日の編集:
私はこのアプローチを断念しました (つまり、J2SE タイプの jar を構築し、メイン クラスを呼び出します)。コードはコンパイルされますが、リモート バインダーへのバインドに失敗します。代わりに、Android サービスを作成し、Intents を介して呼び出し可能なこのロジックをラップしました。プライベート API のクラスを使用しているため、Android プラットフォーム ソースの一部としてビルドする必要があります。私はこの方法で多くの進歩を遂げました。

ありがとう

4

0 に答える 0