close
تبلیغات در اینترنت
Google Play Service location API,بدست آوردن موقعیت مکانی,API سرویس موق
صفحه اصلی پرشین استک

{ پرشین استک }

به دنیای برنامه نویسی خوش آمدید
|


پرشین استک تنها یک سایت نیست بلکه یک پروژه همگانی می باشد


تعداد مطالب :
142


تعداد توسعه دهندگان :
11


تاریخ امروز :
جمعه 01 تیر 1397

به کانال تلگرام ما بپیوندید


×

لیست سوالات من

افزودن

چرا گاهی اوقات API موقعیت مکانی سرویس گوگل پلی ، موقعیت مکانی اشتباهی را برمی گرداند ؟

من یک برنامه دارم که با استفاده از API موقعیت مکانی سرویس گوگل پلی ، موقعیت مکانی کاربران را برای هر تراکنشی مانند زمین جغرافیایی ، پس از قرار دادن سفارش و ... ، ضبط می کند . پس از ضبط کردن این مکان از موبایل ، آن را به سرور ارسال و در داشبورد وب نمایش می دهیم . من در چند مورد متوجه شدم که جابجایی که در عرض چند ثانیه ضبط شده است ، نتایج مکانی از راه دور متنوعی را نشان می دهد .

به عنوان مثال :

مکان کاربر در آدرس زیر خواهد بود :

Mandsaur, Madhya Pradesh, India, Asia
(Latitude - 24.057291, Longitude - 75.0970672, Captured date - 2017-01-04 09:19:48)

اما تراکنش های بعدی مکان های زیر را نشان می دهد :

Paris which is 6772 km away
(Latitude - 48.8581074, Longitude - 2.3525187, Captured date - 2017-01-04 09:20:01)

این مشکل بدون دخالت کاربر یا هیچ نرم افزاری ، رخ می دهد .

این مکان های تراکنش معمولا در زمینه های باز با GPS روشن می شوند و به حالت دقت بالا تنظیم می شوند .

 

پاسخ 1 :

محل سکونتی که از API به دست می آید ، دقت متر دارد . شما همچنین باید مکان قدیمی را بررسی کنید . اگر دقت بیشتر از 50 یا 100 متر باشد ، مردم معمولا محل را رها می کنند .

از لینک های زیر می توانید استفاده کنید :

لینک اول

لینک دوم

 

چرا این اتفاق می افتد ؟

پیدا کردن ماهواره ها و دریافت سیگنال، برای GPS دستگاه طول می کشد .همچنین ، API سعی خواهد کرد موقعیت مکانی را بر اساس شبکه شما تعیین کند . انواع پرش بین شبکه و  GPS، تا زمانی که GPS اطلاعات دقیق ارائه می دهد .

چگونه از این کار جلوگیری کنیم؟

در شنونده موقعیت مکانی ، دقت را بررسی کرده و منتظر بمانید تا دقت بیشتری داشته باشید .

 

پاسخ 2 :

برای API موقعیت مکانی گوگل می توانید از کد زیر استفاده کنید :

 

package com.hydrometcloud.location;

import android.app.Activity;
import android.content.Context;
import android.content.IntentSender;
import android.location.Location;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.LocationSettingsRequest;
import com.google.android.gms.location.LocationSettingsResult;
import com.google.android.gms.location.LocationSettingsStatusCodes;

