我有一个类似于输入命令的 android 平台应用程序,它绑定到 IWindowManager 并注入键输入。
我将此代码放在 external/vncagent 文件夹下。我能够构建它,并且我有一个 shell 脚本,它像 am script 一样调用主类。
运行它时出现以下异常。输入中的相同代码(即框架/基础/cmds/输入)似乎工作正常。
我得到的例外是:
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)); } 捕捉(可投掷的经验) { } } 返回 m_winManager; }
谷歌搜索后,我想我需要用平台证书签署我的应用程序。我将 LOCAL_CERTIFICATE 添加到我的 Android.mk 文件中。那没有任何区别。
我的应用程序遵循与标准平台输入命令相同的模型,并且正在构建为平台的一部分。我的应用程序仍然无法访问 IWindowManager。
下面是我的 Android.mk 文件
# 版权所有 2008 Android 开源项目 # LOCAL_PATH:= $(调用我的目录) 包括 $(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 和 shell 脚本推送到目标板 /data/mycom/vnc 文件夹并从 adb shell 启动它。
2013 年 4 月 30 日编辑:
我放弃了这种方法(即构建 J2SE 类型的 jar 并调用主类)。代码编译,但无法绑定到远程绑定器。相反,我创建了一个 Android 服务,并通过 Intents 封装了这个可调用的逻辑。我必须将其构建为 Android 平台源代码的一部分,因为我使用的是私有 api 中的类。我通过这种方式取得了很大的进步。
谢谢