【问题标题】:Enable GeoLocation On Webview在 Webview 上启用地理位置
【发布时间】:2018-07-17 13:58:41
【问题描述】:

晚上好。我正在使用 Webview 在 Android 上制作跟踪应用程序。我遇到了问题,因为系统在该位置旁边运行良好。

在清单中我已经获得了此权限设置

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

在 mainactivity.java 我得到了这个

public class MainActivity extends AppCompatActivity {

public WebView webView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);

    webView = (WebView)findViewById(R.id.webView);
    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webView.loadUrl("https://www.primaniagatracking.com/slogin.php");
    webView.setWebViewClient(new WebViewClient());
}}

我不知道通过总是出现请求许可或其他东西来使其正常工作可能缺少什么。需要很大的帮助。谢谢。我已经搜索了一些有关启用权限的模板,但出现了很多错误。

【问题讨论】:

    标签: java android webview


    【解决方案1】:

    首先是 Android 清单:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.webview"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk android:minSdkVersion="5" />
    
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    
        <application
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name" >
            <activity
                android:name=".GeoWebViewActivity"
                android:label="@string/app_name"
                android:theme="@android:style/Theme.NoTitleBar" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    

    ma​​in.xml

    <?xml version="1.0" encoding="utf-8"?>
    <WebView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/webView1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
    

    最后,这是完整的应用程序,仅包含 GeoWebViewActivity:

    package com.example.webview;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.webkit.GeolocationPermissions;
    import android.webkit.WebChromeClient;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    
    /**
     * A minimal WebView app with HTML5 geolocation capability
     *
     * @author David M. Chandler
     */
    public class GeoWebViewActivity extends Activity {
    
        /**
         * WebViewClient subclass loads all hyperlinks in the existing WebView
         */
        public class GeoWebViewClient extends WebViewClient {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                // When user clicks a hyperlink, load in the existing WebView
                view.loadUrl(url);
                return true;
            }
        }
    
        /**
         * WebChromeClient subclass handles UI-related calls
         * Note: think chrome as in decoration, not the Chrome browser
         */
        public class GeoWebChromeClient extends WebChromeClient {
           @Override
           public void onGeolocationPermissionsShowPrompt(String origin,
                                                   GeolocationPermissions.Callback callback) {
            // Geolocation permissions coming from this app's Manifest will only be valid for devices with
            // API_VERSION < 23. On API 23 and above, we must check for permissions, and possibly
            // ask for them.
            String perm = Manifest.permission.ACCESS_FINE_LOCATION;
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M ||
                ContextCompat.checkSelfPermission(MainActivity.this, perm) == PackageManager.PERMISSION_GRANTED) {
                // we're on SDK < 23 OR user has already granted permission
                callback.invoke(origin, true, false);
            } else {
                if (!ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, perm)) {
                    // ask the user for permission
                    ActivityCompat.requestPermissions(MainActivity.this, new String[] {perm}, REQUEST_FINE_LOCATION);
    
                    // we will use these when user responds
                    mGeolocationOrigin = origin;
                    mGeolocationCallback = callback;
                }
            }
        }
    
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            switch (requestCode) {
                case REQUEST_FINE_LOCATION:
                    boolean allow = false;
                    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        // user has allowed this permission
                        allow = true;
                    }
                    if (mGeolocationCallback != null) {
                        // call back to web chrome client
                        mGeolocationCallback.invoke(mGeolocationOrigin, allow, false);
                    }
                    break;
            }
        }
    
        WebView mWebView;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            mWebView = (WebView) findViewById(R.id.webView1);
            // Brower niceties -- pinch / zoom, follow links in place
            mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
            mWebView.getSettings().setBuiltInZoomControls(true);
            mWebView.setWebViewClient(new GeoWebViewClient());
            // Below required for geolocation
            mWebView.getSettings().setJavaScriptEnabled(true);
            mWebView.getSettings().setGeolocationEnabled(true);
            mWebView.setWebChromeClient(new GeoWebChromeClient());
            // Load google.com
            mWebView.loadUrl("http://www.google.com");
        }
    
        @Override
        public void onBackPressed() {
            // Pop the browser back stack or exit the activity
            if (mWebView.canGoBack()) {
                mWebView.goBack();
            }
            else {
                super.onBackPressed();
            }
        }
    }
    

    希望这会有所帮助。

    【讨论】:

    • 我遇到了一些错误。错误:(14) 错误:找不到资源 drawable/ic_launcher(又名 com.example.slate.web:drawable/ic_launcher)。错误:(14) 找不到资源 drawable/ic_launcher(又名 com.example.slate.web:drawable/ic_launcher)。你知道发生了什么吗?
    • 是的..请 更新:
    • 出现另一个错误。错误:(15, 8) 错误:GeoWebViewActivity 类是公共的,应在名为 GeoWebViewActivity.java 的文件中声明,错误:(49, 25) 错误:包 R 不存在。有没有办法解决这个问题?
    • 用你的包名替换清单中的包。 package="com.example.webview" 改变这一行。也在清单文件和活动文件中使用您的包名称。
    • 完成。仍然错误,但通过将 mainactivity.java 重命名为 GeoWebViewActivity.java 解决了。会有问题吗?剩下一个错误错误:(49、32)错误:找不到符号变量main。无论如何,非常感谢先生的帮助,我真的很感激
    【解决方案2】:
        private boolean isLocationPermissionGrandted() {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                return ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                        || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED
                        || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_BACKGROUND_LOCATION) == PackageManager.PERMISSION_GRANTED;
            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                return ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                        || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED;
            } else {
                return true;
            }
        }
    
    
        private void getLocationPermission() {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_BACKGROUND_LOCATION}, PERMISSION_LOCATTION_CODE);
            } else {
                ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_LOCATTION_CODE);
            }
        }
    
    if (isLocationPermissionGrandted())
         initializeWebView();
    else
         getLocationPermission();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多