Androidアプリ開発にて困った場面が。
- アプリ内にWebViewを組み込んでいる
- その中でカメラを起動させたい
- なぜかカメラが起動してくれない...
パーミッション付与だけでは不十分でした。
いくつか注意点みたいなのがあるので、
Android+WebViewでカメラ起動させる方法をメモ
このページの目次
1.起動時にカメラのパーミッションを許可させる
まずは基本中の基本から
カメラのパーミッション(権限)の追加
このような手順で追加してみてください。
AndroidManifest.xmlにパーミッション追加
まずはカメラ権限を付与してあげます。
▼ AndroidManifest.xmlに次を追加
1 2 |
<!-- カメラを許可 --> <uses-permission android:name="android.permission.CAMERA" /> |
追加する場所はmanifest要素の直下とかでOKだと思います。ただしカメラ起動にはAndroidManifest.xmlへの権限追加だけでは不十分です。(カメラ起動などのプライベートな権限はアプリ起動時に許可が必要)
アプリ起動時にカメラ起動の許可を取る
AndroidManifest.xmlへの追加だけでは不十分
アプリ起動時に許可ダイアログ表示も必要です。
▼ Activity#onCreate に次コードを追加(kotlin)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/// パーミッション許可を取る if (Build.VERSION.SDK_INT >= 23) { if ( ActivityCompat.checkSelfPermission( this, Manifest.permission.CAMERA ) != PackageManager.PERMISSION_GRANTED ) { ActivityCompat.requestPermissions( this, arrayOf( //Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA ), 12345 ) } } |
実は APIレベル >= 23 以降はこのような許可ダイアログの表示が必須になりました。(昔はAndroidManifest.xmlに追加するだけのユルユル権限だった。。。)
より詳しくは次記事で解説してあります。
▼ Androidでパーミッション許可ダイアログの出し方
もし詳しい実装が知りたいなら参照してください。
2.WebViewでonPermissionRequestをオーバーライド
これは僕自身も盲点でした。
カメラ起動にはこの処理も必要です。
▼ WebChromeClient#onPermissionRequestをオーバーライド
1 2 3 4 5 6 7 8 9 10 11 12 |
webView = findViewById(R.id.web_view); /// 関係ないので中略... webView.webChromeClient = object : WebChromeClient(){ override fun onPermissionRequest(request: PermissionRequest) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { /// パーミッションを許可 request.grant(request.resources) } } }; |
カメラ起動にはパーミッション許可ダイアログを出すだけではなく、WebViewに対してWebChromeClient#onPermissionRequestのオーバーライドも必須みたいです。
これが分からなくて数時間うんうん悩んでました(-_-;)。もしカメラ起動したいなら、必ずWebViewに対してもカメラ起動を許可するようにしてください。(この表現で正しいのかな?)
3.WebView側で基本設定が抜けていないかもチェック
WebViewで基本設定を忘れてる場合もあります。
こういった設定も抜けてないか確認してください。
▼ WebViewSettingsの基本設定を設定
1 2 3 4 5 6 |
/// JavaScript実行許可 webView.settings.javaScriptEnabled = true; /// ファイルアクセスを許可 webView.settings.allowFileAccess = true; /// localStorage仕様を許可 webView.settings.domStorageEnabled = true; |
こういった基本設定も有効にしておくと無難。
僕の場合、上記設定でカメラ起動できました。
WebViewでカメラ起動しない時のチェックリスト
ということで箇条書きでまとめます。
この3点をとりあえず確認しておけばOKです。
以上、WebViewでカメラ起動しない時の対処でした。ではまた