java.lang.SecurityException:没有权限android.permission.BIND_INPUT_METHOD仅适用于< = 2.2

时间:2012-03-29 12:30:45

标签: android android-intent android-service android-input-method android-version

我有这个非常特别的例外。事情是我有这个应用程序有一个按钮开始

 InputMethodService

就像这样开始

public class MyGroovyIme extends InputMethodService {

这就是它在清单中的样子。

  <service
        android:name=".MyGroovyIme"
        android:enabled="true"
        android:exported="true"
        android:permission="android.permission.BIND_INPUT_METHOD" >
        <intent-filter>
            <action android:name="android.view.InputMethod" />
            <!-- <category android:name="android.intent.category.DEFAULT" /> -->
        </intent-filter>

        <meta-data
            android:name="android.view.im"
            android:resource="@xml/method" />
    </service>

这就是我开始服务的方式

  void startServer() {
    Log.v(TAG, "Starting service...");
    Intent serviceIntent = new Intent(this, MyGroovyIme.class);
    startService(serviceIntent);
    Log.v(TAG, "Starting service...success!!!");
    // this.finish();
    Log.v(TAG, "finish called...");
}
当我在平板电脑(Moto XOOM,它的3.2)上运行时,整个设置就像一个魅力,但是当我在2.2和2.1上运行的设备上执行它时(我没有尝试过2.3并且无法使用模拟器)是我得到的

 java.lang.SecurityException: Not allowed to start service Intent { cmp=com.spp.ime.demo/.MyGroovyIme } without permission android.permission.BIND_INPUT_METHOD
at android.app.ContextImpl.startService(ContextImpl.java:840)
at android.content.ContextWrapper.startService(ContextWrapper.java:336)
at com.spp.ime.demo.GROOVY_IME_DEMOActivity.startServer(GROOVY_IME_DEMOActivity.java:137)
at com.spp.ime.demo.GROOVY_IME_DEMOActivity.onStartClick(GROOVY_IME_DEMOActivity.java:104)
at com.spp.ime.demo.GROOVY_IME_DEMOActivity.onClick(GROOVY_IME_DEMOActivity.java:67)
at android.view.View.performClick(View.java:2408)
at android.view.View$PerformClick.run(View.java:8816)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4633)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at dalvik.system.NativeStart.main(Native Method)

我确实理解安全问题,但不应该对所有设备都一样,或者我缺少某些特定于版本的内容&lt; 3.2

2 个答案:

答案 0 :(得分:0)

经过长时间的搜索没有找到可靠的答案,仍然没有确切的原因.. 但是,通过新功能发现,在更高版本中添加的硬件功能可能会导致Android操作系统的这种宽容。 以下是描述Android here

主要更新的链接

答案 1 :(得分:0)

// only work for pre-lolipop
<uses-permission 
    android:name="android.permission.BIND_INPUT_METHOD" 
    tools:ignore="ProtectedPermissions" 
    android:protectionLevel="signature" />

<service 
    android:name="SimpleIME" 
    android:permission="android.permission.BIND_INPUT_METHOD" 
    android:protectionLevel="signature">

    <intent-filter>
        <action android:name="android.view.InputMethod" />
    </intent-filter>
    <meta-data 
        android:name="android.view.im" 
        android:resource="@xml/method" />
</service>

<supports-screens 
    android:anyDensity="true" 
    android:largeScreens="true" 
    android:normalScreens="true" 
    android:smallScreens="true" />