public class GoogleLocation implements
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,
LocationListener,
ResultCallback<LocationSettingsResult>{

private LocationSettingsRequest mLocationSettingsRequest;
private GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;
private String TAG = "GoogleLocation";

private Context context;
private long UPDATE_INTERVAL = 10*1000; /* 10 secs */
private long FASTEST_INTERVAL = 2000; /* 2 sec */
private GoogleLocationCallback googleLocationCallback;

private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000;
public static final int REQUEST_CHECK_SETTINGS = 0x1;

public GoogleLocation(Context context){
this.context = context;
setUpLocation();
}

public void setGoogleLocationCallback(GoogleLocationCallback googleLocationCallback){
this.googleLocationCallback = googleLocationCallback;
}

private void setUpLocation(){

mGoogleApiClient = new GoogleApiClient.Builder(context.getApplicationContext())
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();

// Create the LocationRequest object
mLocationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(UPDATE_INTERVAL); // 10 seconds, in milliseconds
.setFastestInterval(FASTEST_INTERVAL); // 1 second, in milliseconds
locationEnable();
}

public void googleClientConnect(){
mGoogleApiClient.connect();
}

public void googleClientDisConnect(){
if (mGoogleApiClient.isConnected()){
mGoogleApiClient.unregisterConnectionCallbacks(this);
mGoogleApiClient.unregisterConnectionFailedListener(this);
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient,this);
mGoogleApiClient.disconnect();
mGoogleApiClient = null;
}
}

private void locationEnable(){
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
builder.addLocationRequest(mLocationRequest);
mLocationSettingsRequest = builder.build();
checkLocationSettings();
}

private void checkLocationSettings(){
PendingResult<LocationSettingsResult> result =
LocationServices.SettingsApi.checkLocationSettings(
mGoogleApiClient,
mLocationSettingsRequest
);
result.setResultCallback(this);
}

@Override
public void onConnected(@NullableBundle bundle){
Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (location ==null){
updateLocation();
}else{
handleNewLocation(location);
}
}

private void handleNewLocation(Location location){

double currentLatitude = location.getLatitude();
double currentLongitude = location.getLongitude();

Log.e(TAG,"---currentLatitude--" + currentLatitude);
Log.e(TAG,"---currentLongitude--" + currentLongitude);

if (googleLocationCallback != null){
googleLocationCallback.updateLocationListner(currentLatitude, currentLongitude);
}
}

public void updateLocation(){
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest,this);
}

@Override
public void onConnectionSuspended(int i){
}

@Override
public void onConnectionFailed(@NonNullConnectionResult connectionResult){
/*
* Google Play services can resolve some errors it detects.
* If the error has a resolution, try sending an Intent to
* start a Google Play services activity that can resolve
* error.
*/

if (connectionResult.hasResolution()){
try{
// Start an Activity that tries to resolve the error
connectionResult.startResolutionForResult((Activity) context, CONNECTION_FAILURE_RESOLUTION_REQUEST);
/*
* Thrown if Google Play services canceled the original
* PendingIntent
*/
}catch (IntentSender.SendIntentException e){
// Log the error
e.printStackTrace();
}
}else{
/*
* If no resolution is available, display a dialog to the
* user with the error.
*/
Log.e(TAG,"Location services connection failed with code " + connectionResult.getErrorCode());
}
}

@Override
public void onResult(@NonNullLocationSettingsResult locationSettingsResult){
final Status status = locationSettingsResult.getStatus();
switch (status.getStatusCode()){
case LocationSettingsStatusCodes.SUCCESS:
Log.e(TAG,"All location settings are satisfied.");
break;
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
Log.e(TAG,"Location settings are not satisfied. Show the user a dialog to" +
"upgrade location settings ");

try{
// Show the dialog by calling startResolutionForResult(), and check the result
// in onActivityResult().
status.startResolutionForResult((Activity) context, REQUEST_CHECK_SETTINGS);
}catch (IntentSender.SendIntentException e){
Log.e(TAG,"PendingIntent unable to execute request.");
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
Log.e(TAG,"Location settings are inadequate, and cannot be fixed here. Dialog " +
"not created.");
break;
}
}

@Override
public void onLocationChanged(Location location){
handleNewLocation(location);
}

public interface GoogleLocationCallback{
void updateLocationListner(double latitude,double longitude);
}
}

 

اکنون فراخوانی GoogleLocation.GoogleLocationCallback را روی هر اکتیویتی یا فراگمنتی (fragment) که موقعیت را بدست آورده اید ، اجرا کنید و پس از اینکه کد زیر را در هر اکتیویتی یا فراگمنتی (fragment) نوشتید ، موقعیت مکانی را بدست می آورید :

 

googleLocation = new GoogleLocation(this);
googleLocation.setGoogleLocationCallback(this);

 

پاسخ 3 :

بهترین راه برای حل این مشکل ، فیلتر نتایج است . احتمال یک مکان صحیح بدست آمده از یک سرویس فیوز 67 درصد است که به این معنی است که شما می توانید مکان را 1/3 اشتباه به دست بیاورید . باید مکان قبلی را با مکان فعلی ، قبل از به دست آوردن مکان ، مقایسه کنید . اگر تفاوت قابل ملاحظه ای وجود داشت از آخرین مکان استفاده نکنید .

توجه کنید که مکان های کاربر را در یک فایل یا فولدر ذخیره نکنید زیرا با سیاست حفظ حریم خصوصی متضاد است . فقط با آخرین مکان شناخته شده یا مکان های بدست آمده در فصل حاضر ، مقایسه کنید .

ایده دیگر این است که اگر از GoogleApiClient استفاده می کنید ، کلاس جدیدی برای مکان fused مربوط به FusedLocationProvider وجود دارد .

همچنین تا حد زیادی متوجه شدم ، برای هر دستگاهی که دارای اندروید 8.0 (سطح API 26) و  بالاتر هستند ، 4 بار در هر ساعت بازیابی موقعیت مکانی قرار داده شده است . شما می توانید این سند را برای رفتار جدید بررسی کنید .

 

پاسخ 4 :

من در Pune هند مشکل داشتم . دستگاه مورد استفاده برای امتحان ، تبلت Swipe بود . من عرض جغرافیایی و طول جغرافیایی را حفظ کرده و زمان را بروزرسانی می کنم . زمانی که عرض و طول جغرافیایی بعدی بروزرسانی شد ، فاصله بین آن دو مکان را محاسبه می کنم . اگر فاصله بیشتر از 100 کیلومتر باشد ، محاسبه نخواهد شد .

متدی که برای محاسبه فاصله استفاده می کنم به صورت زیر است :

 

public static double calculateDistance(double lat1,double lon1,double lat2,double lon2){

double theta = lon1 - lon2;
double dist = Math.sin(deg2rad(lat1))
*Math.sin(deg2rad(lat2))
+Math.cos(deg2rad(lat1))
*Math.cos(deg2rad(lat2))
*Math.cos(deg2rad(theta));
dist = Math.acos(dist);
dist = rad2deg(dist);
dist = dist *60*1.1515;
return(dist);
}

 

 

چرا این اتفاق می افتد :

در اندروید ، 2 گزینه وجود دارد که موقعیت مکانی را به ما می دهد :

1. GPS

2. اینترنت

GPS (LocationManager.GPS_PROVIDER) : در مقایسه با اینترنت بسیار آهسته است ، اما بسیار دقیق تر از اینترنت است . در مناطق دور افتاده ، اتصال GPS ، اتصال کندتر و گاهی اوقات سخت است .

Internet (LocationManager.NETWORK_PROVIDER) : بسیار سریعتر از GPS است اما دقت آن کمتر است .

اگر GPS غیر قابل دسترس است و شما نیاز به موقعیت مکانی فعلی دارید ، LocationManager به شما داده های موجود که از اینترنت گرفته شده را می دهد . (در این مورد شما می توانید location provider را بررسی کنید)

 

پاسخ 5 :

اگر شما از location manager استفاده می کنید ، گاهی اوقات مقدار null را بر می گرداند زیرا آخرین مکان شناخته شده را دریافت می کند . گوگل Fused API را برای اندروید معرفی می کند . آن همیشه مقدار صحیح را بر می گرداند . من قبلا این مشکل را در این لینک مطرح کرده ام :

 

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

 

در کد بالا متد onLocationChanged وجود دارد که یک مکان را بر می گرداند . مکان فعلی بررسی می شود و اگر دقت آن بیشتر از 30 متر باشد ، دوباره مکان فعلی بررسی می شود .

 

