Android Запросить разрешение на использование местоположения в веб-просмотре

У меня есть приложение, которое использует веб-просмотр, а внутри веб-просмотра есть карта, я заставил его работать, чтобы пользователь автоматически находил местоположение пользователей со следующим кодом:

Разрешения файла манифеста:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />
<uses-permission android:name="android.permission.ACCESS_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Активность в веб-просмотре:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.map_layout);

    WebViewSettings();

    LoadWebPage(urlString);
}

Настройки веб-представления:

@SuppressLint("SetJavaScriptEnabled")
public void WebViewSettings(){

    webView = (WebView) findViewById(R.id.webview);
    webView.canGoBack();

    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    webView.getSettings().setBuiltInZoomControls(true);
    webView.getSettings().setSupportZoom(true);
    webView.getSettings().setLoadWithOverviewMode(true);
    webView.setWebViewClient(new WebViewClientSetup());
    webView.setWebChromeClient(new GeoWebChromeClient());
    webView.getSettings().setGeolocationEnabled(true);

    myTimer = new Timer();
    //Start this timer when you create you task
    myTimer.schedule(new loaderTask(), 20000);

}

WebViewClient:

public class WebViewClientSetup extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        return false;
    }

    @Override
    public void onLoadResource(WebView view, String url) {
        // Check to see if there is a progress dialog
        if (progressDialog == null) {
            progressDialog = new ProgressDialog(context);
            progressDialog.setTitle("Loading...");
            progressDialog.setMessage("Please wait.");
            progressDialog.setCancelable(true);
            progressDialog.setIndeterminate(true);
            progressDialog.show();
        }
    }

    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler,
            SslError error) {
        handler.proceed();
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        isPageLoadedComplete = true;
        View mapHeight = (View) findViewById(R.id.webview);
        int height = mapHeight.getHeight();
        Log.d("map height", "map height" + height);
        // Page is done loading;
        // hide the progress dialog and show the webview
        if (progressDialog.isShowing()) {
            progressDialog.dismiss();
        }
    }

    @Override
    public void onReceivedError(WebView view, int errorCod,
            String description, String failingUrl) {
        AlertDialog();
    }
}

WebChromeClient:

public class GeoWebChromeClient extends WebChromeClient {
    @Override
    public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
        callback.invoke(origin, true, false);
    }
}

Так что это работает, но автоматически получает местоположение пользователя, не запрашивая пользователя, может ли приложение использовать службы определения местоположения.

Есть ли способ добавить эту функцию в приложение? Спасибо


person Paddy1990    schedule 06.05.2014    source источник
comment
medium.com/@xabaras/   -  person Shahab Rauf    schedule 21.01.2019


Ответы (1)


Это потому, что вам нужно создать подсказку. Функция onGeolocationPermissionsShowPrompt просто вызывается, чтобы вы знали, что веб-странице нужно местоположение.

callback.invoke(origin, true, false); — это ответ, сообщающий WebView, что можно использовать местоположение.

Последний аргумент заключается в том, следует ли запоминать эту настройку. См.: http://developer.android.com/reference/android/webkit/GeolocationPermissions.Callback.html

Пример:

AlertDialog.Builder adb = new AlertDialog.Builder(context);
..... //set up title, message, etc
adb.setNegativeButton(android.R.string.ok, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int which) {
        callback.invoke(origin, false, false);
    }
});
adb.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int which) {
        callback.invoke(origin, true, false);
    }
});
adb.show();
person Randy    schedule 06.05.2014
comment
Великолепно, это то, что я ищу, спасибо за помощь, некоторое время боролся с этим. - person Paddy1990; 06.05.2014