সমস্যাটি:
ASAP এবং একই সময়ে ব্যাটারি সংরক্ষণের দ্বার মধ্যে ব্যবহারকারীর বর্তমান অবস্থান প্রাপ্ত করা Get
সমস্যাটি কেন সমস্যা:
প্রথমে, অ্যান্ড্রয়েডের দুটি সরবরাহকারী রয়েছে; নেটওয়ার্ক এবং জিপিএস কখনও কখনও নেটওয়ার্ক ভাল এবং কখনও কখনও জিপিএস ভাল হয়।
"আরও ভাল" দ্বারা আমি গতি বনাম যথার্থতা অনুপাত বলতে চাইছি।
আমি যদি প্রায় তাত্ক্ষণিকভাবে এবং জিপিএস চালু না করে লোকেশনটি পেতে পারি তবে আমি কয়েক মিটার নির্ভুলতার জন্য ত্যাগ করতে ইচ্ছুক।
দ্বিতীয়ত, আপনি যদি অবস্থানের পরিবর্তনের জন্য আপডেটের জন্য অনুরোধ করেন তবে বর্তমান অবস্থানটি স্থিতিশীল থাকলে কিছুই প্রেরণ করা হয় না।
গুগলের এখানে "সেরা" অবস্থান নির্ধারণের একটি উদাহরণ রয়েছে: http://developer.android.com/guide/topics/location/obtaining-user-location.html# সর্বোত্তমতা
তবে আমি মনে করি এটি এর মতো ঠিক যতটা উচিত তার কাছাকাছি নেই no /হতে পারে.
আমি গুগল ধরণের কারণ কেন গুগল কোনও অবস্থানের জন্য সাধারণীকরণকারী এপিআই না করে, বিকাশকারীকে সেই অবস্থানটি কোথায় সেদিকে খেয়াল রাখতে হবে না, আপনাকে কেবল কী চান তা নির্দিষ্ট করা উচিত এবং ফোনটি আপনার জন্য বেছে নেওয়া উচিত।
আমার যেটির সাহায্য দরকার:
"উত্তম" অবস্থান নির্ধারণ করার জন্য আমাকে একটি ভাল উপায় খুঁজে বের করতে হবে, যদিও কিছু তাত্পর্যপূর্ণ বা সম্ভবত কোনও তৃতীয় পক্ষের লাইব্রেরির মাধ্যমে।
এর অর্থ এই নয় যে সেরা সরবরাহকারী নির্ধারণ করুন!
আমি সম্ভবত সমস্ত সরবরাহকারী ব্যবহার করব এবং তাদের মধ্যে সেরাটি বেছে নেব।
অ্যাপ্লিকেশনটির পটভূমি:
অ্যাপ্লিকেশনটি একটি নির্দিষ্ট বিরতিতে ব্যবহারকারীর অবস্থান সংগ্রহ করবে (প্রতি 10 মিনিট বা তার পরে বলা যাক) এবং এটি একটি সার্ভারে প্রেরণ করবে।
অ্যাপ্লিকেশনটিতে যথাসম্ভব ব্যাটারি সংরক্ষণ করা উচিত এবং অবস্থানটির এক্স (50-100?) মিটার নির্ভুলতা থাকা উচিত।
লক্ষ্যটি হ'ল পরবর্তী সময়ে কোনও মানচিত্রে ব্যবহারকারীর পথ চক্রান্ত করতে সক্ষম হব তাই এর জন্য আমার পর্যাপ্ত যথার্থতা প্রয়োজন।
বিবিধ:
কাঙ্ক্ষিত এবং স্বীকৃত যথাযথতার জন্য যুক্তিসঙ্গত মানগুলি কী বলে আপনি মনে করেন?
আমি গ্রহণযোগ্য হিসাবে 100 মিটার এবং পছন্দসই হিসাবে 30 মি ব্যবহার করছি, এটি কি অনেক বেশি জিজ্ঞাসা করার?
আমি পরে কোনও মানচিত্রে ব্যবহারকারীর পথ চক্রান্ত করতে সক্ষম হতে চাই।
পছন্দসই জন্য 100 মিটার এবং 500 মিটার গ্রহণযোগ্যতর কি?
এছাড়াও, এই মুহুর্তে আমার কাছে অবস্থানের আপডেটের জন্য সর্বাধিক seconds০ সেকেন্ডের জন্য জিপিএস রয়েছে, আপনি যদি বাড়ির অভ্যন্তরে সম্ভবত 200 মিটার নির্ভুলতা নিয়ে থাকেন তবে কোনও অবস্থান পাওয়া কি খুব কম?
এটি আমার বর্তমান কোড, যে কোনও প্রতিক্রিয়ার প্রশংসা করা হয়েছে (ত্রুটি যাচাইয়ের অভাব বাদে যা টোডো):
protected void runTask() {
final LocationManager locationManager = (LocationManager) context
.getSystemService(Context.LOCATION_SERVICE);
updateBestLocation(locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER));
updateBestLocation(locationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER));
if (getLocationQuality(bestLocation) != LocationQuality.GOOD) {
Looper.prepare();
setLooper(Looper.myLooper());
// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
updateBestLocation(location);
if (getLocationQuality(bestLocation) != LocationQuality.GOOD)
return;
// We're done
Looper l = getLooper();
if (l != null) l.quit();
}
public void onProviderEnabled(String provider) {}
public void onProviderDisabled(String provider) {}
public void onStatusChanged(String provider, int status,
Bundle extras) {
// TODO Auto-generated method stub
Log.i("LocationCollector", "Fail");
Looper l = getLooper();
if (l != null) l.quit();
}
};
// Register the listener with the Location Manager to receive
// location updates
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, 1000, 1, locationListener,
Looper.myLooper());
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, 1000, 1,
locationListener, Looper.myLooper());
Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
Looper l = getLooper();
if (l != null) l.quit();
// Log.i("LocationCollector",
// "Stopping collector due to timeout");
}
}, MAX_POLLING_TIME);
Looper.loop();
t.cancel();
locationManager.removeUpdates(locationListener);
setLooper(null);
}
if (getLocationQuality(bestLocation) != LocationQuality.BAD)
sendUpdate(locationToString(bestLocation));
else Log.w("LocationCollector", "Failed to get a location");
}
private enum LocationQuality {
BAD, ACCEPTED, GOOD;
public String toString() {
if (this == GOOD) return "Good";
else if (this == ACCEPTED) return "Accepted";
else return "Bad";
}
}
private LocationQuality getLocationQuality(Location location) {
if (location == null) return LocationQuality.BAD;
if (!location.hasAccuracy()) return LocationQuality.BAD;
long currentTime = System.currentTimeMillis();
if (currentTime - location.getTime() < MAX_AGE
&& location.getAccuracy() <= GOOD_ACCURACY)
return LocationQuality.GOOD;
if (location.getAccuracy() <= ACCEPTED_ACCURACY)
return LocationQuality.ACCEPTED;
return LocationQuality.BAD;
}
private synchronized void updateBestLocation(Location location) {
bestLocation = getBestLocation(location, bestLocation);
}
// Pretty much an unmodified version of googles example
protected Location getBestLocation(Location location,
Location currentBestLocation) {
if (currentBestLocation == null) {
// A new location is always better than no location
return location;
}
if (location == null) return currentBestLocation;
// Check whether the new location fix is newer or older
long timeDelta = location.getTime() - currentBestLocation.getTime();
boolean isSignificantlyNewer = timeDelta > TWO_MINUTES;
boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES;
boolean isNewer = timeDelta > 0;
// If it's been more than two minutes since the current location, use
// the new location
// because the user has likely moved
if (isSignificantlyNewer) {
return location;
// If the new location is more than two minutes older, it must be
// worse
} else if (isSignificantlyOlder) {
return currentBestLocation;
}
// Check whether the new location fix is more or less accurate
int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation
.getAccuracy());
boolean isLessAccurate = accuracyDelta > 0;
boolean isMoreAccurate = accuracyDelta < 0;
boolean isSignificantlyLessAccurate = accuracyDelta > 200;
// Check if the old and new location are from the same provider
boolean isFromSameProvider = isSameProvider(location.getProvider(),
currentBestLocation.getProvider());
// Determine location quality using a combination of timeliness and
// accuracy
if (isMoreAccurate) {
return location;
} else if (isNewer && !isLessAccurate) {
return location;
} else if (isNewer && !isSignificantlyLessAccurate
&& isFromSameProvider) {
return location;
}
return bestLocation;
}
/** Checks whether two providers are the same */
private boolean isSameProvider(String provider1, String provider2) {
if (provider1 == null) {
return provider2 == null;
}
return provider1.equals(provider2);
}