我正在尝试从InputMethodService
访问Activity
,我遇到了权限问题。这适用于自定义键盘应用。
我想要实现的是将Activity
中创建的文本绑定回InputMethodService
。从Activity
打开InputMethodService
,然后从Activity
打开,我尝试启动Service
(这可能是问题。以下是我打开{{}的方式来自Activity
:
InputMethodService
以下是我尝试与 @Override public void onStartInputView(EditorInfo attribute, boolean restarting) {
super.onStartInputView(attribute, restarting);
Intent intent = new Intent(this, MyKeyboard.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
context.startActivity(intent);
}
:
InputMethodService
进行通信的地方
Activity
这是我的清单文件:
@Override
public void onCreate(Bundle bundle){
super.onCreate(bundle);
setContentView(R.xml.keyboard);
startService(new Intent(this, MyService.class));
}
这是我的堆栈跟踪:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.my.package">
<application android:label="@string/ime_name">
<service android:name="MyService"
android:permission="android.permission.BIND_INPUT_METHOD">
<intent-filter>
<action android:name="android.view.InputMethod" />
</intent-filter>
<meta-data android:name="android.view.im" android:resource="@xml/method" />
</service>
<activity android:name=".MyKeyboard" android:theme="@style/Theme.Transparent">
</activity>
</application>
有什么想法吗?
答案 0 :(得分:6)
你不能这样做。该平台要求输入法服务需要BIND_INPUT_METHOD权限,并且没有第三方应用程序可以获得该权限。这是一个重要的安全机制,可以确保只有平台本身可以与输入法服务交互,并且当用户与输入法交互时,没有应用程序可以欺骗平台。
此处的“安全性”部分对此进行了描述:http://developer.android.com/reference/android/view/inputmethod/InputMethodManager.html
如果这是其他应用程序的输入法服务,那就是故事的结尾,与之交互的唯一方法是通过该平台的正式IME架构。
如果这是您自己的应用程序的输入法服务,那么您可以使用许多技巧与它进行交互,因为您在与它相同的过程中运行。最简单的方法是让它在创建服务对象时设置一个全局变量,您可以从应用程序的其他地方访问该变量。
如果你真的需要实际将服务置于启动状态......好吧,你不能这样做,因为那不是输入方法的工作方式。您需要创建第二个服务,然后启动并协调两个服务。同样,这些都应该在同一个过程中运行,因此您可以利用它直接在它们之间调用以进行您想要的任何交互。
答案 1 :(得分:5)
您需要添加权限。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.my.package">
<application android:label="@string/ime_name">
<service android:name="MyService">
<intent-filter>
<action android:name="android.view.InputMethod" />
</intent-filter>
<meta-data android:name="android.view.im" android:resource="@xml/method" />
</service>
<activity android:name=".MyKeyboard" android:theme="@style/Theme.Transparent">
</activity>
<uses-permission android:name="android.permission.BIND_INPUT_METHOD"/>
</application>
你说错了。
答案 2 :(得分:1)
另一个建议:你需要服务中的android:权限和应用程序中的uses-permission - 同时服务 -
答案 3 :(得分:-1)
在清单中: 首先:删除我和包之间的点 下一步 - 如果First没有帮助:在服务名称前加一个点: