दिलचस्प पोस्ट
चुनें * जहां मौजूदा नहीं है UITextBorderStyleNone के साथ UITextField के लिए पैडिंग सेट करें sed इन-प्लेस फ्लैग जो मैक (बीएसडी) और लिनक्स पर दोनों काम करता है WebView में एक प्रगति पट्टी जोड़ें जेएसपी / वेब-एनएफ़ रिटर्न "HTTP स्थिति 404 अनुरोधित संसाधन उपलब्ध नहीं है" एक्सएलएस (एक्सेल) फाइल से डेटा कैसे पढ़ा जाए मैं कैसे अतिरिक्त सम्पत्ति के लिए कई सम्मिलित टेबल से हाइबरनेट मानचित्रण बनाऊँ? बहु-लाइन खोज के लिए रेगेक्स (जीआरपी) की आवश्यकता Autolayout: पर्यवेक्षण और नहीं शीर्ष लेआउट गाइड करने के लिए बाधा जोड़ें? स्टड :: नक्शा लाल-काली वृक्ष के रूप में क्यों लागू किया जाता है? सी # से विंडोज प्रतिरूपण C ++ में कीवर्ड को पंजीकृत करें MKMapView अधिकतम ज़ूम स्तर को सीमित करने का कोई तरीका है? अंग्रेज़ी शब्दों के लिए एक अच्छा हैश फ़ंक्शन क्या है? नियमित अभिव्यक्ति के अंदर एक चर का उपयोग कैसे करें?

एंड्रॉइड वेबव्यू जियोलोकेशन

मुझे WebView में उपयोगकर्ता के स्थान को पुनः प्राप्त करना होगा। मैं निम्नलिखित जावास्क्रिप्ट के साथ ऐसा करता हूं:

 function getLocation() { navigator.geolocation.getCurrentPosition(displayLocation, handleError); } 

लेकिन अनुमति अनुरोध पॉपअप कभी नहीं खुलता है

मैंने ये सेटिंग्स सेट की हैं:

 ws.setJavaScriptEnabled(true); ws.setGeolocationEnabled(true); ws.setJavaScriptCanOpenWindowsAutomatically(true); 

एक WebView भीतर से किसी उपयोगकर्ता के स्थान तक पहुंचने का सही तरीका क्या है?

वेब के समाधान से एकत्रित समाधान "एंड्रॉइड वेबव्यू जियोलोकेशन"

  • जावास्क्रिप्ट WebView में सक्षम होना चाहिए, WebSettings.setJavaScriptEnabled(true); का उपयोग कर WebSettings.setJavaScriptEnabled(true);
  • ऐप को ACCESS_FINE_LOCATION की अनुमति की आवश्यकता है
  • WebView को कस्टम WebChromeClient उपयोग करना चाहिए जो WebChromeClient.onGeolocationPermissionsShowPrompt() लागू WebChromeClient.onGeolocationPermissionsShowPrompt() । उपयोगकर्ता के स्थान को जावास्क्रिप्ट में प्रकट करने की अनुमति प्राप्त करने के लिए इस विधि को WebView द्वारा कहा जाता है। (ब्राउज़र के मामले में, हम उपयोगकर्ता को एक प्रॉम्प्ट दिखाते हैं।) डिफ़ॉल्ट कार्यान्वयन कुछ नहीं करता है, इसलिए अनुमति प्राप्त नहीं की जाती है और स्थान जावास्क्रिप्ट को कभी भी नहीं पारित किया गया है। एक सरल कार्यान्वयन जो हमेशा अनुमति देता है …

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

सत्रों के बीच कैश की स्थिति और अनुमतियों को जारी रखने के लिए जियोलोकेशन डेटाबेस का उपयोग करता है डेटाबेस का स्थान WebSettings.setGeolocationDatabasePath(...) का उपयोग करके सेट किया गया है। यदि डेटाबेस का स्थान सेट नहीं है, तो निरंतर संग्रहण उपलब्ध नहीं होगा, लेकिन जियोलोकेशन अन्यथा सही ढंग से काम करना जारी रखेगा डेटाबेस का स्थान सेट करने के लिए, उपयोग करें …

 webView.getSettings().setGeolocationDatabasePath( context.getFilesDir().getPath() ); 

क्या आप अपने मेनिफेस्ट में उस घोषणा की घोषणा कर रहे हैं?

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

