我有一个非常不安全的异常。问题是我有这个应用程序,它有一个启动的按钮
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)
我确实理解安全问题,但不应该对所有设备都是一样的,或者我是否缺少特定于<3.2
经过长时间的搜索,仍然没有找到可靠的答案,也没有得到确切的原因。。但通过对新功能的研究发现,在后来的版本中添加的硬件功能可能导致了安卓操作系统的这种宽容。这里是描述Android主要更新的链接
// 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" />