【问题标题】:Is it possible to prompt a permission request from IME on Android without losing focus on the IME itself?是否可以在不失去对 IME 本身的关注的情况下在 Android 上提示来自 IME 的权限请求?
【发布时间】:2023-03-24 21:13:02
【问题描述】:

我正在开发一个需要访问麦克风以进行语音识别的自定义键盘。实际使用语音识别的系统已经到位,但我想提示用户仅在他们按下麦克风按钮的那一刻给予许可。问题是我习惯使用的代码

if (ContextCompat.checkSelfPermission(...) == PackageManager.PERMISSION_DENIED) {
   ActivityCompat.requestPermissions(activity, permissions, 0);
}

需要一个我无法从输入法服务访问的活动。实际上,我设法通过创建一个新活动并在那里传递所有权限请求来使其工作,但我希望它在这样做时不要隐藏键盘。以下是我启动新 Activity 的方式:

Intent intent = new Intent(this, PermissionsActivity.class); //this being the Input Method Service
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.putExtra(PermissionsActivity.PERMISSIONS_EXTRA, permissionsArray);

有没有另一种更好的方法来实现这一点,而无需创建 Activity 或避免隐藏键盘?

【问题讨论】:

  • 并非如此。 IME 是一项服务。您只能从 Activity 请求权限。您可以尝试弹出一个透明的 Activity 而不是调用 setContentView 并在您获得对权限的响应(正面或负面)后立即完成 Activity。它可能工作。
  • 这就是我所做的,它工作得还不错。唯一的问题是,一旦 Activity 启动,键盘就会被隐藏,无论用户选择做什么(拒绝请求或授予权限),他们都必须重新打开键盘并重新按下按钮。我希望键盘保持可见,能够响应请求结果。我意识到这只是一件小事,只会在他们第一次尝试使用语音识别时发生,但我想知道是否有办法实现这一点,因为像 gboard 这样的其他键盘可以做到这一点。

标签: java android android-studio


【解决方案1】:

我一直在捕捉权限错误,然后启动一个半透明的活动来请求权限,如下所示:

if (errorCode == SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS) {
    Intent intent = new Intent(SpeechInputMethodService.this, PermissionsRequesterActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    SpeechInputMethodService.this.startActivity(intent);
}

(完整代码见https://github.com/Kaljurand/K6nele/blob/6aa44a8b6df680f0f8355572ef0cc0bc7224bf00/app/src/main/java/ee/ioc/phon/android/speak/service/SpeechInputMethodService.java#L547-L551

在这种情况下,键盘没有隐藏。但也许有更好的方法。

【讨论】:

  • 似乎我们使用基本相同的代码来启动活动,但它会关闭键盘并打开设置应用程序。你是说这不会发生在你身上?
  • 是的,就我而言,它(通常)不会关闭键盘。但这似乎还取决于哪些活动在后台堆栈中以及 NEW_TASK 标志的确切行为方式(我从未完全理解)。您可以自己使用 Kõnele 应用程序进行尝试。
猜你喜欢
  • 2014-10-01
  • 1970-01-01
  • 2012-10-09
  • 2012-11-09
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
相关资源
最近更新 更多