0

I have softkeyboard service and setting activity in one project. when softkeyboard is running, setting activity is softkeyboard end and start. but, I received the log.

log is

07-03 11:15:08.969: E/AndroidRuntime(8340): FATAL EXCEPTION: main 07-03 11:15:08.969: E/AndroidRuntime(8340): java.lang.SecurityException: Not allowed to start service Intent { cmp=com.example.android.softkeyboard/.SoftKeyboard } without permission android.permission.BIND_INPUT_METHOD
07-03 11:15:08.969: E/AndroidRuntime(8340):     at android.app.ContextImpl.startService(ContextImpl.java:836)
07-03 11:15:08.969: E/AndroidRuntime(8340):     at android.content.ContextWrapper.startService(ContextWrapper.java:336)
07-03 11:15:08.969: E/AndroidRuntime(8340):     at com.example.android.softkeyboard.MakeKeyActivity.SaveTotxt(MakeKeyActivity.java:213)
07-03 11:15:08.969: E/AndroidRuntime(8340):     at com.example.android.softkeyboard.MakeKeyActivity.onOptionsItemSelected(MakeKeyActivity.java:144)
07-03 11:15:08.969: E/AndroidRuntime(8340):     at android.app.Activity.onMenuItemSelected(Activity.java:2205)
07-03 11:15:08.969: E/AndroidRuntime(8340):     at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:749)
07-03 11:15:08.969: E/AndroidRuntime(8340):     at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:143)
07-03 11:15:08.969: E/AndroidRuntime(8340):     at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:859)
07-03 11:15:08.969: E/AndroidRuntime(8340):     at com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:581)
07-03 11:15:08.969: E/AndroidRuntime(8340):     at com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:127)
07-03 11:15:08.969: E/AndroidRuntime(8340):     at android.view.View$PerformClick.run(View.java:9099)
07-03 11:15:08.969: E/AndroidRuntime(8340):     at android.os.Handler.handleCallback(Handler.java:587)
07-03 11:15:08.969: E/AndroidRuntime(8340):     at android.os.Handler.dispatchMessage(Handler.java:92)
07-03 11:15:08.969: E/AndroidRuntime(8340):     at android.os.Looper.loop(Looper.java:123)
07-03 11:15:08.969: E/AndroidRuntime(8340):     at android.app.ActivityThread.main(ActivityThread.java:3683)
07-03 11:15:08.969: E/AndroidRuntime(8340):     at java.lang.reflect.Method.invokeNative(Native Method)
07-03 11:15:08.969: E/AndroidRuntime(8340):     at java.lang.reflect.Method.invoke(Method.java:507)
07-03 11:15:08.969: E/AndroidRuntime(8340):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
07-03 11:15:08.969: E/AndroidRuntime(8340):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
07-03 11:15:08.969: E/AndroidRuntime(8340):     at dalvik.system.NativeStart.main(Native Method)

I gave permission to manifest

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
        package="com.example.android.softkeyboard">

    <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>

    <application android:label="aabbccdd">


        <activity
            android:name=".CustomKeyboardActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity 
            android:name=".MakeKeyActivity"
            android:label="@string/app_name">
        </activity>
        <activity 
            android:name=".MakeDictionaryActivity"
            android:label="@string/app_name">
        </activity>
        <activity 
            android:name=".UpandDownActivity"
            android:label="@string/app_name">
        </activity>


        <service 
                android:exported="true"
                android:enabled="true" 
                android:name=".SoftKeyboard"
                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>
        <uses-permission android:name="android.permission.BIND_INPUT_METHOD"/>

    </application>
</manifest>

I call this code.

Intent intent=new Intent(this,SoftKeyboard.class);
stopService(intent);
startService(intent);

I gave permission but, why request permission ?

Lucifer
  • 29,392
  • 25
  • 90
  • 143
user1320165
  • 331
  • 1
  • 3
  • 8

1 Answers1

2

It looks like you have your <uses-permission> element as a child of your <application> element. It should be at the same level as <application> under the <manifest> element.

In other words, change the last few lines from this:

    </service>
    <uses-permission android:name="android.permission.BIND_INPUT_METHOD"/>
  </application>
</manifest>

to this:

    </service>
  </application>
  <uses-permission android:name="android.permission.BIND_INPUT_METHOD"/>
</manifest>
Darshan Rivka Whittle
  • 32,989
  • 7
  • 91
  • 109
  • Thank you for your answer. but, Still request permission. – user1320165 Jul 10 '12 at 00:41
  • @user1320165 Sorry, I hadn't paid very close attention; I was only pointing out the most obvious error. Looking more closely now, I'm a bit confused about what you're doing. You don't need the `uses-permission` part at all, and I've not yet built a custom input method, but I don't believe you would normally ever start or stop an InputMethodService yourself. – Darshan Rivka Whittle Jul 10 '12 at 04:00
  • @user1320165 I believe [this answer](http://stackoverflow.com/a/8291258/1427098) to a very similar question explains why you can't do what you're trying to do and how to work around it. – Darshan Rivka Whittle Jul 10 '12 at 04:01