Android 当我尝试启动服务时,权限被拒绝

Android 当我尝试启动服务时,权限被拒绝,android,service,android-activity,permissions,android-input-method,Android,Service,Android Activity,Permissions,Android Input Method,我试图从活动访问InputMethodService,但遇到权限问题。这是一个自定义键盘应用程序 我试图实现的是将在活动中创建的文本绑定回InputMethodService。活动是从输入方法服务打开的,然后从活动,我尝试启动服务(这可能是问题所在。下面是我如何从输入方法服务打开活动: @Override public void onStartInputView(EditorInfo attribute, boolean restarting) { super.onStartIn

我试图从
活动
访问
InputMethodService
,但遇到权限问题。这是一个自定义键盘应用程序

我试图实现的是将在
活动中创建的文本绑定回
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
通信的地方:

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

有什么想法吗?

您需要添加权限

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

您设置错误。

在清单中: 首先:删除dot btw和my软件包
下一步-如果First不起作用:在服务名称前面加一个点:

另一个建议:您需要服务中的android:权限和应用程序中的uses权限-在服务之外-同时

您不能这样做。平台要求输入法服务需要BIND\u输入法权限,并且没有第三方应用程序可以获得该权限。这是一种重要的安全机制,可以确保只有平台本身可以与输入法服务交互,并且在用户与输入法交互时,没有应用程序可以欺骗平台

此处的“安全”部分对此进行了说明:

如果这是其他应用程序的输入法服务,那就到此为止,与之交互的唯一方式就是通过平台的正式IME架构

如果这是您自己的应用程序的输入法服务,您可以使用许多技巧与之交互,因为您正在与之相同的进程中运行。最简单的方法是在创建服务对象时将其设置为全局变量,您可以从应用程序中的其他位置访问该变量


如果您真的需要将服务置于started状态…那么,您不能这样做,因为这不是输入法的工作方式。您需要创建第二个服务来启动并在两个服务之间进行协调。同样,这些服务都应该在同一个进程中运行,因此您可以利用这一点直接调用b他们之间可以进行任何交互。

消息中说您需要权限android.permission.BIND\u INPUT\u方法。为什么不将其添加到清单文件中?如果我将权限从服务中删除,则键盘将不会显示为可能的输入方法。此外,我尝试在您拥有权限的位置添加权限,并且设置相同的错误。首先:如果在my之前删除点,则会破坏清单文件路径。其次,前面的点实际上没有任何作用。如果它不存在,则假定它是存在的。这个答案对任何事情都没有帮助。我不是说“my之前的点”-我建议将“package=”com.my.package“”替换为“package=”com.mypackage“,但根据stacktrace,它似乎是在生成stacktrace后出现的打字错误,因为.Activity被com.mypackage.Activity替换-名称前面的点被包字符串替换。
<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>