/ アプリ内に埋め込まれたブラウザを使用している場合、Androidのウェブページからアクセスできない - javascript、android、delphi、geolocation、twebbrowser

アプリケーションに埋め込まれたブラウザを使用している場合、Androidのウェブページからジオロケーションにアクセスできません - javascript、android、delphi、geolocation、twebbrowser

使っています navigator.geolocation.getCurrentPosition() ユーザーの現在地を取得します。 これらのWebページ上の位置情報機能は、iOSとAndroidの両方のWebブラウザに直接ロードされたときに正常に機能します。ユーザーは場所へのアクセスを許可するかどうか尋ねられ、そこから移動します。どのWebブラウザやOSが問題ないのか - 彼らはすべてうまく動作します。

ただし、同じWebページがWebブラウザに読み込まれている場合 アプリに埋め込まれている Android(この場合はTWebBrowserコンポーネント)で動作していると、位置情報サービスは機能しません。への呼び出し navigator.geolocation.getCurrentPosition() 結果は permission_denied エラーメッセージ。ユーザーは場所へのアクセスを許可するかどうか尋ねられません。 permission_deniedエラーが発生します。

私がチェックした明白なもののいくつか:

  • コードの前には if (navigator.geolocation) { だから私はそれを知っている ジオロケーション機能があります。
  • このアプリケーションは、ロケーションサービスへのアクセス許可をもとにビルドされ、デプロイされます。このサービスは、コード内の他の場所でアプリケーションがロケーションサービスにアクセスする際に正常に動作します(ブラウザ、 あれは)。
  • 権限が拒否されたのは、Webページがアプリに埋め込まれたWebブラウザに読み込まれたときにのみ発生します。
  • Androidでのみ発生します。 iOSは正常に動作します。
  • アプリに埋め込まれたウェブブラウザは、デバイスで使用可能なネイティブWebブラウザつまり、使用されているWebブラウザは特別なカスタマイズされたものではありません。このアプリはDelphi Firemonkeyを使用して構築され、TWebBrowserコンポーネントを使用します。

私はいくつかのAndroidデバイスでさまざまなAndroidバージョンを最新のv6まで使い、すべて同じように動作します。それは、私がいくつかのAndroid OSの "機能"に慣れていると思うようになります。私のアプリケーションの機能はウェブページからの位置情報サービスへのアクセスにも依存するため、周囲には何か方法はありますか?

回避策として、アプリケーションから呼び出すときに、現在の場所をパラメータでWebページに渡しています。しかし、ユーザーが移動したときにWatchLocationを使用してマップ上の位置を更新することはできません。

回答:

回答№1の場合は3

このコードを使用して最初に権限を確認することができます

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
//    ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
//   public void onRequestPermissionsResult(int requestCode, String[] permissions,
//                                          int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}