صفحه اصلی

591

07 / 06 / 1396

PERSIAN STACK


چرا گاهی اوقات API موقعیت مکانی سرویس گوگل پلی ، موقعیت مکانی اشتباهی را برمی گرداند ؟

ادامه مطلب

591

چگونه نرم افزار ضبط صدای اندرویدی بسازیم ؟

ادامه مطلب

529

چرا TextView کلمات را با حروف می شکند ؟

ادامه مطلب

483

قسمت شانزدهم - جدول ها در HTML

ادامه مطلب

367

چرا وبسایت تجارت الکترونیک Magento 2 در Webview اندروید کار نمی کند ؟

ادامه مطلب

347

دانلود پروژه نمایش جستجوی کتاب برای اندروید

ادامه مطلب

323

چگونه Google API برای سطح API 25 را پیدا کنیم ؟

ادامه مطلب

319

دانلود سورس کد بازی اندرویدی Klooni 1010! + فایل APK

ادامه مطلب

237

آیا راهی برای یافتن تغیرات ماه در نمای تقویم اندروید (calendar view) وجود دارد ؟

ادامه مطلب

223

در تکمیل خودکار اندروید ، دلیل dispatchProvideAutofillStructure() not laid out چیست ؟

ادامه مطلب

219

چرا زمانی که با استفاده از cordova در اندروید 7.0 ، اس ام اس ارسال می کنیم ، با اثتثنای (Exception) امنیتی مواج

ادامه مطلب

215

دانلود تمامی API های اندروید

ادامه مطلب

205

دانلود تمامی نسخه های gradle برای اندروید

ادامه مطلب

177

آموزش ساخت و شخصی سازی Navigation Drawer در اندروید استودیو

ادامه مطلب

161

دانلود سورس کد اپلیکیشن هواشناسی برای اندروید + فایل APK

ادامه مطلب

157

چگونه ارور com.bumptech.glide.Registry$NoModelLoaderAvailableException: Failed to find any ModelLoaders را در اندروید رفع کنیم ؟

ادامه مطلب

151

دانلود اسکریپت جاوای PS-CH# - ایجاد ورودی متنی پیشرفته

ادامه مطلب

99

چگونه می توان با استفاده از CSS ، رنگ placeholder را تغییر داد ؟

ادامه مطلب

85

دانلود کتابخانه Retrofit برای اندروید + پروژه

ادامه مطلب

83

قسمت هفدهم - لیست ها در HTML

ادامه مطلب

83

دانلود اسکریپت جاوای PS-CH# - ایجاد ورودی متنی پیشرفته

ادامه مطلب

یکشنبه 05 آذر 1396

قسمت هفدهم - لیست ها در HTML

ادامه مطلب

یکشنبه 21 آبان 1396

چگونه می توان با استفاده از CSS ، رنگ placeholder را تغییر داد ؟

ادامه مطلب

یکشنبه 21 آبان 1396

قسمت شانزدهم - جدول ها در HTML

ادامه مطلب

شنبه 20 آبان 1396

دانلود تمامی نسخه های gradle برای اندروید

ادامه مطلب

شنبه 20 آبان 1396

قسمت پانزدهم - عکس ها در HTML

ادامه مطلب

جمعه 19 آبان 1396

قسمت چهاردهم - لینک ها در HTML

ادامه مطلب

یکشنبه 14 آبان 1396

آموزش ساخت و شخصی سازی Navigation Drawer در اندروید استودیو

ادامه مطلب

یکشنبه 14 آبان 1396

قسمت سیزدهم - CSS در HTML

ادامه مطلب

شنبه 13 آبان 1396

قسمت بیست و پنجم (قسمت آخر) - آموزش ساخت بازی حدس

ادامه مطلب

پنجشنبه 11 آبان 1396

قسمت بیست و چهارم - آموزش نحوه ی پردازش فایل ها در جاوا

