दिलचस्प पोस्ट
NumPy सरणी प्रारंभ (समान मानों से भरें) पोस्टग्रेश एसक्यूएल में ग्रुप लिमिट: प्रत्येक समूह के लिए पहली एन पंक्ति दिखाएं? क्या जीसीसी का __डेटाइट __ ((पैक किया गया है) / # प्रगामा पैक असुरक्षित है? स्काला की उपज क्या है? ओरेकल के प्लस (+) नोटेशन और एन्सी के बीच का अंतर सम्मिलित हों? स्विफ्ट: एक को विभाजित करने का सही तरीका क्या है, जिसके परिणामस्वरूप एक ] एक दिए गए सबरेरे आकार के साथ? वेबपेज में लॉग इन करने और बाद के उपयोग के लिए कुकीज़ पुनर्प्राप्त करने के लिए कैसे पायथन का उपयोग करें? जीसीसी को एक अप्रयुक्त स्थैतिक पुस्तकालय लिंक करने के लिए कैसे लागू करें Int की सूची का उपयोग करके विरल मैट्रिक्स स्लिसिंग दूसरे में एक सी स्रोत फ़ाइल भी शामिल है? JasperException: useBean वर्ग विशेषता के लिए मान अमान्य है क्या आप जावास्क्रिप्ट कॉलबैक की प्रतीक्षा कर सकते हैं? JQuery के उपयोग से इनपुट फ़ील्ड प्राप्त करें? जावा में फ़ाइल परिवर्तित श्रोता क्या हम जावा में मुख्य विधि अधिभार कर सकते हैं?

30 सेकंड में अक्षांश और देशांतर प्राप्त करना

मैं उपयोगकर्ता के GPS/network से longitude और latitude रूप में स्थान प्राप्त करने की कोशिश कर रहा हूं जो कभी भी उपलब्ध है और मैं इसे तेजी से प्राप्त करना चाहता हूं, या फिर पिछली स्थान निर्देशांक वापस आ जाएंगे यदि अभी एक नया नहीं मिल सकता है

मेरा प्रयास है:

 public class GPSTracker extends Service{ // The minimum distance to change Updates in meters private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters // The minimum time between updates in milliseconds private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute private final Context mContext; // Declaring a Location Manager protected LocationManager locationManager; // flag for GPS status boolean isGPSEnabled = false; // flag for network status boolean isNetworkEnabled = false; // flag for GPS status boolean canGetLocation = false; Location location = null; // location double latitude; // latitude double longitude; // longitude myLocationLitener locationLitener; public GPSTracker(Context context) { this.mContext = context; locationLitener = new myLocationLitener(); getLocation(); } public Location getLocation() { try { locationManager = (LocationManager) mContext .getSystemService(LOCATION_SERVICE); // getting GPS status isGPSEnabled = locationManager .isProviderEnabled(LocationManager.GPS_PROVIDER); // getting network status isNetworkEnabled = locationManager .isProviderEnabled(LocationManager.NETWORK_PROVIDER); if (!isGPSEnabled && !isNetworkEnabled) { // no network provider is enabled } else { this.canGetLocation = true; if (isNetworkEnabled) { locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES,locationLitener); Log.d("Network", "Network Enabled"); if (locationManager != null) { location = locationManager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } } // if GPS Enabled get lat/long using GPS Services if (isGPSEnabled) { if (location == null) { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return null; } locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, locationLitener); Log.d("GPS", "GPS Enabled"); if (locationManager != null) { location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } } } } } catch (Exception e) { e.printStackTrace(); } return location; } /** * Stop using GPS listener Calling this function will stop using GPS in your * app */ public void stopUsingGPS() { if (locationManager != null) { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return; } locationManager.removeUpdates(locationLitener); } } /** * Function to get latitude */ public double getLatitude() { if (location != null) { latitude = location.getLatitude(); } // return latitude return latitude; } /** * Function to get longitude */ public double getLongitude() { if (location != null) { longitude = location.getLongitude(); } // return longitude return longitude; } /** * Function to check GPS/wifi enabled * * @return boolean */ public boolean canGetLocation() { return this.canGetLocation; } /** * Function to show settings alert dialog On pressing Settings button will * lauch Settings Options */ public void showSettingsAlert() { AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); // Setting Dialog Title alertDialog.setTitle("GPS is settings"); // Setting Dialog Message alertDialog .setMessage("GPS is not enabled. Do you want to go to settings menu?"); // On pressing Settings button alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent( Settings.ACTION_LOCATION_SOURCE_SETTINGS); mContext.startActivity(intent); } }); // on pressing cancel button alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); // Showing Alert Message alertDialog.show(); } @Override public IBinder onBind(Intent arg0) { return null; } private class myLocationLitener implements LocationListener{ @Override public void onLocationChanged(Location location) { } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } } } 

मैं इस वर्ग का उपयोग कैसे करूँ?

समझे कि मैं async कार्य में कार्य के नीचे चल रहा हूं (जिनको एंड्रॉइड एनोटेशन का ज्ञान नहीं है @ बैकग्राउंड ऐसा कर रहा है)

  @Background void getmyLocationAndSend(){ GPSTracker gps = new GPSTracker(context); // check if GPS location can get Location if (gps.canGetLocation()) { LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { Log.d("Your Location", "latitude:" + gps.getLatitude() + ", longitude: " + gps.getLongitude()); latitude = gps.getLatitude(); // set the globals longitude = gps.getLongitude(); // set the globals }else{ showToast("Network is connected.."); if (progress != null && progress.isShowing()) { progress.dismiss(); } } }else{ showToast("Cannot get location from gps.."); if (progress != null && progress.isShowing()) { progress.dismiss(); } } } 

मेरा लक्ष्य 30 सेकंड से कम समय में निर्देशांक प्राप्त करना है , और कभी भी 0.0 मूल्य प्राप्त नहीं होता है, मैं यह कैसे प्राप्त कर सकता हूं कि किसी भी मदद की सराहना की?

वेब के समाधान से एकत्रित समाधान "30 सेकंड में अक्षांश और देशांतर प्राप्त करना"

कृपया जांचें कि मैं अपने ऐप में कैसे प्रयोग कर रहा हूं और इसके कामकाज में सही हूं .मैं अद्यतन स्थान के लिए फ्यूज़ एपीआई का प्रयोग कर रहा हूं, कृपया कुछ कदमों का पालन करें। वर्तमान में आप बहुत पुरानी दृष्टिकोण का इस्तेमाल कर रहे हैं। इसलिए, अब कोई ज़रूरत नहीं है और यहां आपका समय मिलीसेकेंड में है। आप क्या चाहते हैं UPDATE_INTERVAL_IN_MILLISECONDS

चरण 1. इस वर्ग को GoogleLocationService.java बनाएं

 public class GoogleLocationService { private GoogleServicesCallbacks callbacks = new GoogleServicesCallbacks(); LocationUpdateListener locationUpdateListener; Context activity; protected GoogleApiClient mGoogleApiClient; protected LocationRequest mLocationRequest; public static final long UPDATE_INTERVAL_IN_MILLISECONDS = 30000; public GoogleLocationService(Context activity, LocationUpdateListener locationUpdateListener) { this.locationUpdateListener = locationUpdateListener; this.activity = activity; buildGoogleApiClient(); } protected synchronized void buildGoogleApiClient() { //Log.i(TAG, "Building GoogleApiClient"); mGoogleApiClient = new GoogleApiClient.Builder(activity) .addConnectionCallbacks(callbacks) .addOnConnectionFailedListener(callbacks) .addApi(LocationServices.API) .build(); createLocationRequest(); mGoogleApiClient.connect(); } protected void createLocationRequest() { mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); } private class GoogleServicesCallbacks implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { @Override public void onConnected(Bundle bundle) { startLocationUpdates(); } @Override public void onConnectionSuspended(int i) { mGoogleApiClient.connect(); } @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { if (connectionResult.getErrorCode() == ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED) { Toast.makeText(activity, "Google play service not updated", Toast.LENGTH_LONG).show(); } locationUpdateListener.cannotReceiveLocationUpdates(); } @Override public void onLocationChanged(Location location) { if (location.hasAccuracy()) { if (location.getAccuracy() < 30) { locationUpdateListener.updateLocation(location); } } } } private static boolean locationEnabled(Context context) { boolean gps_enabled = false; LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); try { gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER); } catch (Exception ex) { ex.printStackTrace(); } return gps_enabled; } private boolean servicesConnected(Context context) { return isPackageInstalled(GooglePlayServicesUtil.GOOGLE_PLAY_STORE_PACKAGE, context); } private boolean isPackageInstalled(String packagename, Context context) { PackageManager pm = context.getPackageManager(); try { pm.getPackageInfo(packagename, PackageManager.GET_ACTIVITIES); return true; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); return false; } } public void startUpdates() { /* * Connect the client. Don't re-start any requests here; instead, wait * for onResume() */ if (servicesConnected(activity)) { if (locationEnabled(activity)) { locationUpdateListener.canReceiveLocationUpdates(); startLocationUpdates(); } else { locationUpdateListener.cannotReceiveLocationUpdates(); Toast.makeText(activity, "Unable to get your location.Please turn on your device Gps", Toast.LENGTH_LONG).show(); } } else { locationUpdateListener.cannotReceiveLocationUpdates(); Toast.makeText(activity, "Google play service not available", Toast.LENGTH_LONG).show(); } } //stop location updates public void stopUpdates() { stopLocationUpdates(); } //start location updates private void startLocationUpdates() { if (checkSelfPermission(activity, ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(activity, ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return; } if (mGoogleApiClient.isConnected()) { LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, callbacks); } } public void stopLocationUpdates() { if (mGoogleApiClient.isConnected()) { LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, callbacks); } } public void startGoogleApi() { mGoogleApiClient.connect(); } public void closeGoogleApi() { mGoogleApiClient.disconnect(); } } 

चरण 2। यह इंटरफ़ेस स्थानअपडेट लास्टनर.जावा बनाओ

  public interface LocationUpdateListener { /** * Called immediately the service starts if the service can obtain location */ void canReceiveLocationUpdates(); /** * Called immediately the service tries to start if it cannot obtain location - eg the user has disabled wireless and */ void cannotReceiveLocationUpdates(); /** * Called whenever the location has changed (at least non-trivially) * @param location */ void updateLocation(Location location); /** * Called when GoogleLocationServices detects that the device has moved to a new location. * @param localityName The name of the locality (somewhere below street but above area). */ void updateLocationName(String localityName, Location location); } 

चरण 3. इस स्थान सेवा वर्ग स्थान सेवा सेवा को बनाओ

 public class LocationService extends Service { private GoogleLocationService googleLocationService; @Override public void onCreate() { super.onCreate(); //start the handler for getting locations //create component updateLocation(getApplicationContext()); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return Service.START_STICKY; } //get current location os user private void updateLocation(Context context) { googleLocationService = new GoogleLocationService(context, new LocationUpdateListener() { @Override public void canReceiveLocationUpdates() { } @Override public void cannotReceiveLocationUpdates() { } //update location to our servers for tracking purpose @Override public void updateLocation(Location location) { if (location != null ) { Timber.e("updated location %1$s %2$s", location.getLatitude(), location.getLongitude()); } } @Override public void updateLocationName(String localityName, Location location) { googleLocationService.stopLocationUpdates(); } }); googleLocationService.startUpdates(); } IBinder mBinder = new LocalBinder(); public class LocalBinder extends Binder { public LocationService getServerInstance() { return LocationService.this; } } @Override public IBinder onBind(Intent intent) { return mBinder; } //stop location updates on stopping the service @Override public void onDestroy() { super.onDestroy(); if (googleLocationService != null) { googleLocationService.stopLocationUpdates(); } } } 

संपादित उत्तर:

सेवा का उपयोग कैसे करें,

इस तरह से, आपकी मुख्य गतिविधि में सेवा शुरू करें

 startService(new Intent(context, LocationService.class)); 

रोक के लिए,

 stopService(new Intent(context, LocationService.class)); 

और इस तरह प्रकट मे घोषित,

 <service android:name=".service.location.LocationService" android:enabled="true"></service> 

नोट: मैंने यह किया है क्योंकि ऐप को मारने के बाद मुझे जगह की ज़रूरत है। यदि आप सेवा नहीं चाहते हैं। तब, आप सीधे कक्षा में कोड नीचे कॉल कर सकते हैं जहां स्थान को अद्यतन करने और स्थान सेवा हटाने की आवश्यकता है।

  private GoogleLocationService googleLocationService; googleLocationService = new GoogleLocationService(context, new LocationUpdateListener() { @Override public void canReceiveLocationUpdates() { } @Override public void cannotReceiveLocationUpdates() { } //update location to our servers for tracking purpose @Override public void updateLocation(Location location) { if (location != null ) { Timber.e("updated location %1$s %2$s", location.getLatitude(), location.getLongitude()); } } @Override public void updateLocationName(String localityName, Location location) { googleLocationService.stopLocationUpdates(); } }); googleLocationService.startUpdates(); and call this onDestroy if (googleLocationService != null) { googleLocationService.stopLocationUpdates(); } 

याद रखें स्थान सेवा के रूप में अच्छी तरह से प्रकट होना चाहिए। मेरे अनुसार यह सबसे अच्छा समाधान है। मैंने स्थान पर काम करने में बहुत कुछ किया है। धन्यवाद आशा है कि यह आपकी सहायता करेगा

FusedLocationApi देखें यह उस के एक महान काम करता है और यह आपको बैटरी प्रदर्शन को कम करने के लिए विकल्प देता है

आप RxGpsService (जीपीएस स्थानों और RxJava का उपयोग कर रूट आंकड़ों को पुनः प्राप्त करने के लिए एक एंड्रॉइड सेवा) के लिए एक नज़र रख सकते हैं। यह एक रूटिवेट्स ऑब्जेक्ट प्राप्त करता है जिसमें वर्तमान गति, दूरी, समय बीत चुका है और रास्ता बिंदु साथ ही अनुकूलन योग्य भी है, इसलिए आप। अंतराल .withInterval(30000) और .withFastestInterval(30000) का उपयोग करके अपना अंतराल सेट कर सकते हैं।