Веб-браузер Android не отправляет геолокации в JavaScript - PullRequest
1 голос
/ 05 ноября 2019

Я пишу приложение, которое получает местоположение пользователя и отправляет его на сервер. Я использую JavaScript и PHP на стороне сервера. Я пытаюсь загрузить это приложение на Android WebView, и оно не отправляет местоположение в JavaScript, чтобы оно могло быть отправлено на сервер через ajax, но когда я запускаю его на своем мобильном устройстве с помощью Chrome, оно работает правильно. Пожалуйста, мне нужно знать, что я делаю неправильно. Мой код Android вставлен ниже

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    myWebview = (WebView) findViewById(R.id.webview);
    WebSettings websettings = myWebview.getSettings();

    myWebview.setWebViewClient(new WebViewClient());
    websettings.setJavaScriptEnabled(true);
    websettings.setJavaScriptCanOpenWindowsAutomatically(true);
    websettings.setGeolocationDatabasePath( getFilesDir().getPath() );

    myWebview.setWebChromeClient(new WebChromeClient() {
        public void onGeolocationPermissionsShowPrompt(String origin, 
           GeolocationPermissions.Callback callback) {
            callback.invoke(origin, true, false);
        }
    });

    websettings.setAppCacheEnabled(true);
    websettings.setDatabaseEnabled(true);
    websettings.setDomStorageEnabled(true);

    myWebview.loadUrl("https://example.com/proj/");
}

Я уже получил необходимое разрешение в файле манифеста Android.

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Код ниже - это мой JavaScript, который обрабатывает местоположение

function getLocation() {

    if (navigator.geolocation) {
      navigator.geolocation.getCurrentPosition(reportLocation, showError);

    } else { 
      $$('locationFeedbackText').innerHTML = "Geolocation is not supported by this Devide.";
    }
  }

  function showError(error) {

  switch(error.code) {
    case error.PERMISSION_DENIED:
      $$('locationFeedbackText').innerHTML = "User denied the request for Geolocation.";
      break;
    case error.POSITION_UNAVAILABLE:
      $$('locationFeedbackText').innerHTML = "Location information is unavailable.";
      break;
    case error.TIMEOUT:
      $$('locationFeedbackText').innerHTML = "The request to get user location timed out.";
      break;
    case error.UNKNOWN_ERROR:
      $$('locationFeedbackText').innerHTML = "An unknown error occurred.";
      break;
  }
}

Когда я нажимаю кнопку в пользовательском интерфейсе, предполагается, что местоположение пользователя отправляется на сервер, и отображается сообщение об успешном завершении, но выводимое сообщение является сообщением из функции showError «Местоположение недоступноИмейте в виду, что это приложение работает должным образом, когда оно загружено с Chrome на моем мобильном устройстве.

1 Ответ

0 голосов
/ 11 ноября 2019

Попробуйте - разрешение добавлено

package com.nony.myapplication;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.webkit.GeolocationPermissions;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends AppCompatActivity {

    WebView myWebview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //added this line for permission request
        ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
        myWebview = (WebView) findViewById(R.id.webview);
        WebSettings websettings = myWebview.getSettings();

        myWebview.setWebViewClient(new WebViewClient());
        websettings.setJavaScriptEnabled(true);
        websettings.setJavaScriptCanOpenWindowsAutomatically(true);
        websettings.setGeolocationDatabasePath(getFilesDir().getPath());

        myWebview.setWebChromeClient(new WebChromeClient() {
            public void onGeolocationPermissionsShowPrompt(String origin,
                                                           GeolocationPermissions.Callback callback) {
                callback.invoke(origin, true, false);
            }
        });

        websettings.setAppCacheEnabled(true);
        websettings.setDatabaseEnabled(true);
        websettings.setDomStorageEnabled(true);

        myWebview.loadUrl("https://example.com/proj/");
    }


    //newly added for permission
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case 1: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                } else {
                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                }
                return;
            }
            // other 'case' lines to check for other
            // permissions this app might request
        }
    }


    public boolean checkLocationPermission()
    {
        String permission = "android.permission.ACCESS_FINE_LOCATION";
        int res = this.checkCallingOrSelfPermission(permission);
        return (res == PackageManager.PERMISSION_GRANTED);
    }

}
...