4

InputMethodServiceからにアクセスしようとしてActivityいますが、権限に関する問題が発生しています。これは、カスタム キーボード アプリ用です。

私が達成しようとしているのは、Activity後ろで作成されたテキストを にバインドすることInputMethodServiceです。はActivityから開かれInputMethodService、次に からActivityを起動しようとします (これが問題である可能性があります。からServiceを開く方法は次のとおりです。ActivityInputMethodService

    @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);

}

から と通信しようとする場所は次InputMethodServiceActivityとおりです。

    @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

4 に答える 4

6

これはできません。プラットフォームでは、インプット メソッド サービスに BIND_INPUT_METHOD パーミッションが必要であり、サード パーティのアプリケーションはそのパーミッションを取得できません。これは、プラットフォーム自体のみがインプット メソッド サービスと対話できるようにするための重要なセキュリティ メカニズムであり、ユーザーがインプット メソッドと対話している間、アプリケーションはプラットフォームを偽装できません。

これについては、次の「セキュリティ」セクションで説明しています: http://developer.android.com/reference/android/view/inputmethod/InputMethodManager.html

これが他のアプリのインプット メソッド サービスである場合、それで話は終わりです。それと対話する唯一の方法は、プラットフォームの正式な IME アーキテクチャを使用することです。

これが独自のアプリのインプット メソッド サービスである場合、それと同じプロセスで実行されているため、操作に使用できる多くのトリックがあります。最も簡単な方法は、作成時にサービス オブジェクトのグローバル変数を設定することです。このグローバル変数には、アプリの他の場所からアクセスできます。

実際にサービスを開始状態にする必要がある場合は...まあ、それはできません。入力メソッドが機能しないためです。2 つのサービスを開始して調整する 2 つ目のサービスを作成する必要があります。繰り返しますが、これらはすべて同じプロセスで実行されている必要があるため、それを利用して、それらの間で直接呼び出して、必要な対話を行うことができます。

于 2011-11-28T03:36:50.743 に答える
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>

あなたはそれを間違って設定しています。

于 2011-11-18T21:45:54.570 に答える
1

別の提案: サービス内の android:permission とアプリケーション内の uses-permission (サービス外) の両方が同時に必要です。

于 2011-11-23T23:39:14.257 に答える
-1

マニフェスト: 最初: my と package Next の間のドットを削除します - First が役に立たない場合: サービス名の前にドットを置きます:

于 2011-11-23T15:57:58.367 に答える