当前位置: 首页 > 面试题库 >

Android要求获得在Webview中使用位置的权限

姬振濂
2023-03-14
问题内容

我有一个使用webview的应用程序,并且webview内有一个地图,我可以使用以下代码来让用户自动找到用户的位置:

清单文件权限:

<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" />

WebView活动:

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

    WebViewSettings();

    LoadWebPage(urlString);
}

WebView设置:

@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);
    }
}

因此,这是可行的,但是它会自动获取用户的位置,而不会提示用户该应用程序是否可以使用位置服务。

有没有办法将此功能添加到应用程序?谢谢


问题答案:

那是因为您需要创建提示。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();


 类似资料:
  • 如何在android中使用webView获取oAuth2令牌?我知道如何创建一个webview并打开url以获取oAuth2令牌,但我不知道如何在获取后从webview切换回应用程序,并将oAuth2token复制到变量中,有人知道如何做到这一点或知道一个好的tut吗?p、 s.我正在尝试获取oAuth2令牌以访问google api

  • 晚上好我正在使用Webview在Android上制作跟踪应用程序。我遇到了问题,因为该系统在该位置附近运行良好。我试过Grishma Ukani先生的一些方法(非常感谢)。 一切顺利,没有错误。但仍然无法获得设备位置/权限,然后这些信息就会出现在android studio上 E/cr_LocationProvider:从系统注册位置更新时捕获安全异常应用程序没有足够的地理定位权限E/cr_Loc

  • 我一直在尝试使用andriod中的融合位置应用程序接口获取位置(lat/lon)。当wifi和gps都打开时,我的代码运行良好。如果我关闭gps,那么我不会得到任何位置更新。 我正在使用BALANCED_POWER_ACCURACY进行位置请求。我在清单中添加了Access_FINE_Location权限,并在我的build.gradle文件中使用了播放服务版本9.2.1。 我正在真实设备上进行测

  • 问题内容: 我正在尝试从Webview中的javascript界面​​开始一项活动。该示例显示了一个烤面包。我怎么能称呼课程而不是敬酒? 这是html页面。 问题答案: 您必须先在Webview上注册JavaScriptInterface。JavaScriptInterFace可以是一个内部类,如下所示。此类将具有您可以从html页面(通过javaScript)调用的函数,并且可以在该函数内部编写

  • 问题内容: 我正在尝试通过“典型”权限框来获取用户的实际位置: 如果有人知道如何制作,请回答。 问题答案: 在运行时要求使用设备当前位置的权限如下:

  • 问题内容: 用下面的MySQL表: 当按排序时,如何选择 单行 及其在表中其他行中的位置。因此,如果表数据看起来像这样,按名称排序时: 如何选择要获取该行当前位置的行?我正在寻找的结果集将是这样的: 我可以做一个简单的操作,然后枚举PHP中的行,但是仅为单个行加载可能较大的结果集似乎很浪费。 问题答案: 用这个: …以获得唯一的位置值。这个: …将赋予领带相同的价值。IE:如果第二个值有两个,则当