आपको अन्य स्थान अनुमतियां भी घोषित करने की आवश्यकता हो सकती है, जैसे कि:

 <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.setWebChromeClient(new WebChromeClient(){ public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { // callback.invoke(String origin, boolean allow, boolean remember); callback.invoke(origin, true, false); } } 

कुछ मामलों में, HTML5 को भंडारण का उपयोग करने की आवश्यकता होती है, आपको कुछ गुणों को सक्षम करना होगा ताकि वेबव्यू सामान्य चलाने के लिए पूर्ण पहुंच हो।

  // HTML5 API flags webView.getSettings().setAppCacheEnabled(true); webView.getSettings().setDatabaseEnabled(true); webView.getSettings().setDomStorageEnabled(true); 

यह उपयोगकर्ता की अनुमति के लिए अपने स्थान का उपयोग करने के लिए प्रोत्साहित करने के लिए चेतावनी संवाद दिखाने का एक उदाहरण है:

  @Override public void onGeolocationPermissionsShowPrompt(final String origin, final GeolocationPermissions.Callback callback) { Log.i(TAG, "onGeolocationPermissionsShowPrompt()"); final boolean remember = false; AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Locations"); builder.setMessage("Would like to use your Current Location ") .setCancelable(true).setPositiveButton("Allow", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // origin, allow, remember callback.invoke(origin, true, remember); } }).setNegativeButton("Don't Allow", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // origin, allow, remember callback.invoke(origin, false, remember); } }); AlertDialog alert = builder.create(); alert.show(); } 

मेरी वर्किंग गतिविधि वर्ग को साझा करना, यह एक पूर्ण समाधान है जो प्रदर्शित कर सकता है

  • वेब पेज लोड होने पर लोडिंग संवाद दिखा रहा है
  • मार्शमोलो और इसके बाद के संस्करण में अनुमति के लिए पूछें
  • वेबपेज त्रुटि संभाल
  • इंटरनेट कनेक्शन की जांच करें और सेटिंग खोलें
  • डायलॉग के साथ और बिना जियोलोकेशन अनुमति को संभालना

आशा है कि यह किसी समय को बचाएगा

  /** * Created by Hitesh.Sahu on 3/24/2017. */ public class WebViewActivity extends AppCompatActivity { final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124; private int webViewPreviousState; private final int PAGE_STARTED = 0x1; private final int PAGE_REDIRECTED = 0x2; private CoordinatorLayout rootView; private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_webview); webView = (WebView) findViewById(R.id.webView); rootView = (CoordinatorLayout) findViewById(R.id.root_view); if (Build.VERSION.SDK_INT >= 23) { // Marshmallow+ Permission APIs fuckMarshMallow(); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)) { WebView.setWebContentsDebuggingEnabled(true); } } webView.setInitialScale(1); webView.getSettings().setLoadWithOverviewMode(true); webView.getSettings().setUseWideViewPort(true); webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); webView.setScrollbarFadingEnabled(false); webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); webView.getSettings().setBuiltInZoomControls(true); webView.setWebViewClient(new GeoWebViewClient()); // Below required for geolocation webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setGeolocationEnabled(true); webView.setWebChromeClient(new GeoWebChromeClient()); webView.getSettings().setAppCacheEnabled(true); webView.getSettings().setDatabaseEnabled(true); webView.getSettings().setDomStorageEnabled(true); webView.getSettings().setGeolocationDatabasePath(getFilesDir().getPath()); webView.loadUrl("file:///android_asset/index.html"); } /** * WebChromeClient subclass handles UI-related calls * Note: think chrome as in decoration, not the Chrome browser */ public class GeoWebChromeClient extends android.webkit.WebChromeClient { @Override public void onGeolocationPermissionsShowPrompt(final String origin, final GeolocationPermissions.Callback callback) { // Always grant permission since the app itself requires location // permission and the user has therefore already granted it callback.invoke(origin, true, false); // final boolean remember = false; // AlertDialog.Builder builder = new AlertDialog.Builder(WebViewActivity.this); // builder.setTitle("Locations"); // builder.setMessage("Would like to use your Current Location ") // .setCancelable(true).setPositiveButton("Allow", new DialogInterface.OnClickListener() { // public void onClick(DialogInterface dialog, int id) { // // origin, allow, remember // callback.invoke(origin, true, remember); // } // }).setNegativeButton("Don't Allow", new DialogInterface.OnClickListener() { // public void onClick(DialogInterface dialog, int id) { // // origin, allow, remember // callback.invoke(origin, false, remember); // } // }); // AlertDialog alert = builder.create(); // alert.show(); } } /** * 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; } Dialog loadingDialog = new Dialog(WebViewActivity.this); @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); webViewPreviousState = PAGE_STARTED; if (loadingDialog == null || !loadingDialog.isShowing()) loadingDialog = ProgressDialog.show(WebViewActivity.this, "", "Loading Please Wait", true, true, new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { // do something } }); loadingDialog.setCancelable(false); } @RequiresApi(api = Build.VERSION_CODES.M) @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { if (isConnected()) { final Snackbar snackBar = Snackbar.make(rootView, "onReceivedError : " + error.getDescription(), Snackbar.LENGTH_INDEFINITE); snackBar.setAction("Reload", new View.OnClickListener() { @Override public void onClick(View view) { webView.loadUrl("javascript:window.location.reload( true )"); } }); snackBar.show(); } else { final Snackbar snackBar = Snackbar.make(rootView, "No Internet Connection ", Snackbar.LENGTH_INDEFINITE); snackBar.setAction("Enable Data", new View.OnClickListener() { @Override public void onClick(View view) { startActivityForResult(new Intent(Settings.ACTION_WIRELESS_SETTINGS), 0); webView.loadUrl("javascript:window.location.reload( true )"); snackBar.dismiss(); } }); snackBar.show(); } super.onReceivedError(view, request, error); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { if (isConnected()) { final Snackbar snackBar = Snackbar.make(rootView, "HttpError : " + errorResponse.getReasonPhrase(), Snackbar.LENGTH_INDEFINITE); snackBar.setAction("Reload", new View.OnClickListener() { @Override public void onClick(View view) { webView.loadUrl("javascript:window.location.reload( true )"); } }); snackBar.show(); } else { final Snackbar snackBar = Snackbar.make(rootView, "No Internet Connection ", Snackbar.LENGTH_INDEFINITE); snackBar.setAction("Enable Data", new View.OnClickListener() { @Override public void onClick(View view) { startActivityForResult(new Intent(Settings.ACTION_WIRELESS_SETTINGS), 0); webView.loadUrl("javascript:window.location.reload( true )"); snackBar.dismiss(); } }); snackBar.show(); } super.onReceivedHttpError(view, request, errorResponse); } @Override public void onPageFinished(WebView view, String url) { if (webViewPreviousState == PAGE_STARTED) { if (null != loadingDialog) { loadingDialog.dismiss(); loadingDialog = null; } } } } /** * Check if there is any connectivity * * @return is Device Connected */ public boolean isConnected() { ConnectivityManager cm = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); if (null != cm) { NetworkInfo info = cm.getActiveNetworkInfo(); return (info != null && info.isConnected()); } return false; } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS: { Map<String, Integer> perms = new HashMap<String, Integer>(); // Initial perms.put(Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.PERMISSION_GRANTED); // Fill with results for (int i = 0; i < permissions.length; i++) perms.put(permissions[i], grantResults[i]); // Check for ACCESS_FINE_LOCATION if (perms.get(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED ) { // All Permissions Granted // Permission Denied Toast.makeText(WebViewActivity.this, "All Permission GRANTED !! Thank You :)", Toast.LENGTH_SHORT) .show(); } else { // Permission Denied Toast.makeText(WebViewActivity.this, "One or More Permissions are DENIED Exiting App :(", Toast.LENGTH_SHORT) .show(); finish(); } } break; default: super.onRequestPermissionsResult(requestCode, permissions, grantResults); } } @TargetApi(Build.VERSION_CODES.M) private void fuckMarshMallow() { List<String> permissionsNeeded = new ArrayList<String>(); final List<String> permissionsList = new ArrayList<String>(); if (!addPermission(permissionsList, Manifest.permission.ACCESS_FINE_LOCATION)) permissionsNeeded.add("Show Location"); if (permissionsList.size() > 0) { if (permissionsNeeded.size() > 0) { // Need Rationale String message = "App need access to " + permissionsNeeded.get(0); for (int i = 1; i < permissionsNeeded.size(); i++) message = message + ", " + permissionsNeeded.get(i); showMessageOKCancel(message, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); } }); return; } requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); return; } Toast.makeText(WebViewActivity.this, "No new Permission Required- Launching App .You are Awesome!!", Toast.LENGTH_SHORT) .show(); } private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) { new AlertDialog.Builder(WebViewActivity.this) .setMessage(message) .setPositiveButton("OK", okListener) .setNegativeButton("Cancel", null) .create() .show(); } @TargetApi(Build.VERSION_CODES.M) private boolean addPermission(List<String> permissionsList, String permission) { if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) { permissionsList.add(permission); // Check for Rationale Option if (!shouldShowRequestPermissionRationale(permission)) return false; } return true; } }