При попытке запуска службы отказано в разрешении - PullRequest
4 голосов
/ 19 ноября 2011

Я пытаюсь получить доступ к 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>

и вот мой след стека:

11-18 15:58:34.732: E/AndroidRuntime(5458): Uncaught handler: thread main exiting due to uncaught exception
11-18 15:58:34.752: E/AndroidRuntime(5458): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mypackage/com.mypackage.MyActivity}: java.lang.SecurityException: Not allowed to start service Intent { cmp=com.mypackage/.MyService} without permission android.permission.BIND_INPUT_METHOD
11-18 15:58:34.752: E/AndroidRuntime(5458):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
11-18 15:58:34.752: E/AndroidRuntime(5458):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
11-18 15:58:34.752: E/AndroidRuntime(5458):     at android.app.ActivityThread.access$2200(ActivityThread.java:119)
11-18 15:58:34.752: E/AndroidRuntime(5458):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
11-18 15:58:34.752: E/AndroidRuntime(5458):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-18 15:58:34.752: E/AndroidRuntime(5458):     at android.os.Looper.loop(Looper.java:123)
11-18 15:58:34.752: E/AndroidRuntime(5458):     at android.app.ActivityThread.main(ActivityThread.java:4363)
11-18 15:58:34.752: E/AndroidRuntime(5458):     at  java.lang.reflect.Method.invokeNative(Native Method)
11-18 15:58:34.752: E/AndroidRuntime(5458):     at java.lang.reflect.Method.invoke(Method.java:521)
11-18 15:58:34.752: E/AndroidRuntime(5458):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
11-18 15:58:34.752: E/AndroidRuntime(5458):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
11-18 15:58:34.752: E/AndroidRuntime(5458):     at dalvik.system.NativeStart.main(Native Method)
11-18 15:58:34.752: E/AndroidRuntime(5458): Caused by: java.lang.SecurityException: Not allowed to start service Intent { cmp=com.mypackage/.MyService } without permission android.permission.BIND_INPUT_METHOD
11-18 15:58:34.752: E/AndroidRuntime(5458):     at android.app.ApplicationContext.startService(ApplicationContext.java:765)
11-18 15:58:34.752: E/AndroidRuntime(5458):     at android.content.ContextWrapper.startService(ContextWrapper.java:326)
11-18 15:58:34.752: E/AndroidRuntime(5458):     at com.mypackage.MyActivity.onCreate(MyActivity.java:94)
11-18 15:58:34.752: E/AndroidRuntime(5458):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11-18 15:58:34.752: E/AndroidRuntime(5458):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
11-18 15:58:34.752: E/AndroidRuntime(5458):     ... 11 more

Есть идеи?

Ответы [ 4 ]

6 голосов
/ 28 ноября 2011

Вы не можете сделать это. Платформа требует, чтобы службы метода ввода требовали разрешения BIND_INPUT_METHOD, и никакие сторонние приложения не могут получить это разрешение. Это важный механизм безопасности, который гарантирует, что только сама платформа может взаимодействовать со службой метода ввода, и никакие приложения не могут подделать платформу, пока пользователь взаимодействует с методом ввода.

Это описано в разделе «Безопасность» здесь: http://developer.android.com/reference/android/view/inputmethod/InputMethodManager.html

Если это служба ввода какого-то другого приложения, это конец истории, единственный способ взаимодействия с ней - через формальную архитектуру IME платформы.

Если это служба метода ввода вашего собственного приложения, вы можете использовать много приемов для взаимодействия с ней, поскольку вы выполняете тот же процесс, что и он. Самое простое - просто установить глобальную переменную объекта службы при его создании, к которой вы можете получить доступ из любого места в вашем приложении.

Если вам действительно нужно перевести службу в запущенное состояние ... ну, вы не можете этого сделать, потому что не так работают методы ввода. Вам нужно будет создать второй сервис, который вы запустите и координируете между двумя сервисами. Опять же, все они должны выполняться в одном и том же процессе, так что вы можете воспользоваться этим, чтобы напрямую вызывать их между собой, чтобы делать любые взаимодействия, которые вы хотите.

5 голосов
/ 19 ноября 2011

Вам необходимо добавить разрешение.

<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>

Вы устанавливаете это неправильно.

1 голос
/ 24 ноября 2011

Еще одно предложение: вам нужно одновременно разрешение android: в службе и разрешение на использование в приложении - вне службы - одновременно

0 голосов
/ 23 ноября 2011

В декларации: Во-первых: удалить точку между моей и пакета Далее - если First не помогает: поставьте точку перед именем сервиса:

...