我尝试启动Service时拒绝权限

时间:2011-11-18 21:26:17

标签: android service android-activity permissions android-input-method

我正在尝试从InputMethodService访问Activity,我遇到了权限问题。这适用于自定义键盘应用。

我想要实现的是将Activity中创建的文本绑定回InputMethodService。从Activity打开InputMethodService,然后从Activity打开,我尝试启动Service(这可能是问题。以下是我打开{{}的方式来自Activity

的1}}
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>

有什么想法吗?

4 个答案:

答案 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没有帮助:在服务名称前加一个点: