android.webkit.WebView内で音声入力

android.webkit.WebView内で音声入力

先にHelpfeel Skeletonを見てください。

AndroidWebViewで表示したウェブサイトにマイクアクセスを許可する方法を紹介します。
https://github.com/nota/HelpfeelSkeleton を引用しながら解説します。

コードの全貌はGitHubをご覧ください
主な設定箇所は以下で示す3箇所です
アプリで RECORD_AUDIO 機能, MODIFY_AUDIO_SETTINGS 機能を使用することを宣言します
WebView内でマイクアクセスが試みられたとき (Helpfeel検索ボックスのマイクボタンが押されたとき) に、この関数が実行されます
アプリがマイクアクセス権を有しているかを判断します
ユーザーから許可が得られていない場合は、パーミッション要求のダイアログが開きます
イメージ図
が表示したダイアログにて、ユーザーがマイク使用を許可した際に実行される関数です
マイクが使用できるようになりました

AndroidManifestの設定
main/AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.notainc.helpfeel_skeleton">
<uses-permission android:name="android.permission.INTERNET"/>
<!-- ア -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
</manifest>

WebViewの設定
main/java/com/notainc/helpfeel_skeleton/HelpfeelActivity.kt
class HelpfeelActivity : AppCompatActivity() {
// 適当な識別子を定義
private var PERMISSIONS_AT_WEBVIEW = 0

override fun onCreate(savedInstanceState:Bundle?) {
// ...
this.setWebView()
}

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
// ウ
when (requestCode) {
PERMISSIONS_AT_WEBVIEW -> {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// yay!
val webview: WebView = findViewById(R.id.helpfeel_webview)
webview.reload()
} else if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
// アクセスを拒否された場合
// ...
}
}
}
}

fun setWebView() {
val webview: WebView = findViewById(R.id.helpfeel_webview)
// ...
// イ
webview.webChromeClient = object: WebChromeClient() {
override fun onPermissionRequest(request: PermissionRequest) {
val permissionCheck = checkSelfPermission(activity, Manifest.permission.RECORD_AUDIO)
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
requestPermissions(activity, arrayOf(Manifest.permission.RECORD_AUDIO), PERMISSIONS_AT_WEBVIEW)
} else {
request.grant(request.resources)
}
}
}
// ...
webview.loadUrl(this.helpfeelUrl)
}
}

上記でandroid.webkit.WebView内で音声入力に対応します。
Powered by Helpfeel