ادامه مطلب

پنجشنبه 11 آبان 1396

قسمت بیست و سوم - برنامه تکمیلی جاوا (6)

ادامه مطلب

پنجشنبه 11 آبان 1396

قسمت بیست و دوم - معرفی آرایه ها در جاوا

ادامه مطلب

پنجشنبه 11 آبان 1396

قسمت بیست و یکم - برنامه تکمیلی جاوا (5)

ادامه مطلب

پنجشنبه 11 آبان 1396

قسمت بیستم - معرفی مفهوم وراثت در جاوا

ادامه مطلب

پنجشنبه 11 آبان 1396

قسمت نوزدهم - برنامه تکمیلی جاوا (4)

ادامه مطلب

پنجشنبه 11 آبان 1396

قسمت هجدهم - معرفی عبارات کنترلی در جاوا

ادامه مطلب

پنجشنبه 11 آبان 1396

قسمت هفدهم - برنامه تکمیلی جاوا (2-3)

ادامه مطلب

چهارشنبه 10 آبان 1396

چگونه در برنامه نویسی اندروید ، یک ListView با متن و عکس بسازیم ؟

ادامه مطلب

سه شنبه 09 آبان 1396

چگونه در برنامه نویسی اندروید از فونت شخصی خود استفاده کنیم ؟

ادامه مطلب

سه شنبه 09 آبان 1396

دانلود تمامی نسخه های gradle برای اندروید

ادامه مطلب

آموزش ساخت و شخصی سازی Navigation Drawer در اندروید استودیو

ادامه مطلب

چگونه در برنامه نویسی اندروید ، یک ListView با متن و عکس بسازیم ؟

ادامه مطلب

چگونه در برنامه نویسی اندروید از فونت شخصی خود استفاده کنیم ؟

ادامه مطلب

چگونه در برنامه نویسی اندروید می توان آیدی موبایل را بدست آورد ؟

ادامه مطلب

چگونه در برنامه نویسی اندروید برنامه تماس بسازیم ؟

ادامه مطلب

چگونه در برنامه نویسی اندروید یک منو ساده بسازیم ؟

ادامه مطلب

چگونه در برنامه نویسی اندروید از برنامه اسکرین شات بگیریم ؟

ادامه مطلب

چگونه می توان در اندروید RTL یا LTR صفحه را ثابت کرد ؟

ادامه مطلب

چگونه می توان در اندروید حالت افقی (landscape) را غیر فعال کرد ؟

ادامه مطلب

آموزش استفاده از دیتابیس آماده در پروژه اندرویدی

ادامه مطلب

دانلود سورس کد تمامی نسخه های تلگرام + فایل های نصبی

ادامه مطلب

دانلود کتابخانه GSON برای اندروید + پروژه

ادامه مطلب

دانلود سورس کد اپلیکیشن آموزش زبان انگلیسی + فایل APK

ادامه مطلب

چگونه نگذاریم در آغاز اکتیویتی ، EditText فوکوس را بدست آورد ؟

ادامه مطلب

چگونه کیبورد پیش فرض اندروید (Soft Keyboard) را پنهان کرده یا ببندیم ؟

ادامه مطلب

چرا سرعت مجازی ساز اندروید کم است و چگونه می توان سرعت آنرا افزایش داد ؟

ادامه مطلب

تفاوت بین واحد های اندازه گیری "px" , "dp" , "dip" و "sp" چیست ؟

ادامه مطلب

دانلود سورس کد اپلیکیشن آهنگ سازی برای اندروید + فایل APK

ادامه مطلب

دانلود سورس کد اپلیکیشن هواشناسی برای اندروید + فایل APK

ادامه مطلب

× برای نظر گذاشتن یا پاسخ دادن به سوالات باید در سایت عضو باشید !

برای حمایت از ما روی بنر های زیر کلیک کنید .

برای سفارش تبلیغات به ما ایمیل بزنید .

ارتباط با ما