React-native: دائمًا ما تنتهي مهلة تحديد الموقع الجغرافي "enableHighAccuracy" على نظام Android

تم إنشاؤها على ١٠ مايو ٢٠١٦  ·  239تعليقات  ·  مصدر: facebook/react-native

عند تطوير تطبيق Android ، أثناء تصحيح الأخطاء على جهازي Android الذي يعمل على 6.1 ، تقوم واجهة برمجة التطبيقات الخاصة بالموقع الجغرافي دائمًا بإرجاع رد اتصال بالخطأ بالرسالة Location request timed out .

navigator.geolocation.getCurrentPosition(
      (position) => {
        console.log(position);
       },
       (error) => {
        console.log(error)
      },
      {enableHighAccuracy: true, timeout: 20000, maximumAge: 10000}
);

إذا قمت بتبديل خيار enableHighAccuracy إلى false ، فإن واجهة برمجة التطبيقات تعمل بشكل جيد. في وضع الدقة العالية ، تستغرق المهلة دائمًا المدة التي أحددها في خيار المهلة ، أي 20 ثانية.

لقد حاولت التشغيل مع إيقاف تشغيل وضع dev.

هل يجب أن يعمل وضع الدقة العالية في Android؟

Geolocation Bug Help Wanted Android Ran Commands Locked

التعليق الأكثر فائدة

تعيين enableHighAccuracy إما true أو false لا يعمل معي.
حذف الوسيطة الثالثة لـ getCurrentPosition لاستخدام القيم الافتراضية من الوحدة النمطية الأصلية تناسبني.

ال 239 كومينتر

@ acapop77 نسيت أن أذكر أيضًا أنه يتم تمكين الأذونات باستخدام:

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

لدي نفس المشكلة على RN 0.25.1 ، الفرق هو ، بالنسبة لي ، استمرت المشكلة من أجل الدقة العالية والمنخفضة. أخيرًا وجدت شيئًا يجعله يعمل ، لكنه ليس حلاً.

إليكم ما نجح معي - بافتراض أنك تستخدم محاكي الأسهم بنظام Android AVD:

  1. في جهاز محاكي android ، انتقل إلى "الإعدادات> الموقع" (مثلما تفعل على الجهاز الفعلي) واضبط الوضع على دقة عالية.
  2. ارجع إلى التطبيق.
  3. اضغط على زر "Extended controls" (الذي يمثله "..."). بعد ذلك في قسم الموقع سترى بيانات نقطة بيانات GPS وزر "إرسال" أدناه. ما عليك سوى النقر فوق "إرسال" وإغلاق قائمة عناصر التحكم الموسعة.
  4. أعد تحميل التطبيق.

هذا يعمل بالنسبة لي - على أساس "مرة واحدة فقط". في كل مرة أرغب في إعادة تحميل التطبيق ، أحتاج إلى الانتقال من 3 إلى 4 خطوات مرة أخرى. ولكن على الأقل بهذه الطريقة أحصل على تحديد الموقع الجغرافي للعمل ، ولا أحصل على خطأ انتهاء المهلة.

أواجه شيئًا مشابهًا في 0.24. على الرغم من وجود <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> في ملف AndroidManifest.xml الخاص بي ، أتلقى الخطأ الأحمر الذي يفيد:

"يبدو أن التطبيق ليس لديه إذن للوصول إلى الموقع. أضف السطر التالي ..."

أنا لا أستخدم المحاكي وبدلاً من ذلك أقوم بالبناء مباشرة على الجهاز.

تحرير - يحدث هذا أيضًا في 0.25.1

@ acapop77rossthedevigner أنا بناء أيضا مباشرة إلى جهاز سامسونج S6.

Findiglay نفسه هنا. حتى أنني حاولت إجراء تثبيت يدوي لبرنامج apk. وما زلت أتلقى الخطأ.

أحاول حلًا بديلًا حيث أقوم بإجراء حلقة عبر بيان الأذونات وأرى ما إذا كان android.permission.ACCESS_FINE_LOCATION ممكّنًا.

أي شخص لديه navigator.geolocation == غير محدد؟

أواجه حاليًا هذه المشكلة على جهازي.

يتم الإبلاغ عن العديد من القضايا هنا. لست متأكدًا من أن جميعها لها صلة بالمشكلة المحددة مع enableHighAccuracy.

ليس لدي أي خبرة في تطوير Android ، لكنني وجدت أنه إذا قمت بتحرير LocationModule.java لترميز خيار LocationOptions boolean highAccuracy = true; وإعادة البناء ، فسيعود موقعي بشكل صحيح. لست متأكدًا مما إذا كانت النتائج مختلفة أم لا عن تلك التي تم تلقيها باستخدام الإعداد enableHighAccuracy: false في واجهة برمجة تطبيقات الموقع الجغرافي React-Native ، ولكن يجب أن يكون من الآمن افتراض أن هذا يعمل في وضع الدقة العالية.

هل يمكن أن يعني هذا أن الخطأ يحدث في الجسر بين Geolocation API و LocationModule؟

أواجه نفس المشكلة. فعلت نفس ما اقترحه Findiglay وعملت عدة مرات ، ولكن بعد ذلك لم أحصل إلا على المهلات.

أي فكرة لماذا يحدث هذا على أجهزة حقيقية؟ :(

وجود نفس المشكلة. أقوم حاليًا بتشغيل التطبيق على أجهزة حقيقية ، باستخدام RN 0.25.1.

يجب أن أضيف أنني أضفت بالفعل أذونات Android الضرورية إلى بيان الأذونات. ولكن لا تزال المهلات.

كحل بديل ، قمت بتمكين "السماح بمواقع وهمية" في إعدادات Android وقمت بتثبيت تطبيق يسخر من نظام تحديد المواقع العالمي (ابحث عن نظام تحديد المواقع العالمي المزيف في المتجر). على الأقل حتى يتم إصلاح ذلك ، لا يتم حظر التطوير

أنا رفاق ،
كنت أواجه نفس الخطأ ، لكن بعد عدة محاولات مع زملائي ، لاحظنا شيئًا غريبًا (لكنه طبيعي إذا كنت مهتمًا بنظام تحديد المواقع العالمي).

إذا أجريت اختبارات "داخل مكتبك" باستخدام جهاز مادي ، فيمكن أن يتأثر محدد موقع GPS بأشياء خارجية مثل الجدران ، أو لسبب بسيط هو أنك تحاول إجراء هذه العملية "داخليًا" ، وبشكل عام ، يجب تنفيذها في الهواء الطلق .

حسنًا ، بعد ذلك نخرج من مكتبنا ، ونعيد تنفيذ الاختبارات ويستجيب الجهاز كما هو مخطط له (لم نتلق خطأ انتهاء مهلة الطلب).

اقتراحي هو: حاول تحديد الموقع الجغرافي باستخدام تعيين "enableHighAccuracy" على "true" ، إذا فشل هذا (في المكتب يمكن أن يفشل ذلك) ، أعد المحاولة باستخدام false ، يجب أن ينجح هذا ، في حالتي.

أتمنى أن يساعد هذا.

+1

نفس المشكلة هنا سواء تم تعيين enableHighAccuracy على true أو false .
إنه يعمل على محاكيات GenyMotion ولكن ليس على أي أجهزة حقيقية (تم اختباره على Samsung و Nexus و Mi).
إذن ممكّن في AndroidManifest.xml
الشفرة:

                navigator.geolocation.getCurrentPosition(
                    (position) => {
                        console.log(position);
                    },
                    (error) => console.log(new Date(), error),
                    {enableHighAccuracy: true, timeout: 10000, maximumAge: 3000}
                );  

تعيين enableHighAccuracy إما true أو false لا يعمل معي.
حذف الوسيطة الثالثة لـ getCurrentPosition لاستخدام القيم الافتراضية من الوحدة النمطية الأصلية تناسبني.

نفس المشكلة هنا مع LGE Nexus 5 (Android 6.0).
في Android 5.1.1 و 4.3 لا توجد مثل هذه المشكلة.
في المحاكي مع Android 6.0 لا توجد مثل هذه المشكلة.
boolean highAccuracy = false; لا يعمل.
RN 0.28.0.

مرحبًا يا رفاق ، لقد وجدت إصلاحًا مؤقتًا - هذه الحزمة https://github.com/lucasferreira/react-native-android-permissions

أي تحديثات أو إصلاح لهذا؟ كل شيء يعمل بشكل جيد على أجهزة Simulator وما قبل 5.0 ، بعد هذه المهلة فقط ، وأنا في أمس الحاجة إلى إصلاح لتطبيق متاح بالفعل!

+1

تتأثر هذه المشكلة بإعداد locationMode على الجهاز. عند ضبط وضع الموقع على دقة عالية أو على الجهاز فقط ، تنتهي مهلة تحديد الموقع الجغرافي. يعمل بشكل صحيح عند ضبط وضع الموقع على توفير شحن البطارية

لقد عانيت من نفس المشكلة ، أخذت مقامرة وأزلت الحجة الثالثة. وهو يعمل الآن.

navigator.geolocation.getCurrentPosition( (position) => { console.log(position); }, (error) => console.log(new Date(), error), {enableHighAccuracy: true, timeout: 10000, maximumAge: 3000} //removed this );

لا كان ذلك بسبب مشكلة مهلة الموقع

نعم ، لقد اكتشفت للتو إزالة الوسيطة الثالثة يبدو أنه حل.

لم نختبر الجهاز بالكامل حتى الآن ولكن يبدو أن الإصدار 22 من نظام التشغيل android ، مع ضبط وضع الجهاز على دقة عالية أو على الجهاز فقط ، سيؤدي إلى انتهاء مهلة الموقع ، عندما يتم تضمين الوسيطة الثالثة بغض النظر عن الإعدادات. يبدو أنه لا يؤثر على إصدار أندرويد 23.

نفس التجربة من جانبي ، باستثناء الإصدار 23 من نظام التشغيل android ، يعمل فقط مع الوسيطة الثالثة عند تعيين enableHighAccuracy على false (يتسبب true في انتهاء مهلة الموقع). تم اختباره أيضًا على إصدارات Android 22 و 21 و 20 و 19 ويبدو أن وجود الوسيطة الثالثة يتسبب في انقضاء المهلة في جميع الحالات. يبدو أن إزالة هذه الحجة هو الحل الوحيد الموثوق به.

إزالة الوسيطة الثالثة فقط اجعلني أحصل على النافذة المنبثقة "انتهت مهلة طلب الموقع" على الفور بدلاً من الانتظار حتى تنتهي المهلة. تعيين enableHighAccuracy على false ، لا يعمل أيضًا.

على المحاكي الخاص بي ، لا يتوفر الموقع إلا عندما أقوم بفتح إعدادات المحاكي وإرسال موقع (تحقق من لقطة الشاشة).

هل هناك طريقة للحصول عليها تلقائيا؟

screen shot 2016-08-21 at 6 42 52 pm

في حالتي ، أدى تعيين enableHighAccuracy إلى false حل المشكلة.

تواجه نفس المشكلة هنا ، سواء على المحاكي أو على الجهاز ، وحاولت باستخدام كل من الصواب والخطأ للتمكين عالي الدقة

لقد حصلت للتو على "undefined ليس كائنًا (تقييم 'navigator.geolocation.getCurrentPosition')"

حاولت التحقق مما إذا كان (الملاح) ، قد عاد صحيحًا ،
ولكن إذا أرجع (navigator.geolocation) خطأ.

أيضًا ، القيام بذلك على الجهاز على Android 5.1 OnePlus One. تم تمكين وضع المطور ، تضمين أذونات AndroidManifest ، تشغيل / إيقاف تشغيل المواقع الوهمية ، كل شيء.

أيضًا ، لا يبدو أنه يطلب مني أذونات الموقع - على الرغم من حذف التطبيق على الجهاز ومجلد الإخراج على جهاز Mac الخاص بي.

لا يمكنني في الواقع تصحيح الأخطاء عن بُعد إما لأنني أستخدم React Realm وهذا الشيء به مشكلات ضخمة تؤدي إلى حل مشكلة مصحح أخطاء الكروم عن بُعد من الداخل إلى الخارج.

لدي مشكلة مماثلة ، قد لا يكون التطبيق دائمًا خارج المهلة الزمنية ولكنه يفعل ذلك كثيرًا ، عندما تعمل تطبيقات تحديد الموقع الجغرافي الأخرى بشكل جيد في كل مرة يكون فيها التطبيق الذي يحتوي على RN موقعًا جغرافيًا سيئًا للغاية.
أنا أستخدم RN 0.32 ولكن لدي نفس المشكلة مع كل إصدار ، لسبب ما ، تحديد الموقع الجغرافي في RN غريب جدًا وفقير (على الأقل على Android)

نفس المشكلة هنا ، الاختبار على جهاز حقيقي.

الوقوع في هذا وهذا أمر مزعج حقًا: /

أواجه نفس المشكلة على Android 6.0.

+1

لقد وجدت أن الحل هو عدم إضافة معلمة ثالثة ، واستخدام المكتبة المرتبطة أعلاه (https://github.com/lucasferreira/react-native-android-permissions) على إصدار android> = 23 لطلب أذونات android M.

تم الآن إضافة أذونات Android التي تم رصدها إلى RN. لذا استخدم هذا لطلب ما إذا كان على android> = 23

https://facebook.github.io/react-native/docs/permissionsandroid.html

لكن لدي Android 5.1.1 على جهازي. في هذا الإصدار من android ، يجب أن يعمل تحديد الموقع الجغرافي بشكل جيد ، أليس كذلك؟

23 هو 6.0 وما بعده. لقد وجدت أيضًا أنني بحاجة إلى عدم إضافة المعلمة الثالثة حتى تعمل على كل شيء.

تمكنت من جعل هذا يعمل ، لكن قد يكون مختلفًا بالنسبة لك. تتضمن الإصدارات الأحدث من RN (Mine 0.32.1) ملفًا يسمى MainApplication.java (إلى جانب MainActivity.java). يقول React Native Mapbox GL Docs أنه يجب عليك تضمين حزمة ReactNativeMapboxGLPackage في MainActivity.java ، ولكن عليك القيام بذلك في MainApplication.java حتى يبدو مثل هذا:

MainApplication.java

". . .

<strong i="8">@Override</strong>
protected List<ReactPackage> getPackages() {
  return Arrays.<ReactPackage>asList(
      new MainReactPackage(),
      new ReactNativeMapboxGLPackage()
  );
}

} ؛
"

وسيظل MainActivity.java كما هو دائمًا.

إصدار Android الخاص بي هو 23 ، لذا ما زلت أستخدم الأذونات من ملف البيان xml

مع تنشيط GPS على الجهاز ، يعيد التطبيق الموقع بشكل جيد ، ولكن إذا قمت بإيقاف تشغيله ، فسيتم إرجاع الموقع: error: No available location provider.

كيف يمكنني إجبار الجهاز على تحديد موقع GPS نشط؟

هذا جنون = /

كان لدي getCurrentPosition أعمل على محاكي Genymotion Android الخاص بي خلال الأسابيع القليلة الماضية ، لكنه فشل الآن مرة أخرى.

أنا أستخدم أداة GPS الخاصة بـ Genymotion لتعيين الموقع. لقد قمت بتثبيت خرائط Google على المحاكي ، ويمكن لخرائط Google قراءة موقعي بشكل جيد.

لدي جميع الأذونات اللازمة ، وحتى أنني أستخدم وحدة PermissionsAndroid مثل sattaman الذي اقترحه. يبدو أن السلوك غير حتمي ، من حيث أنه يعمل يومًا ما وينكسر في اليوم التالي.

أنا على RN 0.31 وإزالة المعلمة الثالثة عملت معي أيضًا! جهاز حقيقي ، Nexus 5X ، Android 6.

لدي نفس المشكلة على RN 0.34.1 ، ولكن إزالة المعلمة الثالثة يمكن إصلاحها
لا يؤدي تعيين enableHighAccuracy to false إلى حل هذه المشكلة

نفس المشكلة معي على RN 0.32 ، جربت مع Android 22 & 23 ،

enableHighAccuracy to true or false، لا يصلح لي
تؤدي إزالة المعلمة الثالثة إلى "انتهاء مهلة طلب الموقع" فورًا
لكن إعادة تشغيل جهازي تجعله يعمل ، لكنه سيتعطل بعد مرور بعض الوقت ،

الآن ، للحصول على موقع المستخدمين ، أستخدم هذا فقط:
https://github.com/mauron85/react-native-background-geolocation

acondense أين تقوم بتعيين رمز تحديد الموقع الجغرافي في الخلفية ، لأنه لا يبدو أنه يشغل وظيفة الموقع

واجهت نفس المشكلة على RN 0.35 مع Android 23 و 24 ، ولكنها تعمل بشكل جيد مع Android 22.
قد يكون مرتبطًا بنظام إذن وقت تشغيل Android 6.0:
http://stackoverflow.com/questions/32224534/access-fine-location-permission-error-emulator-only

أستخدم هذه المكتبة لتجنب هذه المشكلة وهي تعمل بشكل جيد!
https://github.com/yonahforst/react-native-permissions

أدت إزالة المعلمة الثالثة إلى إصلاحها بالنسبة لي أيضًا 💯 💯 💯

عملت إزالة المعلمة الثالثة 👍

لم يكن واضحًا منذ البداية أي المعلمة كان يتحدث عنها الجميع ، أو معلمة الطريقة أو المعامل الثالث لعنصر الخيارات.

لكي أكون دقيقًا ، إنها المعلمة الثالثة لطريقة getCurrentPosition ، والتي تبدو مثل هذا في النهاية:

navigator.geolocation.getCurrentPosition(
    (position) => {
       ...
    },
    (error) => alert(error.message)
)

أخيرًا جئت بالحل التالي (نفس الفكرة الموضحة أعلاه):

export const detectCurrentLocation = (successCallback, errorCallback) => {
    let navigatorOptions = {}
    if (Platform.OS === 'android' && Platform.Version === 23) {
        navigatorOptions = {
            enableHighAccuracy: false,
            timeout: 10000,
            maximumAge: 0
        }
    }

    navigator.geolocation.getCurrentPosition(
        position => successCallback(detectedLocation),
        error => errorCallback(error),
        navigatorOptions
    )
}

إنه يعمل على الأجهزة (تم اختباره على Android 21 و 22 و 23) ، ولكنه بطيء للغاية بالنسبة لنظام Android 23: من 5 إلى 10 ثوانٍ.

هل استخدم أي شخص LocationServices.FusedLocationApi كحل بديل لهذا الغرض في التفاعل الأصلي (التنفيذ محليًا ، في كود Java لنظام Android)؟

enableHighAccuracy: true لا تعمل على android إطلاقًا

أنا أستخدم هذا الرمز للتحقق من إذن الموقع على Android 6

requestLocationPermission = async () => {
    try {
      const granted = await PermissionsAndroid.requestPermission(
        PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
        {
          'title': 'Enable location',
          'message': 'Location is good \o/',
        },
      );

      if (granted) {
        console.log('You can use the location');
        this.getLocation();
      } else {
        console.log('Location permission denied');
      }
    } catch (err) {
      console.warn(err);
    }
  };

sibelius يمنع هذا Location request timed out ؟

استخدم مقتطفي وهذا أيضًا https://github.com/facebook/react-native/issues/7495#issuecomment -259753488

ألا يوجد حتى الآن حل لهذا؟ لقد جربت كل شيء تمامًا في هذا الموضوع ولا يعمل شيء بالنسبة لي ، إنه دائمًا خطأ مؤقت ، إما على الفور أو بعد بضع ثوانٍ.

نفس الشيء هنا ، تعليق sattaman قد أصلحه لجهازي (ضبط وضع الموقع على توفير البطارية) ، ولكن كيف تخبر مستخدمي التطبيق أن يفعلوا مثل هذا الشيء!

إما تعطيل enableHighAccuracy أو تشغيل المعلمة الثالثة يعمل بالنسبة لي. ومع ذلك ، لا يزال الموقع يبدو دقيقًا جدًا.
لا مشاكل على iOS. (RN 0.39)

RN 0.40 نفس المشكلة. إزالة المعلمة الثالثة يحلها.
(لكنك لا تحصل على دقة عالية)

نفس المشكلة ، إزالة المعلمة الثالثة حلها.

على أحد المحاكيات ، يتعين علي تعيين enableHighAccuracy: true والتأكد من ضبط وضع الموقع على دقة عالية. وإلا فإنه ينتهي. لا يمكنني توفير طاقة البطارية على المحاكي للعمل تحت أي ظرف من الظروف.

على الجهاز لا أمرر أي خيارات على الإطلاق. إذا كنت تكافح مع هذا كما فعلت - أقترح تجربته على أجهزة حقيقية. لقد اختبرت على Pixel C (Android 7.1) والملاحظة 4 (Android 6.0.1)

على نظام التشغيل iOS ، كان علي تعيين الدقة العالية إلى True. يمكنك تخيل وظيفة الحصول على الموقع في هذه المرحلة ...

أعمل على RN 0.40 وأستخدم جهازًا حقيقيًا (Nexus 5) وما زلت أواجه المشكلة.

لقد جربت أي شيء من كل التعليقات في هذه المسألة.

هل قام أحد بحل المشكلة بطريقة أخرى غير مذكورة هنا؟

// تحديث:

يبدو أن navigator.geolocation.watchPosition يعمل. لذلك قد يكون استخدامه هو الحل حتى يتم إصلاح navigator.geolocation.getCurrentPosition.

في الوقت الحالي ، سأكتب وحدة أصلية وأتحدث إلى واجهات برمجة التطبيقات الأصلية مباشرةً ، لأن استخدام الدقة العالية مهم بالنسبة لي.
يبدو أن واجهة برمجة تطبيقات تحديد الموقع الجغرافي لـ RN غير مستقرة في الوقت الحالي.

في مشروعي ، أجد بعض القواعد.

  1. إعداد جهاز android - الموقع هو الجهاز فقط ، لا يجب عليك تعيين enableHighAccuracy: true للحصول على الوضع الحالي
  2. الإعداد - الموقع عالي الدقة ، يجب عليك تعيين enableHighAccuracy: true للحصول على الوضع الحالي

وفقًا لهاتين القاعدتين ، تسير الأمور بشكل جيد في مشروعي

kimochg ما هو إعداد الاختبار الخاص بك؟

في الاختبار الذي أجريته ، سيؤدي تعيين إعداد الجهاز للموقع على الجهاز فقط إلى انتهاء الوقت في كل مرة ، بغض النظر عن الموقع الجغرافي enableHighAccuracy .

سيمنحني تعيين إعداد الجهاز على "دقة عالية" موقعًا صالحًا بغض النظر عما تم تعيين enableHighAccuracy عليه.

تعديل
يبدو أنه بالنسبة لي لن يجلب الموقع الجغرافي موقعًا جديدًا إلا إذا قمت بتعيين enableHighAccuracy: false وإعداد موقع الجهاز على أنه دقة عالية. باستخدام enableHighAccuracy: true ، سيتم جلب موقع مخبأ ولكن الجلب الجديد سينتهي.

هذا على React Native 0.40 ، الاختبار على Nexus 5X الذي يعمل بنظام Android 7.1.1

kulmajaba البعض بينما تتفاعل Native 0.40 ، يتم الاختبار على Nexus 5X الذي يعمل بنظام Android 7.1.1
لكن محاكي android هنا ، ليس جهاز android حقيقي

إذا كنت تستخدم المحاكي ،
هل تنقر فوق الزر "عناصر تحكم موسعة" على الشريط الأيمن للمحاكي وترسل بيانات GPS؟
(الزر)

@ kimochg طيب. أنا أستخدم جهازًا حقيقيًا للاختبار ، وسأحتاج إلى مقارنة سلوك المحاكي بذلك في المرة القادمة التي أعمل فيها في المشروع.

Ascendance @ Daniel-ltw لقد اتبعت جميع الحلول في هذا الموضوع ولم أتمكن من زعزعة مشكلات navigator.geolocation المخيفة. ثم قمت بتسجيل navigator .

هذا ما استعدته:

ProxyComponent
_attachGesture
_cleanScenesPastIndex
_clearTransformations
_completeTransition
_deltaForGestureAction
_detachGesture
_disableScene
_disableTVEventHandler
_doesGestureOverswipe
_eligibleGestures
...

ثم أدركت أن هذا قادم من مكون Navigator. يستخدم (route, navigator) عند عرض المسارات. من المؤكد أن إزالة متغير الملاح وتسجيل الدخول مرة أخرى أسفرت عن:

WorkerNavigator
appCodeName
appName
appVersion
geolocation (...)
get geolocation
getValue()
set geolocation
setValue(newValue)
hardwareConcurrency

أتمنى أن يساعد هذا شخصًا آخر - استغرقني وقتًا محزنًا لأدرك ما كانت المشكلة. : /

kulmajaba قامت maximumAge بإصلاح أي مشاكل في التخزين المؤقت بالنسبة لي. سيؤدي ضبطه على 0 إلى إجباره على الحصول دائمًا على منصب جديد.

بالنسبة لأي شخص آخر يعاني من مشكلة المهلة ، قرأت أنه في بعض الأحيان قد تستغرق مكالمات GPS عالية الدقة بعض الوقت (أكثر من دقيقة) ، خاصةً عندما تكون في الداخل - كما أشار RoBYCoNTe أعلاه.

قد لا يكون الاعتماد على مكالمة عالية الدقة من get go هو الأفضل ، وربما يكون الحصول على دقة منخفضة أولاً وبدء مكالمة عالية الدقة في الخلفية طريقة أفضل. هذا يعتمد على احتياجاتك بالطبع ، فالانتظار لمدة دقيقة + لإجراء مكالمة ليس للجميع :)

نظرًا أيضًا إلى أن RN توسع مواصفات الويب لتحديد الموقع الجغرافي ، يمكنك العثور على إجابات متعلقة بها على الويب ، مثل الاسم المناسب http://stackoverflow.com/questions/3752383/geolocation-is-so-slow-what-im- فعل الخطأ

هل لدى أي شخص حل قوي؟ لا يستطيع بعض المستخدمين التسجيل في تطبيقي بسبب جزء من التسجيل يتطلب منهم تعيين موقعهم الجغرافي. تحدث المشكلة فقط على بعض أجهزة Android ، ولا أستخدم المعلمة الثالثة. يقودني للجنون. يقوم الأشخاص تلقائيًا بإعطاء تطبيقي تقييمات بنجمة واحدة لأنهم لا يستطيعون تعيين موقعهم الجغرافي ، هاهاها. >.>

booboothefool جرب استخدام المعلمة options واجتياز highAccuracy كـ
خاطئة. النتائج أسرع بهذه الطريقة.

يوم الإثنين 20 فبراير 2017 الساعة 9:50 صباحًا booboothefool [email protected]
كتب:

هل لدى أي شخص حل قوي؟ لا يستطيع بعض المستخدمين التسجيل في
التطبيق بسبب جزء من التسجيل يتطلب منهم تعيين موقعهم الجغرافي.
المشكلة تحدث فقط على بعض أجهزة Android ، وأنا لست كذلك
باستخدام المعلمة الثالثة. يقودني للجنون.

-
أنت تتلقى هذا لأنك علقت.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-281142941 ،
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/ADJE_BC-osVA45bcpejEI_paDEBykBs1ks5redJtgaJpZM4Ibete
.

greyvugrin حسنًا ، سأعطي هذه اللقطة. لماذا يبلغ نصف الأشخاص عن "أنك بحاجة إلى إزالة المعلمة الثالثة ، فقط الإعداد لتمكين HighAccuracy to false false" لا يعمل؟ يبدو أن الجميع يقول شيئًا مختلفًا.

بناءً على هذا أيضًا: https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions

يبدو أن هذه هي الخيارات الافتراضية. enableHighAccuracy: false مع timeout: Infinity ، ألا يجب أن يقوم بذلك بالفعل إذا لم أقدم المعلمة الثالثة؟

booboothefool أنت محق في أن هذا الموضوع محير. مما يمكنني قوله ، قد يكون الأشخاص الذين حذفوا معلمة الخيارات قد حلوا مشكلتهم لأن شيئًا آخر في الإعدادات كان يؤثر على الأشياء.

إعداد enableHighAccuracy إما على صواب أو خطأ لا يعمل بالنسبة لي.
حذف الوسيطة الثالثة لـ getCurrentPosition لاستخدام القيم الافتراضية من الوحدة النمطية الأصلية تعمل بالنسبة لي.

لذلك ربما كانت المشكلة مع timeout . هناك الكثير من العوامل التي تدخل في تحديد الموقع الجغرافي ، وسيساعد الحصول على أكبر قدر ممكن من المعلومات من الأشخاص الذين يتعرضون للانهيار.

إذا تمت إزالة الخيارات بالفعل و RN افتراضيًا إلى نفس المعلمات مثل الويب ، فيجب أن تعمل الأشياء بشكل جيد. إذا كنت لا تزال تواجه مشكلات ، فربما ترى ما إذا كان المستخدمون لديهم أذونات ممكَّنة للموقع (وأنت تتحقق من ذلك في تطبيقك).

مرحبًا greyvugrin ،

شكرا للنصيحة الكبيرة حول الأذونات. أعتقد أن هذا ما كنت أفتقده. بعد تنفيذ https://github.com/lucasferreira/react-native-android-permissions (أفضل واجهة برمجة التطبيقات هذه على https://facebook.github.io/react-native/docs/permissionsandroid.html) ، جنبًا إلى جنب مع تحديد enableHighAccuracy: false ، وتعيين timeout ، يبدو أنه يعمل مع الجميع الآن.

انتقل تطبيقي من نجمة واحدة على متجر Google Play مع قيام الجميع بنقله في المهملات بسبب مشكلات تحديد الموقع الجغرافي إلى 3.6 نجوم ، هاهاها! 👍

booboothefool هذه أخبار رائعة ، سعيد لسماعها !!!

لقد جربت جميع الأساليب المقترحة هنا. لا يمكن الحصول على أي شيء من getCurrentPosition لكن المهلات على جهاز محاكاة أو جهاز على Android. watchPosition ولكنه لا يقدم بالفعل أفضل تجربة مستخدم للمستخدم ، فأنا بحاجة فقط إلى موقع المستخدمين مرة واحدة ، ولا داعي للحفاظ على نظام تحديد المواقع العالمي (GPS) عند إهدار بطاريتهم.

لقد حاولت:

  • تمكين عالية الدقة: خطأ
  • إزالة حجة الخيارات
  • التحقق من وطلب الإذن android> = 23
  • كلا من FINE و COARSE في البيان.

لا شيء يغير مهلات getCurrentPosition

هذا مجرد شيء سيتعين على مطوري Android Studio Emulator إصلاحه / تنفيذه في المستقبل عندما تتاح لهم الفرصة.

ومع ذلك ، في هذه الأثناء ... يمكنك استيراد ملف أثر GPX كبير والسماح له بالتشغيل بسرعة "1x". حصلت على GPX من هنا ... ExpertGPS.com -> ca-trails.gpx
... استمر هذا الملف حوالي 8 دقائق بسرعة 5x ، لذا عند السرعة "1x" يجب أن يستمر حوالي 40 دقيقة.

قم بتحميله (أو ملف GPX آخر أكبر حجمًا) في [...] الخيارات الموسعة-> الموقع (تحميل زر GPS / KML أسفل اليمين) ، اضغط على زر التشغيل ، ثم أغلق النافذة ... سيستمر اللعب حتى تصل إلى النهاية. سيء للغاية ، لا يوجد تكرار تلقائي - طلب ميزة آخر لمبرمجي Android Studio. :-)

هذا ليس صحيحا. أحصل على نفس المهلات على أجهزة حقيقية.
تنتهي مهلة getCurrentPosition دائمًا. الساعة تعمل بشكل جيد. اختبار Z5 و Nexus 5X
& بكسل ، كل المهلة عند الاتصال الأولي للحصول على الوضع الحالي.

في السبت ، 4 مارس 2017 ، الساعة 19:49 ، كتب Deen Foxx ، [email protected] :

هذا مجرد شيء سيذهب إليه مطورو Android Studio Emulator
يجب إصلاحه / تنفيذه في المستقبل عندما تتاح لهم الفرصة.

ومع ذلك ، في هذه الأثناء ... يمكنك استيراد ملف أثر GPX كبير والسماح لـ
يتم تشغيله بسرعة "1x". أمسكت ببطاقة GPX من هنا ... ExpertGPS.com ->
ca-trails.gpx
https://www.expertgps.com/data/downloading.asp؟file=ca/ca-trails.gpx
... استمر هذا الملف حوالي 8 دقائق بسرعة "5x" ، لذا بسرعة "1x"
يجب أن تستمر حوالي 40 دقيقة.

قم بتحميله (أو ملف GPX آخر ربما أكبر) في [...] Extended
خيارات-> الموقع (زر تحميل GPS / KML في أسفل اليمين) ، اضغط على التشغيل
زر ، ثم أغلق النافذة ... سيستمر في اللعب حتى يصل إلى ملف
النهاية. من المؤسف أنه لا يوجد تكرار تلقائي - طلب ميزة آخر لنظام Android
مبرمجي الاستوديو. :-)

-
أنت تتلقى هذا لأنك علقت.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-284172310 ،
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/AACQ6AoZYXJ02DCmevcLmmF3tuOdg_SEks5ribJHgaJpZM4Ibete
.

عملت إزالة المعامل الثالث إلى getCurrentLocation لي على المحاكي.

{
   timeout: 20000,
    maximumAge: 1000
}

لقد قمت للتو بترميز احتمال ثلاثي. ربما مبالغة قليلاً ، لكن حسنًا. إليك مقتطف الشفرة (مع التعليقات) ...

class FindNearMe extends Component {

  constructor(props) {
    super(props);

    this.state = {
      prevLatitude: 0.0,
      prevLongitude: 0.0,
      gotLocation: false,
      locating: false,
      loading: false
    };
  }

  handleGeolocationSuccess = (position) => {

    // Get a response, say we are done locating, even if it is still looking for a fine result.
    this.setState({ locating: false });

    // If we previously failed, we can clear the error if it just happens to still be visible.
    if (!this.state.gotLocation) {
      this.props.navigator.hideLocalAlert();  // Hide possibly open alert.
      this.setState({ gotLocation: true });  // Remove the previous failure state.
    }

    // Only proceed if there is an actual change in location.
    if (this.state.prevLatitude != position.coords.latitude ||
        this.state.prevLongitude != position.coords.longitude) {

      // Overwrite the old location with the new location.
      this.setState({
        prevLatitude: position.coords.latitude,
        prevLongitude: position.coords.longitude,
        loading: true // Only needed if you plan to get content from server.
      });

      // ... DO SOMETHING WITH THE UPDATED LOCATION ...
      // If you used a callback function (success or failure) be sure to include this...
      this.setState({ loading: false });
 };

  // This first, RoughError, means the "enableHighAccuracy: false" time-out occurred.
  handleGeolocationRoughError = (error) => {
    this.props.navigator.showLocalAlert('Attempting to pinpoint your location...', config.errorStyles);
    // Invalidate our current location
    this.setState({ gotLocation: false });
  };

  // This second, FineError, means the "enableHighAccuracy: true" time-out occurred.
  handleGeolocationFineError = (error) => {
    // If we got Rough location, I'm ignoring this. But, if neither rough nor fine succeeded...
    if (!this.state.gotLocation) {
      // ...try once more without the options.
      navigator.geolocation.getCurrentPosition(
        this.handleGeolocationSuccess,
        this.handleGeolocationFinalError
      );
    }
  };

  // This last, FinalError, means nothing worked and we're giving up.
  handleGeolocationFinalError = (error) => {
    if (!this.state.gotLocation) {
      this.props.navigator.showLocalAlert('Could not determine your location, sorry!', config.errorStyles);

      // Let our app know that we are not trying anymore.
      this.setState({ locating: false });
    }
  };

  goToNearMe = () => {
      // Track when we are attempting to get a location update.
      this.setState({ locating: true });

      // Try to get the rough location quickly.
      navigator.geolocation.getCurrentPosition(
        this.handleGeolocationSuccess,
        this.handleGeolocationRoughError,
        {
          enableHighAccuracy: false,
          timeout: 500,  // I have this set for half-second before popping up the alert.
          maximumAge: 0
        }
      );

      // But, also, simultaneously try to get the fine location.
      navigator.geolocation.getCurrentPosition(
        this.handleGeolocationSuccess,
        this.handleGeolocationFineError,
        {
          enableHighAccuracy: true,
          timeout: 7500,  // I have this set for 7.5 seconds, about the length of the first alert's visibility.
          maximumAge: 0
        }
      );
  };

  render() {
    return (
        <Container>
          <LocateMeButton
              onPress={this.goToNearMe}
              loading={this.state.loading || this.state.locating}
          />
          <Header>
            Use Current Location
          </Header>
        </Container>
    );
  }
}

export default FindNearMe;

لقد اختبرت هذا فقط على برامج محاكاة التطوير المحلية ، وليس في الإنتاج. اسمحوا لي أن أعرف إذا كان هذا مفيد لك.

كنت أفكر فقط ... من المحتمل أن تعمل بشكل مثالي كتمرير ثنائي إذا كانت مكالمة الخطأ التقريبية تستخدم فقط الإصدار الأقل من الخيارات ...

  goToNearMe = () => {
      // Track when we are attempting to get a location update.
      this.setState({ locating: true });

      // Try to get the rough location quickly.
      navigator.geolocation.getCurrentPosition(
        this.handleGeolocationSuccess,
        this.handleGeolocationRoughError,
// Just leave this off entirely (but default timeout is Infinity, so you'd never get the first alert!)...
//        {
//          enableHighAccuracy: false,
//          timeout: 500,  // I have this set for half-second before popping up the alert.
//          maximumAge: 0
//        }
// ...or try ujwal-setlur's method of leaving off the enableHighAccuracy portion...
        {
          timeout: 500,
          maximumAge: 0
        }
// NOTE: ujwal-setlur's method did NOT work for my Android emulator.
//             I had to comment out the options object completely for it to not time-out.
      );

      // But, also, simultaneously try to get the fine location.
      navigator.geolocation.getCurrentPosition(
        this.handleGeolocationSuccess,
//        this.handleGeolocationFineError,  // Wouldn't need this, make it your FinalError instead.
        this.handleGeolocationFinalError,
        {
          enableHighAccuracy: true,
          timeout: 7500,  // I have this set for 7.5 seconds, about the length of the first alert's visibility.
          maximumAge: 0
        }
      );
  };

من شأن ذلك أن يجعل هواتف Android التي تعاني من مشاكل لا تتأخر بعد الآن ، ولكنها لا تزال تحاول الدقة العالية. ثم لن تحتاج بعد الآن إلى خطأ FineError على الإطلاق ، يمكن إزالة هذا الرمز.

  • نعم ، أعلم أن هناك احتمالًا بسيطًا أن تعود المحاولة "enableHighAccuracy: true" قبل النتائج "التقريبية" الأخرى غير المتزامنة (خاصة إذا كانت المهلة لا نهائية) وبالتالي تضيع / يتم الكتابة عليها ... لكنني أشك في ذلك. إذا كنت تريد حقًا أن تكون حذرًا إلى هذا الحد ، يمكنك تغيير الكود لاختبار هذه الحالة بالذات.

أي تقدم في هذا؟

أليكس ، هناك بعض الحلول في هذا الموضوع. ماذا حاولت؟ ذلك
قد يكون من المفيد أيضًا إنشاء تذكرة جديدة بمجرد الحصول على مزيد من التفاصيل منذ ذلك الحين
هذا الخيط طويل جدًا ، إذا لم يعمل أي من الحلول المذكورة أعلاه.

يوم الجمعة 17 مارس 2017 الساعة 10:29 صباحًا Alex Sinelnikov [email protected]
كتب:

أي تقدم في هذا؟

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-287419487 ،
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/ADJE_HLDGQEplAduqm3Zx5L74dv99mnhks5rmsLjgaJpZM4Ibete
.

مثلك. لا يعمل أي من الاقتراحات المذكورة أعلاه. الحل الوحيد بالنسبة لي
الحصول على موقع على Android هو استخدام ساعة وتحديث واجهة المستخدم للإبلاغ
المستخدم ما يحدث إذا كانت تطبيقاتك تعمل بالرد على الموقع. لا تفعل
عناء مع getCurrentPosition لا يعمل في أي من الاختبارات العشرة الحقيقية
الأجهزة التي نقوم بتشغيل إصدارات أندرويد مختلفة 4+

في الجمعة ، 17 مارس 2017 ، الساعة 17:48 ، كتب Gray Vugrin ، [email protected] :

أليكس ، هناك بعض الحلول في هذا الموضوع. ماذا حاولت؟ ذلك
قد يكون من المفيد أيضًا إنشاء تذكرة جديدة بمجرد الحصول على مزيد من التفاصيل منذ ذلك الحين
هذا الخيط طويل جدًا ، إذا لم يعمل أي من الحلول المذكورة أعلاه.

يوم الجمعة 17 مارس 2017 الساعة 10:29 صباحًا Alex Sinelnikov [email protected]
كتب:

أي تقدم في هذا؟

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
<
https://github.com/facebook/react-native/issues/7495#issuecomment -287419487
،
أو كتم الخيط
<
https://github.com/notifications/unsubscribe-auth/ADJE_HLDGQEplAduqm3Zx5L74dv99mnhks5rmsLjgaJpZM4Ibete

.

-
أنت تتلقى هذا لأنك علقت.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-287424598 ،
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/AACQ6DgWuUzw4hj7rmr8LDzcRHjEheIcks5rmsdSgaJpZM4Ibete
.

في بعض الأحيان يعمل ، والبعض الآخر لا يعمل. لقد جربت جميع الحلول أعلاه ولا يوجد حل موثوق به حتى الآن. هذا حقا يجعلني مجنون :(

هل هناك أي وحدة وطنية تقوم بتكرار وظيفة مثل getCurrentPosition؟ أنا أبحث عن ريبو آخر لأنني لا أستطيع كتابة كود جافا.

يواجه watchPosition مشكلة عندما لا يتم تمكين الموقع. لم يتم التخلص من المهلة أبدًا على الرغم من أنني قمت بتعيين مهلة = 1000

في "getCurrentPosition" ، سيتم إلغاء المهلة ، لذا يمكنني تشغيل مربع حوار الموقع لتمكين GPS. ولكني الآن انتقل من "getCurrentPosition"

تعديل:
لقد جربت جميع الاختلافات والآن أعرف أين تكمن المشكلة. أنا يمكن أن تجعل من العمل إذا إزالة بارامس الثالثة ووضع مجموعة الموقع إما دقة عالية أو توفير البطارية. خلاف ذلك ، فإنه لا يعمل. لا أعرف كيفية إخبار المستخدم باختيار الدقة العالية أو توفير البطارية بدلاً من الجهاز فقط ، لأن له طريقة مختلفة للوصول إلى هذه القائمة لكل بائع.

هناك تعليق أعلاه لإضافة enableHighAccuracy: false في المعلمات الثالثة ، لكنه لم يعمل مع خيارات الدقة العالية أو توفير البطارية أو الجهاز فقط. أعتقد أن المعلمات الثالثة في تحديد الموقع الجغرافي غير مجدية لجهاز حقيقي.

location-mode-100621707-large

في حالتي إزالة maxAge حل المشكلة.

تعمل إزالة maxAge ، ولكن هذا حل مؤقت. عملت بشكل جيد في معظم الحالات ، ولكنها واجهت بعض المشكلات في الإنتاج حيث يكون الموقع الحالي للمستخدم على الخريطة معطلاً تمامًا بسبب استخدام الإحداثيات التي لا معنى لها. تحولت إلى تطبيق أصلي بدلاً من ذلك.

nigelnindo ماذا تقصد التنفيذ الأصلي؟ داخل RN أو القيام بذلك مباشرة في Android؟

@ L3V147H4N مباشرة في Android. هناك نوعان من المكتبات التي يمكنك استخدامها لهذا الغرض ، لكنني رأيت أن معظمها غير متوافق مع أحدث إصدارات RN. إذا كان هناك اهتمام كافٍ بهذا ، فلا مانع من قضاء بعض الوقت في إنشاء وحدة بسيطة للمساعدة في حل مشكلات تحديد الموقع الجغرافي على Android الموضحة في هذا الموضوع.

ربما يمكنك التحقق من https://github.com/mauron85/react-native-background-geolocation#getlocationssuccess -fail

إنه تطبيق محلي ويعمل بشكل جيد بالنسبة لي.

أعتقد أن كل شخص تقريبًا في هذا الموضوع سيكون ممتنًا جدًاnigelnindo
https://github.com/nigelnindo

الإثنين، 3 أبريل 2017 في 17:34 نايجل Nindo [email protected] كتب:

@ L3V147H4N https://github.com/L3V147H4N مباشرة في Android. هناك
يمكنك استخدام مكتبتين لهذا الغرض ، لكنني رأيت ذلك كثيرًا
غير متوافق مع أحدث إصدارات RN. إذا كان هناك ما يكفي
مهتم بهذا ، لا أمانع في قضاء بعض الوقت في إنشاء وحدة بسيطة
للمساعدة في حل مشكلات تحديد الموقع الجغرافي على Android الموضحة في هذا الموضوع.

-
أنت تتلقى هذا لأنك علقت.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-291198134 ،
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/AACQ6BwArzmfCk3TXfiRMp7kpdwMLM81ks5rsR-hgaJpZM4Ibete
.

الإحباط ... أحاول استخدام navigator.geolocation.getCurrentPosition لكنني ما زلت أتلقى الخطأ:
انتهت مهلة طلب الموقع. بالنسبة لنظام Android ، يعمل iOS بشكل جيد.
لقد حاولت تعيين enableHighAccuracy إلى True / False ، وإزالة الوسيطة الثالثة ، وقد أضافت أذونات موقع COURSE و FINE في AndroidManifest.

Android SDK 23 ، أدوات البناء 25.0.0
تفاعل 16.0.0-alpha.6
RN 0.43.3

شكرا لمساعدتك!

مرحبًا بك في خيط دوغلاس ، للأسف getCurrentPosition ليس كذلك
يمكن الاعتماد عليها على Android كما اكتشفت.
ألقِ نظرة على بعض الحلول في وقت سابق باستخدام الخيط
بدلاً من ذلك ، watchPosition

شكراraldred.
يبدو أن watchPosition يعمل ، نقدر المساعدة!

douglaswissett على الرحب والسعة. نأمل أن يكون هناك حل قوي مقابل getCurrentPosition قريبًا.

هل يمكنني استخدام watchPosition ثم clearWatch فورًا بعد الحصول على الموقع الجغرافي؟ لدي مشكلة في القيام بذلك ، لأنه لا يمكن استدعاء clearWatch إلا على componentDidMount

pewh نعم. هذا ما اقوم به.
يمكن أيضًا استدعاء navigator.geolocation.clearWatch أي وقت.
فقط احتفظ بمرجع إلى watchID على المكون الخاص بك والذي يتم إرجاعه بواسطة الاستدعاء إلى watchPosition

من المستندات التي قرأتها على https://facebook.github.io/react-native/docs/geolocation.html ، ليس لدي أي فكرة عن كيفية الحصول على رد اتصال this.watchID داخل watchPosition رد الاتصال. حالة الاستخدام الخاصة بي هي تشغيل clearWatch فور استلام قيمة جديدة.

raldred جرب الحل الخاص بك وكل شخص آخر ، لا شيء يعمل

أي حلول حول هذا؟ جرب كل شيء هنا ولا شيء يبدو أنه يعمل ، الرجاء المساعدة! إذا كان يمكنك مشاركة بعض المقتطفات أو شيء من هذا القبيل

@ gerard0315 هل حصلت على بعض النجاح في حل هذه

يبدو أنه يعمل على هاتف Android حقيقي بالنسبة لي

احصل على Outlook لنظام التشغيل iOS https://aka.ms/o0ukef


من: خورخي الموناسيد [email protected]
تاريخ الإرسال: الثلاثاء ، 9 مايو 2017 2:29:56 مساءً
إلى: facebook / رد فعل أصلي
نسخة إلى: أوجوال سيتلور ؛ تعليق
الموضوع: Re: [facebook / رد فعل أصلي] تحديد الموقع الجغرافي "enableHighAccuracy" على Android دائمًا تنتهي مهلته (# 7495)

أي حلول حول هذا؟ جرب كل شيء هنا ولا شيء يبدو أنه يعمل ، الرجاء المساعدة! إذا كان يمكنك مشاركة بعض المقتطفات أو شيء من هذا القبيل

-
أنت تتلقى هذا لأنك علقت.
قم بالرد على هذه الرسالة الإلكترونية مباشرةً ، أو قم بعرضها على GitHub https://github.com/facebook/react-native/issues/7495#issuecomment-300307037 ، أو تجاهل الموضوع https://github.com/notifications/unsubscribe-auth/ AFkMXWcokXoYDpsw28UaiUSDtCvRpE3Rks5r4NrUgaJpZM4Ibete .

لقد قمت بالفعل بمشاركة مقتطفاتي التي تعمل على أجهزة حقيقية قيد التشغيل
Android 4-7.

في الثلاثاء ، 9 مايو 2017 ، 22:29 ، كتب خورخي الموناسيد ، [email protected] :

أي حلول حول هذا؟ جرب كل شيء هنا ولا يبدو أن الأشياء تعمل ،
الرجاء المساعدة! إذا كان يمكنك مشاركة بعض المقتطفات أو شيء من هذا القبيل

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-300307037 ،
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/AACQ6HSlN8YS_jE6NY9w2vuk7Hv4Wjwfks5r4NrSgaJpZM4Ibete
.

في الوقت الحالي ، من الممكن الحصول على تحديث (في محاكي android) فقط إذا قمت بتغيير جميع المعلمات (خط الطول ، خط العرض ، الارتفاع) في نفس الوقت. إذا قمت بتغيير واحد أو اثنين فقط - nothing works .

هناك عيب فطري في طريقة تعامل React-Native مع الموقع على Android. (يبدو أن iOS يفتقر إلى هذه المشكلة ، iirc)

String provider = highAccuracy ? LocationManager.GPS_PROVIDER : LocationManager.NETWORK_PROVIDER;

LocationManager.GPS_PROVIDER is best for outdoors when you have a clear view of the sky

في حين

LocationManager.NETWORK_PROVIDER is best for indoors, since it uses networks (and cell towers?)

في الواقع ، تحتاج إلى كل من مقدمي الخدمة / جميعهم إذا كنت تريد موقعًا دقيقًا للغاية. ثم تريد مقارنة الدقة والطابع الزمني وقبول الموقع الأكثر دقة والحداثة.

هناك طريقتان للقيام بذلك:

في رد الفعل:

قم بإعداد متغيرين watchID -> watchIDGPS و watchIDNetwork . ثم قم بإعداد مراقبين ، أحدهما بـ enableHighAccuracy=true و enableHighAccuracy=false وهذا سيعيد كلاً من مزود GPS ومزود الشبكة (ستكون الشبكة أكثر دقة في الداخل)

مشكلة طريقة React هي أنها تفعل ذلك على سلسلة JS ؛ قد يؤدي هذا إلى تجميد تطبيقك على الأجهزة التي تفتقر إلى الموارد. ومع ذلك فهو يعمل.

باللغة الأصلية:

ستحتاج إلى إعادة كتابة LocationModule.java كوحدة نمطية مخصصة للتعامل مع مزودي الخدمة الذين تختارهم والإبلاغ عن الموقع مرة أخرى إلى mLocationListener بغض النظر عن المزود. حتى تصلح React-Native هذه "المشكلة".

ralred ، شكرًا على المقتطف ولكن ما هو الكائن AndroidPermissions ؟

جربت كل الحلول ، فشلت جميعها ....
تذكرت فجأة أن تطبيقي يحتوي على وحدة خريطة ، وخريطة بايدو ، وخريطة صينية (map.baidu.com) مثل خريطة google ، ويمكنه الحصول على علامات وموقع حالي !!! أخيرًا صنعته ~

يمكنك البحث عنها عن طريق github، response-native-baidu-map

استيراد {
MapView ، // عرض الخريطة (لا أحتاج)
MapTypes ، // اكتب كـ 2D أو 3D (لست بحاجة)
تحديد الموقع الجغرافي // api حول الموقع (أحتاج)
} من "خرائط-أصلية-بايدو" ؛

componentDidMount () {
Geolocation.getCurrentPosition ()
ثم (البيانات => {
Alert.alert (JSON.stringify (data.latitude) ، JSON.stringify (data.longitude))
})
}

لا أعرف ما إذا كان بإمكاني العمل في بلد آخر ، مجرد التفكير باستخدام بعض تطبيقات الخرائط ، يمكنك تجربة خرائط تفاعلية أو خرائط أخرى ...

لا شيء يعمل ، لن يتم استدعاء watchPosition على نظام Android ، يعمل iOS بشكل مثالي. إنه بالفعل RN v0.45.0 (أنا حاليًا على 0.44.0) وما زال لم يتم حله؟ هيا!

تضمين التغريدة
لا شيء يعمل كذلك ، أنا أستخدم الإصدار 0.44. هل حاولت التحديث إلى v0.45؟

VietDucPhan لقد

rexlow أوه جيد بالنسبة لك. الآن ، أنا فقط بحاجة إلى حظي لضربني.

هل حاولت فقط إزالة هيكل الخيارات؟ هذا هو الشيء الوحيد الذي نجح معي.

احصل على Outlook لنظام التشغيل iOS https://aka.ms/o0ukef


من: viet_duc_phan [email protected]
تاريخ الإرسال: الأحد 18 يونيو 2017 الساعة 11:26:15 مساءً
إلى: facebook / رد فعل أصلي
نسخة إلى: أوجوال سيتلور ؛ تعليق
الموضوع: Re: [facebook / رد فعل أصلي] تحديد الموقع الجغرافي "enableHighAccuracy" على Android دائمًا تنتهي مهلته (# 7495)

rexlow https://github.com/rexlow أوه جيد لك. الآن ، أنا فقط بحاجة إلى حظي لضربني.

-
أنت تتلقى هذا لأنك علقت.
قم بالرد على هذه الرسالة الإلكترونية مباشرةً ، أو قم بعرضها على GitHub https://github.com/facebook/react-native/issues/7495#issuecomment-309349488 ، أو تجاهل الموضوع https://github.com/notifications/unsubscribe-auth/ AFkMXYI2vukJgcTLkBeNdXdclgFbgo1sks5sFhSHgaJpZM4Ibete .

rexlow @ ujwal-setlur أريد فقط أن أعلمكم يا رفاق أن الحظ ضربني. إنه يعمل بشكل عشوائي تمامًا. أنا لم أغير أي شيء.

هل جربت على جهاز حقيقي؟

في الثلاثاء ، 20 يونيو 2017 ، الساعة 19:18 من viet_duc_phan ، كتب [email protected] :

rexlow https://github.com/rexlow @ ujwal-setlur
https://github.com/ujwal-setlur فقط أريد أن أعلمكم بذلك يا رفاق
ضربة حظ علي. إنه يعمل بشكل عشوائي تمامًا. لم أغير
اى شى.

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-309843462 ،
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/AACQ6OVyeCsOgd-qevP9CrP9XJMhwaxsks5sGAz3gaJpZM4Ibete
.

raldred يتم اختباره دائمًا على أجهزة حقيقية.

VietDucPhan هل يمكنك إعداد مثال يعيد

في الثلاثاء ، 20 يونيو 2017 ، الساعة 20:52 ، viet_duc_phan ، كتب [email protected] :

raldred https://github.com/raldred يتم اختباره دائمًا على أجهزة حقيقية.

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-309870269 ،
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/AACQ6N5SVbYeDEeY9FRnTQSrvpLwKL5aks5sGCLmgaJpZM4Ibete
.

raldred يحتوي التقرير الأصلي في هذه السلسلة على مقتطف رمز:

navigator.geolocation.getCurrentPosition(
      (position) => {
        console.log(position);
       },
       (error) => {
        console.log(error)
      },
      {enableHighAccuracy: true, timeout: 20000, maximumAge: 10000}
);

لقد فشل بالنسبة لي كذلك. يبدو أن الطريقة الوحيدة لحلها لا تتضمن حجة الخيارات:

navigator.geolocation.getCurrentPosition(
      (position) => {
        console.log(position);
       },
       (error) => {
        console.log(error)
      }
);

dreallday صحيح ، رد فعل المقابض الأصلية لموقع android ضعيف. ومع ذلك ، بدلاً من التعامل مع الموفرين يدويًا ، سيكون من الأفضل استخدام واجهة برمجة التطبيقات Fused التي تجمع المعلومات من المزودين مع السحر.

لقد وجدت موقع React-native-fused-location مفيدًا حقًا لإجراء طلبات تحديد الموقع على Android.

raldred مرحبًا آسف ، لم تتحقق من البريد مؤخرًا ولكنه لا يعمل مرة أخرى.

@ derman232 هل

rexlow آسف لا أعرف الإجابة على ذلك ، ليست ميزة

فقط أعطي مدخلاتي حول كيفية حل هذه المشكلة:

  • المشكلة هي أن android> = 6.0 يتطلب أذونات يتم منحها أثناء وقت التشغيل
  • يحتوي سؤال stackoverflow هذا على مزيد من التفاصيل: سؤال
  • لقد استخدمت وحدة أذونات Android من React Native للحصول على الأذونات

الآن كل شيء يعمل.

مرحبا،
لا شيء يعمل. حاولت كل شيء.
يرجى تقديم النصيحة.
شكرا

أود حقًا المساعدة في حل هذا للناس.
لدينا 3 تطبيقات أصلية تفاعلية تستخدم الموقع المباشر. QA'd على أكثر من 30 جهاز أندرويد حقيقي يقوم بتشغيل Gingerbread عبر Nougat.
تعمل جميعها بشكل جيد خلال اختبار المستخدم ، ومنذ ذلك الحين لم يكن لدينا أي تقارير عن المشكلات من المستخدمين المباشرين.

adriancuco ، هل يمكنك مشاركة التنفيذ

  • نسخة من RN؟
  • ما إصدارات Android التي تواجه مشكلات معها؟
  • ما هي الأجهزة التي تواجه مشاكل معها؟

سيكون هناك تعقيد في التنفيذ أو تكوين الجهاز ، إنها مسألة معرفة ما هو.

raldred ،

آسف. خطأي!
قبل أن أقتل نفسي ، قررت التحقق من إعدادات الموقع على هاتفي ، حيث قرأت قبل يومين ، وتم تمكين GPS للتو. ؛ (
لذلك قمت بتمكين نظام تحديد المواقع العالمي (GPS) وواي فاي وما إلى ذلك وكل شيء والآن يعمل بشكل جيد.
نقدر ذلك حقا.
شكرا جزيلا

أي تحديث بخصوص هذه المسألة؟

لا يوجد حل بعد.


من: adriancuco [email protected]
تاريخ الإرسال: الثلاثاء 4 يوليو 2017 2:44:28 مساءً
إلى: facebook / رد فعل أصلي
نسخة إلى: مروان الصياري ؛ تعليق
الموضوع: Re: [facebook / رد فعل أصلي] تحديد الموقع الجغرافي "enableHighAccuracy" على Android دائمًا تنتهي مهلته (# 7495)

raldred ،

آسف. خطأي!
قبل أن أقتل نفسي ، قررت التحقق من إعدادات الموقع على هاتفي ، حيث قرأت قبل يومين ، وتم تمكين GPS للتو. ؛ (
لذلك قمت بتمكين نظام تحديد المواقع العالمي (GPS) وواي فاي وما إلى ذلك وكل شيء والآن يعمل بشكل جيد.
نقدر ذلك حقا.
شكرا جزيلا

-
أنت تتلقى هذا لأنك علقت.
قم بالرد على هذه الرسالة الإلكترونية مباشرةً ، أو قم بعرضها على GitHub https://github.com/facebook/react-native/issues/7495#issuecomment-312881724 ، أو تجاهل الموضوع https://github.com/notifications/unsubscribe-auth/ AD79YGcm507EtBxrFHHJkEc-OBvRsjKmks5sKkG7gaJpZM4Ibete .

@ m-sayari ستزودنا ببعض المعلومات الإضافية للمساعدة.

  • إصدار RN
  • إصدار Android Build Target
  • إصدار جهاز Android
  • الأجهزة التي تواجه هذه المشكلة عليها.

ستكون شيئًا خاصًا بالتنفيذ / الإعداد الذي يسبب المشكلة. وفقًا لما قلته سابقًا ، هل لدينا عمل بدون مشكلة عبر تطبيقات مباشرة متعددة.

حل هنا! RN 0.45.1 باستخدام Redmi 4A مع Android 6.

واجهت هذه المشكلة في استدعاء navigator.geolocation.getCurrentPosition () داخل componentDidMount ()
بدلاً من getCurrentPosition ، فقط اتصل بـ watchPosition () بنفس المعلمات.

تضمين التغريدة
إصدار RN
0.46
إصدار Android Build Target
API 22
إصدار جهاز Android
6.0.1
الأجهزة التي تواجه هذه المشكلة عليها.
نيكزس 5

يؤدي استدعاء getCurrentLocation بدون المعلمة الثالثة "خيارات" إلى حل مشكلتي. لا يفيدني أن تعيين "دقة عالية" على أنه خطأ

مرحبًا raldred ، نفس المشكلة التي أبلغ عنها الآخرون على RN 0.47.

  • إصدار RN: 0.47.0
  • تم ترك إصدار Android Build Target في الإعدادات الافتراضية لـ RN:
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 22
  • إصدار جهاز Android: 6.0.1، 7.0
  • الأجهزة التي تواجه هذه المشكلة عليها:

    • Nexus 5 مع Android 6.0.1

    • Xiaomi Redmi 3S مع Android 6.0.1

    • محاكي Android يعمل بنظام Android 7.0

getCurrentPosition يعمل بشكل جيد عندما أقوم بتعيين وضع موقع "الجهاز فقط" في إعدادات الجهاز ، ولكن يتوقف عن العمل ( Location request timed out ) عند ضبط الوضع على "دقة عالية".

أحتاج إلى حذف المعلمة الثالثة للحصول على عمل getCurrentPosition على الأقل في وضع الجهاز فقط:

    navigator.geolocation.getCurrentPosition(setLocation);

لقد افترضت هذا ونجح معي ، لم أختبر حالة مختلفة رغم ذلك.
بالنظر إلى خياراتي ، اكتشفت أن هناك عنصرين يتعارضان مع بعضهما البعض maximumAge و enableHighAccuracy ، أعتقد أن هذين الخيارين متماثلان بطريقة مختلفة قليلاً ، في حين أن الحد الأقصى للعمر يضمن لك احصل على أحدث تحديد موقع جغرافي بناءً على إعداداتك على الرغم من أن الدقة منخفضة ، يضمن enableHighAccuracy حصولك على أحدث وأدق موقع ، كنت أواجه نفس المشكلة مع الخيارات التالية.
{enableHighAccuracy: true, timeout: 20000, maximumAge: 60000} حتى أزلت الحد الأقصى للعمر وتركت enableHighAccuracy آمل أن يساعد هذا شخصًا ما.

لقد قمت للتو ببناء رد الفعل الأصلي من المعلم لتجربة ما إذا كان الالتزام 7e11bad86fd21ce1a8408218e66ce85993d9db69 يصلح هذه المشكلة. للأسف ، ما زلت أتلقى نفس الخطأ كما كان من قبل.

يعمل موقع وتأكد أيضًا من أن جهازك قد منح الوصول إلى الموقع للتطبيق ، وأن خدمة الموقع الخاصة بك ممكنة.

olieidel يمكنك التحقق مما إذا كان تطبيقك لديه حق الوصول إلى أذونات الموقع باستخدام واجهة برمجة التطبيقات التالية ، أذونات Android ، عليك أولاً التحقق ثم السؤال إذا لم يتم منحك.

mrbarde شكرا على الرد السريع!

آه ، بعد يوم كامل من تصحيح الأخطاء ، إليك النتائج التي توصلت إليها والحل البديل ذي الصلة:
RN 0.46.4 ، الجهاز: Nexus 5X ، API 25

وضع الموقع: الجهاز فقط

  • getCurrentPosition ، enableHighAccuracy: true : تعمل عندما تكون إشارة GPS متاحة ، وإلا انتهت المهلة
  • getCurrentPosition ، enableHighAccuracy: false : لا يعمل (مهلة). ربما يحتاج إلى خدمات الموقع (وضع الموقع! = الجهاز فقط).
  • watchPosition ، enableHighAccuracy: true : تعمل عندما تكون إشارة GPS متاحة ، وإلا تنتهي المهلة
  • watchPosition ، enableHighAccuracy: false : لا يعمل

وضع الموقع: دقة عالية

  • getCurrentPosition ، enableHighAccuracy: true : تعمل عندما تكون إشارة GPS متاحة ، وإلا انتهت المهلة. قد يُرجع موقعًا أقدم ، بناءً على إعداد maximumAge الخاص بك.
  • getCurrentPosition ، enableHighAccuracy: false : يعمل بعد 5-6s (كما ورد بالفعل).
  • watchPosition ، enableHighAccuracy: true : تعمل عندما تكون إشارة GPS متاحة ، وإلا انتهت المهلة
  • watchPosition ، enableHighAccuracy: false : يعمل

ملخص
إذا كان وضع الموقع الخاص بك هو الجهاز فقط ، فيجب أن تتوقع دائمًا وجود إشارة GPS. في جميع الحالات الأخرى ، تحتاج إلى خدمات الموقع (وضع الموقع! = الجهاز فقط).
أفترض أن هذا هو كل السلوك المتوقع لواجهة برمجة تطبيقات الموقع ولقد اكتشفت للتو أن ما يعادل الأرض ليس مسطحًا ، ومع ذلك ، فهذا أمر يستحق التصحيح إذا كان لديك جهاز تم إعداده باستخدام وضع الموقع == الجهاز فقط ( المحاكي ، جهاز تم تكوينه حديثًا) وأنت جالس في غرفة لا تتوفر بها إشارة GPS. في هذه الحالة ، ستحصل على مهلات فقط.

الحل
كما هو موضح بالفعل في هذا الموضوع ، استخدمت أيضًا مستمعين watchPosition بقيم مختلفة لـ enableHighAccuracy وأخذ القيمة الأولى لكليهما ، ثم أزلهما. من خلال التلاعب بهذا النهج ، كان لدي انطباع بأن كلا المستمعين يعودان فعليًا إلى نفس المواقع ، لكن تسامحي مع تصحيح الأخطاء لهذا اليوم قد استنفد ...
يفترض هذا أن وضع الموقع الخاص بك ليس الجهاز فقط.

olieidel بالتأكيد ، وأتساءل لماذا لا يستخدم أحد واجهة برمجة تطبيقات تحديد الموقع الجغرافي الأصلية مباشرة ، إذا لم تكن مفيدة أو لا تعمل فقط ، أعتقد أن الشيء المناسب هو استبدالها بـ navigator.geolocation لأن هذا يعمل عجائب ، حاول تقديم طلب سحب مع الحل الخاص بك لمعرفة ما إذا كان Facebook سيحبه. وشكرًا على بذل المزيد من الجهد في البحث بشكل أعمق.

لقد استغرق الأمر بعض الوقت لإعادة إنتاج هذه المشكلة باستمرار.

لدي هذه المشكلات فقط على هواتف Samsung التي تعمل بنظام Android 5.1 و 6.0 عندما يتم تعيين وضع الموقع على "دقة عالية" واستخدام واجهة برمجة التطبيقات للموقع الحالي أثناء التواجد في الداخل بدون إشارة GPS. يعمل بشكل جيد على هواتف Oppo أو التواجد في الهواء الطلق مع إشارة GPS واضحة حتى مع تشغيل وضع "الدقة العالية".

سأختبر بعض الحلول المقترحة في هذا الموضوع قريبًا.

mrbarde فقط للتوضيح: كنت أستخدم navigator.geolocation . :)

olieidel أنا أعلم ، ما navigator.geolocation وليس Geolocation Api.

مرحبًا يا شباب ، أدركت أنه على Android ، قد يكون لديك إذن للوصول إلى الموقع ، لكن المستخدم قد أوقف الموقع من إعدادات نظام التشغيل. لذا فإن الاتصال navigator.getCurrentPosition() سيستمر في الانتهاء.

إليك مقتطف Java بطريقتين. checkIfLocationAvailable يتحقق مما إذا كان المستخدم قد تم تشغيل الموقع في الإعدادات أم لا. سيطالبك requestUserToActivateLocation المستخدم بتشغيل الموقع.

package location;

import android.Manifest;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.text.TextUtils;
import android.util.Log;

import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
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.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.LocationSettingsStates;
import com.google.android.gms.location.LocationSettingsStatusCodes;



/**
 * Created by nigelnindo on 11/28/16.
 */
public class LocationBridge extends ReactContextBaseJavaModule implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
    public LocationBridge(ReactApplicationContext reactContext) {
        super(reactContext);
    }

    public GoogleApiClient googleApiClient;

    <strong i="10">@Override</strong>
    public String getName() {
        return "LocationBridge";
    }

    <strong i="11">@ReactMethod</strong>
    public void checkIfLocationAvailable(final Promise promise){

        int locationMode = 0;
        String locationProviders;
        boolean isAvailable = false;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
            try {
                locationMode = Settings.Secure.getInt(getReactApplicationContext().getContentResolver(), Settings.Secure.LOCATION_MODE);
            } catch (Settings.SettingNotFoundException e) {
                e.printStackTrace();
            }

            isAvailable = (locationMode != Settings.Secure.LOCATION_MODE_OFF);
        } else {
            locationProviders = Settings.Secure.getString(getReactApplicationContext().getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
            isAvailable = !TextUtils.isEmpty(locationProviders);
        }

        boolean coarsePermissionCheck = (ContextCompat.checkSelfPermission(getReactApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED);
        boolean finePermissionCheck = (ContextCompat.checkSelfPermission(getReactApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED);

        boolean finalResult = (isAvailable && (coarsePermissionCheck || finePermissionCheck));

        Log.e("FINAL RESULT", Boolean.toString(finalResult));

        promise.resolve(Boolean.toString(finalResult));

    }

    <strong i="12">@ReactMethod</strong>
    public void requestUserToActivateLocation(final Promise promise){

        Log.e("LOCATION_BRIDGE:", "called activate location function");

        if (googleApiClient == null) {
            Log.e("LOCATION_BRIDGE: ", "googleApiClient is null");
            googleApiClient = new GoogleApiClient.Builder(getReactApplicationContext())
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this).build();
            googleApiClient.connect();
        }

        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
        locationRequest.setInterval(30 * 1000);
        locationRequest.setFastestInterval(5 * 1000);
        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(locationRequest);

        //**************************
        builder.setAlwaysShow(true); //this is the key ingredient
        //**************************

        Log.e("LOCATION_BRIDGE", "Created builder");

        PendingResult<LocationSettingsResult> result =
                LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
        result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
            <strong i="13">@Override</strong>
            public void onResult(LocationSettingsResult result) {
                Log.e("LOCATION_BRIDGE: ", "onResult callback invoked");
                final Status status = result.getStatus();
                final LocationSettingsStates state = result.getLocationSettingsStates();
                switch (status.getStatusCode()) {
                    case LocationSettingsStatusCodes.SUCCESS:
                        Log.e("LOCATION_BRIDGE: ", "Location settings satisfied");
                        // All location settings are satisfied. The client can initialize location
                        // requests here.
                        promise.resolve("true");
                        break;
                    case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                        Log.e("LOCATION_BRIDGE", "Location resolution required");
                        // Location settings are not satisfied. But could be fixed by showing the user
                        // a dialog.
                        try {
                            // Show the dialog by calling startResolutionForResult(),
                            // and check the result in onActivityResult().
                            status.startResolutionForResult(
                                    getCurrentActivity(), 1000);
                            promise.resolve("awaiting");
                        } catch (IntentSender.SendIntentException e) {
                            Log.e("LOCATION_BRIDGE", "could not send intent");
                            promise.reject("LOCATION_BRIDGE", "could not send intent");
                        }
                        break;
                    case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                        Log.e("LOCATION_BRIDGE", "location settings are unavailable");
                        // Location settings are not satisfied. However, we have no way to fix the
                        // settings so we won't show the dialog.
                        promise.reject("LOCATION_BRIDGE", "settings change is not available");
                        break;
                }
            }
        });

    }

    <strong i="14">@Override</strong>
    public void onConnected(<strong i="15">@Nullable</strong> Bundle bundle) {
        Log.e("LOCATION_BRIDGE", "CONNECTED");
    }

    <strong i="16">@Override</strong>
    public void onConnectionSuspended(int i) {
        Log.e("LOCATION_BRIDGE", "SUSPENDED");
    }

    <strong i="17">@Override</strong>
    public void onConnectionFailed(<strong i="18">@NonNull</strong> ConnectionResult connectionResult) {
        Log.e("LOCATION_BRIDGE", "CONNECTION FAILED");
        Log.e("LOCATION_BRIDGE", connectionResult.toString());
        if (connectionResult.hasResolution()){
            try {
                connectionResult.startResolutionForResult(getCurrentActivity(), 1);
            } catch (IntentSender.SendIntentException e) {
                e.printStackTrace();
            }
        }
        else{
            Log.e("LOCATION_BRIDGE","CONNECTION FAILURE HAS NO RESOLUTION");
        }
    }
}

منذ أن بدأت في استخدام هذا ، لم أواجه مشكلات مع الموقع مع Android. آمل أن يساعد شخص ما.

بالطبع ستحتاج إلى إضافة compile 'com.google.android.gms:play-services-location:x.x.x' إلى app/build.gradle الخاص بك ، وإنشاء وحدة أصلية كما هو موضح هنا . لست متأكدًا مما إذا كانت هذه الوظيفة كافية لإنشاء مكتبة npm مستقلة.

مرحبًا nigelnindo ، هناك بالفعل واجهة برمجة تطبيقات أصلية لـ أذونات Android ،
يمكنك التحقق للتأكد من أن المستخدم قد قام بتمكين إذن الموقع للتطبيق
كانت لدي نفس المشكلة التي أشرت إليها ، لذا فإن ما فعلته لحل هذا هو ما يلي.

لقد تحققت أولاً لمعرفة ما إذا كان المستخدم قد منح التطبيق حق الوصول إلى موقع الأجهزة

PermissionsAndroid
.check("android.permission.ACCESS_FINE_LOCATION")
.then((granted) => {
    if(granted){
        // do something
        return;
    }
    // do something else
}).catch((err) => {
    // handle error
});

ثم أطلق وظيفة مع الكود أدناه ، وهذا سيطلب من المستخدم
منح الوصول إلى الموقع للتطبيق.

PermissionsAndroid
.request("android.permission.ACCESS_FINE_LOCATION")
.then((resp) => {
    if(resp == "granted"){
        _self._watchLocation();
    }else{
        this.props.watchLocSuccess();
    }
    // set state
    _self.setState({
        requestLocation: false
    });
    // 
}).then((err) => {
    // handle error
});

لقد كان هذا بمثابة الحيلة بالنسبة لي والآن ليس لدي أي مشاكل في الموقع ، آمل أن يساعد هذا شخصًا ما هناك.

مرحبًا mrbarde ، فقط للإضافة ، أستخدم مكتبة PermissionsAndroid بالإضافة إلى المقتطف أعلاه. كما ذكرت من قبل:

مرحبًا يا شباب ، أدركت أنه على Android ، قد يكون لديك إذن للوصول إلى الموقع ، لكن المستخدم قد أوقف الموقع من إعدادات نظام التشغيل.

بمعنى آخر ، يمكن أن يحصل تطبيقك على إذن للوصول إلى الموقع الذي تم الحصول عليه باستخدام PermissionsAndroid ، ولكن إذا قام المستخدم بإيقاف تشغيل الموقع إما من اختصارات شريط الحالة الخاصة به أو بالانتقال إلى Settings -> Location -> Off getCurrentPosition() ستستمر مهلة

nigelnindo yh في هذه الحالة ، بعلاقات عامة مع هذا؟ أعني أنه يمكن أن يوفر الكثير من الوقت حقًا ، فأنا أستخدم حزمة خارجية للتعامل مع هذا لأنني لا أستطيع كتابة Java ، على الرغم من أنني أتمنى حقًا أن يكون لدي الوقت لتعلمها. إذا كان هذا رسميًا في React ، فسأفضل ذلك ، فأنا أشك في الاعتماد على مكتبات الطرف الثالث لأشياء جوهرية مثل هذه ، فأنا قلق بشأن الاتساق.

حاول تغيير (Android) TargetSdkVersion على build.gradle (التطبيق) تحت 23 (16-22) . وسوف يعمل!

لأننا نحتاج إلى إذن من ملف AndroidManifest. وملف AndroidManifest الذي تم استدعائه فقط في SDK تحت 23 (16-22).

ولا تنس أن تضيف:

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

لا تحذف معلمة maxAge!

إذا قمت بذلك ، فستقوم وحدة GPS بإرجاع آخر نتيجة مخزنة مؤقتًا حتى الحصول على الموقع الفعلي من الأقمار الصناعية. قد يكون موضعه مؤقتًا في تطبيق آخر بعيدًا عن موقعك الفعلي. وإذا كنت تحاول حفظ بعض المسار ، فقد تظهر نقاطك العديدة الأولى موضعًا بعيدًا عن موقعك الفعلي.

pavelpashkovsky هل يمكنك إظهار بعض الحقائق أو المستندات الرسمية لدعم مطالبتك؟

rexlow لقد وصفت للتو نتيجة اختباراتي ، لأنه منذ حوالي أسبوع واحد واجهت نفس المشكلة ووجدت هذا الموضوع.

كان لدي حوالي 30 اختبارًا. وحصلت على 3-4 حالات مع موضع خاطئ أول 1-5 ثوانٍ (حتى عثر GPS على إشارة أقمار صناعية)

pavelpashkovsky أواجه الآن نفس المشكلة أيضًا. على الرغم من أن لدي maximumAge: 1000 في التكوين الخاص بي. يبدو أنه يتم تخزين الموقع السابق مؤقتًا كما قلت.

rexlow أنت على حق. في حالتك ، يحتفظ GPS بموقع آخر ثانية واحدة.

لكن أفضل نتيجة حصلت عليها مع maxAge: 0 عندما لا يحفظ GPS أي نتائج ويحاول دائمًا الحصول على الموقع الفعلي (أو خطأ إذا لم يكن بإمكانه الحصول على موقع من الأقمار الصناعية).

أستطيع أن أؤكد أن إزالة الحد الأقصى يمكن أن يسبب مشاكل على هاتف Oppo الذي اختبرته أيضًا. سيستخدم ذاكرة تخزين مؤقت قديمة جدًا.

كان يحدث لي طوال الوقت. تم إيقاف تشغيل إذن تحديد الموقع الجغرافي الخاص بي في معلومات التطبيق -> الأذونات. أتساءل لماذا حدث ذلك ، ولكن يبدو أن هذه الإذن تتجاوز تلك التي نطلبها في وقت التشغيل. ربما شخص آخر لديه هذه المشكلة أيضا

مرحبا (آسف لغتي الإنجليزية).
أعتقد أن زيادة الحد الأقصى للسن سيحل المشكلة.

RN 0.48 وثيقة تحديد الموقع الجغرافي:
تعمل واجهة برمجة تطبيقات الموقع الجغرافي على توسيع مواصفات الويب: https://developer.mozilla.org/en-US/docs/Web/API/Geolocation

وبحسب:
https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/enableHighAccuracy
&
https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/timeout
و بشكل خاص :
https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/maximumAge

في سيناريو بهذه الخيارات:
{enableHighAccuracy: true, timeout: 10000, maximumAge: 30000}

تحاول شريحة GPS الخاصة بالجهاز الاتصال بالأقمار الصناعية. إذا تم إنشاء الاتصال في فترة المهلة (10000 مللي ثانية) ، فسيتم إرجاع خط العرض وخط الطول دون أي خطأ كما قال RoBYCoNTe : issuecomment-220580494 ولكن إذا فشل اتصال GPS أو حاول الجهاز إرجاع خط عرض وخط طول مخزنين مؤقتًا مع أقصى عمر يتم تعيينه في خيارات (30000 مللي ثانية). في حالة وجود شيء ما ، سيتم إرجاع رمز الخطأ 3 مع خطأ انتهاء المهلة في الموضوع.

أعتقد أن زيادة المهلة (على الأقل 25000 مللي ثانية) للاتصال وزيادة الحد الأقصى بشكل خاص للعمر (على الأقل 3600000 مللي ثانية = 1 ساعة) هو الحل الأفضل!

عمل لي {enableHighAccuracy: true, timeout: 25000, maximumAge: 3600000}

_emulator config_: خلال فترة المهلة ، يجب عليك إرسال معلومات الموقع الافتراضي (خطوط الطول والعرض) عبر قائمة الموقع في إعدادات المحاكي. (سيحاكي هذا اتصال القمر الصناعي)

عمل لي { enableHighAccuracy: true, timeout: 60000, maximumAge: 1200 } . بالنسبة لي ، لم يكن الأمر يتعلق بالحد الأقصى للعمر ، لقد كان حول طول الفترة الزمنية التي كنت على استعداد للانتظار.

(Android فقط)
هذه المشكلة ليست علة في رأيي.
في React Native ، يعمل تحديد الموقع الجغرافي على ما يلي:

  • الدقة العالية تعني موقع GPS
  • عند تعطيله ، يقوم بجلب الموقع من مزود الشبكة
  • يسمح لك maxAge بعدم جلب موضع جديد في كل مرة (وهو بطارية ويستغرق وقتًا طويلاً) ولكن يعتمد على موضع التخزين المؤقت

بشكل أساسي ، يكون مزود GPS أبطأ من مزود الشبكة ولن يعمل دائمًا حسب موقعك (إذا لم يتمكن GPS من الوصول إلى الهاتف ، فستحصل على مهلة). مزود الشبكة أسرع وأسهل في الوصول إليه ولكن الدقة منخفضة (أسوأ ما مررت به كان 2000 متر).

إذا حصلت على مهلة باستخدام دقة عالية ، فهذا يعني أنه لا يمكن الوصول إليك بواسطة GPS.
في هذه الحالة ، ضع في اعتبارك تعطيله افتراضيًا وتحديث الموقع لأنه يصبح أكثر دقة. لن ينتظر المستخدمون في هذه الحالة.

في حالتي ، قمت بتطبيق مراقبي الخاصين ، حيث قارنت الموقع وأرد دائمًا الأكثر دقة. تكمن المشكلة في تطبيق RN الافتراضي في أنه يعتمد إما على مزود GPS أو مزود الشبكة ولكنه لا يعيد المقايضة لكليهما. ربما يتعين عليك حلها إما على JS أو Native.

آمل أن يكون قد ساعد.

تم اختباره على نظام Android فقط.

لقد تمكنت من جعلها تعمل مع الحالات التالية والتأكد من تمكين الموقع:

  • إذا كنت تقوم بتشغيل تطبيقك من خلال Android Emulator ، فيجب عليك وضع الخيارات وإلا سيفشل.
navigator.geolocation.getCurrentPosition(
    (position) => {
        this.setState({currentLocation: {lat: position.coords.latitude, lng: position.coords.longitude}})
    }, (error) => {
        alert("Geolocation error: "+error.message);
    },
    {enableHighAccuracy: true, timeout: 20000, maximumAge: 0}
);

أنا فقط استخدم عناصر تحكم ممتدة لإرسال الموقع المطلوب إلى التطبيق.

  • إذا كنت تقوم بتشغيل تطبيقك من خلال هواتف محمولة حقيقية ، فيجب عليك حذف الخيارات وإلا سيفشل.
navigator.geolocation.getCurrentPosition(
    (position) => {
        this.setState({currentLocation: {lat: position.coords.latitude, lng: position.coords.longitude}})
    }, (error) => {
        alert("Geolocation error: "+error.message);
    }
);

سيحصل هذا على موقعك الحالي

نحن نواجه نفس المشكلة!

هل إصلاح هذا قادم في أي إصدار في المستقبل القريب؟

لقد جربت بعض الحلول المقترحة ( مثال ، مثال ، مثال ومثال ) ولم يحل أي منها المشكلة. لكن علي أن أقول أنني لم أجد أي مرجع للسيناريو التالي:

تطبيق

  • أندرويد 6.x
  • رد فعل 16.1.0
  • رد الفعل الأصلي 16.50.3

سيناريو الاستخدام

  • هاتف Android ليس به بطاقة SIM ، فهي مملوكة للشركة ومسموح لها فقط بالاتصال بشبكة WIFI.

ما زلت أتلقى الخطأ Geolocation timed out, code 3 ...

أي شخص حل هذا؟

_تحديث_ (2017-11-13):

لقد قمت بحلها (مؤقتًا على الأقل) عن طريق تعيين Settings >> Privacy >> Location >> Mode إلى High accuracy

مرحبا.
لقد وجدت حلا جيدا!
برجاء قراءة تعليقي السابق على هذا الموضوع أولاً: # issuecomment-331830285

المحلول:
أول استدعاء navigator.geolocation.getCurrentPosition بـ: {enableHighAccuracy: true, timeout: 60000, maximumAge: 0} كـ PositionOptions ، سيؤدي ذلك إلى إرجاع المركز الحالي الحقيقي.
إذا انتهت مهلة الطلب السابق ، فاتصل بـ navigator.geolocation.getCurrentPosition بـ: {enableHighAccuracy: false, timeout: 30000, maximumAge: 3600000} كـ PositionOptions ، سيؤدي هذا إلى إرجاع موضع الدقة المنخفضة كإجراء احتياطي و _ (أعتقد) _ لم
عينة من الرموز:

const GeoHightAccuracy = () => {
  return new Promise((resolve, reject) => {
    navigator.geolocation.getCurrentPosition(
      (locHightAccuracy)=>{
        resolve(locHightAccuracy)
      },
      (error)=>{
        GeoLowAccuracy()
        .then((locLowAccuracy)=>{resolve(locLowAccuracy)})
        .catch((err)=>{reject(err)});
      },
      {enableHighAccuracy: true, timeout: 60000, maximumAge: 0}
    )
  });
};
const GeoLowAccuracy = () => {
  return new Promise((resolve, reject) => {
    navigator.geolocation.getCurrentPosition(
      (locLowAccuracy)=>{
        resolve(locLowAccuracy)
      },
      (error)=>{
        reject(error)
      },
      {enableHighAccuracy: false, timeout: 15000, maximumAge: 3600000}
    )
  });
};



md5-4cb745c8e66bae2435e8bf78ce42a9c0



GeoHightAccuracy()
.then(locationData => console.log(locationData))
.catch(error => console.log(error));

اتمنى ان تكون مفيد

أواجه نفس المشكلة هنا!
لا يمكنني الحصول على navigator.geolocation للعمل على جهازي الحقيقي الذي يعمل بنظام Android.

أعتقد أنه لا يوجد شيء يمكن إصلاحه هنا ، فالموقع الجغرافي يعمل كما هو متوقع. اقرأ منشوري أعلاه.

Rewieer ، شكرًا لك على ردك!

أنا أستخدم هذا الرمز لاختبار navigator.geolocation على تطبيقي.

var options = {
  enableHighAccuracy: true,
  timeout: 5000,
  maximumAge: 5000
};

function success(pos) {
  var crd = pos.coords;
  alert(crd.latitude + " " + crd.longitude);
};

function error(err) {
  alert('ERROR(' + err.code + '): ' + err.message);
};

navigator.geolocation.getCurrentPosition(success, error, options);

أحصل دائمًا على ERROR(3): Location request timed out .
باستخدام كل مجموعة من الخيارات.
يمكنني رؤية النقطة الزرقاء لموقفي على الخريطة ويعمل نظام تحديد المواقع العالمي بشكل جيد ولكن لا يمكنني الحصول على موقع أو الحصول على navigator.geolocation للعمل برمجيًا.

المشاكل المحتملة هي:

  • محاكاة سيئة / تكوين الهاتف
  • ليس في منطقة مغطاة بنظام تحديد المواقع العالمي (يعمل بشكل سيئ في المباني أو في الشوارع ذات المباني الكبيرة على سبيل المثال)
  • وقت الرافضة في وقت مبكر جدا

يبدو أن استخدام موقع الشبكة يعمل بشكل أفضل في هذه الحالة. هل حاولت جلب المركز الحالي بدون خيارات؟ (من شأنها أن تستخدم البنية التحتية المتعلقة بالشبكة للحصول على المنصب)

أنا أستخدم جهاز android حقيقي (الإصدار 5.1)
أنا قادر على تحديد موقفي باستخدام خرائط التفاعل الأصلية (موضع النقطة الزرقاء الصحيح على الخريطة داخل تطبيقي) + يمكنني استخدام تطبيق خرائط Google والانتقال إلى موقعي (يعمل GPS).
أنا أستخدم مهلة كبيرة ، تبديل enableHighAccuracy to true and false ، إزالة الخيارات ... إلخ. فشلت جميعها في الحصول على navigator.geolocation للحصول على البيانات.

هل جعلت يديك متسخين على Android باستخدام واجهة برمجة التطبيقات الأصلية؟

2017-11-16 15:19 GMT + 01: 00 Badis Merabet [email protected] :

أنا أستخدم جهاز android حقيقي (الإصدار 5.1)
أنا قادر على تحديد موقفي باستخدام خرائط التفاعل الأصلية (الأزرق الصحيح
موقع نقطة على الخريطة داخل تطبيقي) + يمكنني استخدام تطبيق خرائط Google و
انتقل إلى موقعي (يعمل GPS).
أنا أستخدم مهلة كبيرة ، وتبديل تمكين الدقة العالية إلى الصواب والخطأ ،
خيارات الإزالة ... إلخ. فشل كل ذلك في الحصول على navigator.geolocation
البيانات.

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-344935653 ،
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/ALuPm5XL1tNLCniOMR4YAMI4ZC2fKxrsks5s3ESBgaJpZM4Ibete
.

نعم Rewieer ، أنا موافق ، سبب الأخطاء هو التكوينات السيئة.

في المحاكي ، يجب أن نرسل خطوط الطول والعرض عبر إعداد المحاكي قبل انتهاء المهلة!

يحاول الحل الخاص بي # issuecomment-331830285 أولاً الحصول على الموقع الحالي الحقيقي عبر GPS والاتصال عبر الأقمار الصناعية وإذا انتهت مهلة الطلب (أو عند أي خطأ آخر) يحاول استخدام البنية التحتية المتعلقة بالشبكة للحصول على موقع

Rewieer لم أعمل مطلقًا مع واجهة برمجة تطبيقات Android الأصلية. أنا أقوم فقط بتطوير JavaScript.

badis الرجاء إرسال الرمز الخاص بك وسجل الأخطاء.

badis
RN Doc:
لطلب الوصول إلى الموقع ، تحتاج إلى إضافة السطر التالي إلى AndroidManifest.xml لتطبيقك:

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

بالعمل مع التفاعل الأصلي ، يجب أن تعرف أجزاءً صغيرة عن البيئة الأصلية الأساسية ، لأن مثل هذه المشكلات تحدث كثيرًا بالنسبة لي عند العمل مع React-Native.
أفضل طريقة فعلية (من وجهة نظر المستخدم) هي جلب تقدير تقريبي في البداية وتصحيحه كما هو ، لأن GPS قد يستغرق بعض الوقت اعتمادًا على موقعك وموقع الأقمار الصناعية القريبة. أعلم أن موقع الشبكة قد يبدو قاسيًا حقًا ولكن أعتقد أنه ليس كل شخص يعيش في سان فرانسيسكو :)

تضمين التغريدة
إليك رمز تجريبي حيث أقوم باختبار الميزات: https://github.com/badis/mobile-react-native
ألق نظرة على صفحة الخريطة.
أريد فقط معرفة ما إذا كانت الشفرة صحيحة وتعمل لصالح شخص آخر.
بعد ذلك سأحاول من جانبي لمعرفة ما إذا كانت المشكلة في إعدادات جهازي والموقع.

شكرا لكم جميعا!

badis هل أضفت <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> إلى AndroidManifest.xml لتطبيقك؟

badis لدي نفس المشكلة بالأمس. إنه يعمل إذا قمت ببساطة بإزالة الوسيطة الأخيرة (أفهم أنها ليست مثالية) كما هو مقترح في https://github.com/facebook/react-native/issues/7495#issuecomment -228730196

ما هي الخيارات الافتراضية لنظام Android؟ ربما يمكن أن يساعد ذلك في حل هذا

أعتقد أننا نستخدم هذه الإعدادات الافتراضية (من فحص LocationModule.java):

{
enableHighAccuracy: false ، // لا تستخدم GPS
maxAge: Double.POSITIVE_INFINITY ، // قبول أي موقع مخبأ
المهلة: طويل. MAX_VALUE ،
مسافة الفلتر: 100
}

كما أننا نواجه نفس خطأ الموقع ، حيث يعمل تعطيل معلمة الخيار الثالث مع وضعي "الدقة العالية" و "توفير البطارية". بعد الجهاز فقط يفشل في كل مرة. enableHighAccuracy to true فشل بغض النظر عن الوضع الذي قمنا بتعيين الجهاز عليه.

هل هذا الشيء يستخدم FusedLocationProviderClient ، كما يقترح موقع Android Dev أن يفعل؟

يعمل تعطيل معلمة الخيار الثالث مع وضعي "الدقة العالية" و "توفير البطارية".

mkpietrzyk لذا فإن حذف options يحل المشكلة لك في هذين الوضعين؟

تضمين التغريدة

نعم ، بالنسبة لنظام التشغيل Android ، استخدمت المعلمات الافتراضية ... ولكن وجود مهلة زمنية لا نهائية تقريبًا والحد الأقصى للعمر لتطبيقي هو نوعًا ما قاتل تطبيقات لأنني بحاجة إلى معرفة مكان المستخدمين للتحقق من بعض الشروط.

باستخدام حل hoorsa هنا للتحقق من عمل GPS أيضًا. ومع ذلك ، فهو أمر صعب للغاية بالنسبة لنظام تحديد المواقع العالمي على أي حال وفي بعض الأحيان لا يستجيب بدقة عالية ... ولهذا السبب لا أعتبر أنه يعمل بشكل جيد ولكن مهلا ، يعمل كيندا.

أواجه نفس المشكلة ، حيث أحتاج إلى تعيين المهلة لتكون قدرًا كبيرًا من الوقت حتى تعمل ، ولكن سيحتاج المستخدمون إلى الوصول إلى المعلومات في وقت أقرب. عند إنشاء التطبيق لأول مرة ، يمكنني تسجيل الدخول في غضون نصف ثانية إلى أن أذونات الوصول إلى الموقع الجيد صالحة. لا يعمل تطبيق الموقع الجيد ببساطة بشكل صحيح على Android.
كمرجع ، لقد جربته مع / بدون أي معلمات. حتى بدون أي خيارات إضافية ، ستظل تفشل في تحميل الموقع في بعض الأحيان. تم إجراء الاختبار على One Plus One

أنا أيضا أواجه مشكلة المهلة هذه.

RN .50.3

حاول ، استدعاء واجهة برمجة التطبيقات مع أو بدون معلمة maxAge:

{enableHighAccuracy: true، timeout: 10000}،

أقوم أيضًا بإغلاق هذه المكالمة بطلب إذن حتى لا تكون هذه مشكلة:

أذونات Android.request (
أذونات Android.PERMISSIONS.ACCESS_FINE_LOCATION ،

تم تمكين وضع الدقة العالية على الجهاز.
المانيفست لديه أذونات صحيحة.

على جهاز Galaxy S7 الخاص بي - يحل موقعًا جيدًا.
على هاتف Pixel 2 الخاص بي - تنتهي المهلة بعد 10 ثوانٍ في موقع لا يحتوي على إشارة GPS.
في المحاكي - تنتهي المهلة بعد 10 ثوانٍ ما لم أذهب إلى علامة تبويب الموقع في عناصر التحكم الموسعة وانقر فوق إرسال لإرسال موقع.

يبدو أن navigator.geolocation.getCurrentPosition لا يعمل في حالة عدم وجود إشارة GPS حتى إذا كان هناك موقع قديم تم تخزينه مؤقتًا من تطبيق آخر سبق أن استخدم الموقع ..

سأعمل على حل هذه olieidel .

لدي نفس المشكلة كماjacksontbryan، ولكن getCurrentPosition لا تستخدم موقع مؤقتا إذا maximumAge تم حذف.

يبدو أنه يعمل بشكل جيد على Galaxy S7 ، ولكن ليس على جهاز LG G6. على LG ، تنتهي المهلة في جميع الأوقات تقريبًا ، إذا تم تعيين maxAge. إذا لم يتم تعيين maxAge ، فإنه يستخدم موقعًا قديمًا.

تحرير: يبدو أن حذف وسيطة الخيارات يعمل تمامًا.

أوصي الجميع باستخدام تنفيذ الوحدة الأصلية الخاصة بهم على Android للحصول على نتائج مستقرة. إنه سهل التنفيذ للغاية ، وستحصل على قدر أكبر من التحكم في نظام تحديد المواقع العالمي (GPS) ولا داعي للقلق بشأن عدم عمل تطبيقك على بعض الأجهزة.

    public Location getBestLastKnownPosition(Context context) {
        LocationManager locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
        List<String> providers = locationManager.getProviders(true);
        Location bestLocation = null;
        for (String provider : providers) {
            Location l = locationManager.getLastKnownLocation(provider);
            if (l == null) {
                continue;
            }
            if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) {
                // Found best last known location: %s", l);
                bestLocation = l;
            }
        }

        if (bestLocation == null) {
            locationManager.requestSingleUpdate(new Criteria(), this, null);
        }
        return bestLocation;
    }

    private static WritableMap locationToMap(Location location) {
        WritableMap map = Arguments.createMap();
        WritableMap coords = Arguments.createMap();
        coords.putDouble("latitude", location.getLatitude());
        coords.putDouble("longitude", location.getLongitude());
        coords.putDouble("altitude", location.getAltitude());
        coords.putDouble("accuracy", location.getAccuracy());
        coords.putDouble("heading", location.getBearing());
        coords.putDouble("speed", location.getSpeed());
        map.putMap("coords", coords);
        map.putDouble("timestamp", location.getTime());
        map.putString("provider", location.getProvider());

        if (android.os.Build.VERSION.SDK_INT >= 18) {
            map.putBoolean("mocked", location.isFromMockProvider());
        }

        return map;
    }

    <strong i="6">@ReactMethod</strong>
    public void getCurrentPosition(Callback successCallback, Callback errorCallback){
        Location l = getBestLastKnownPosition(this.getReactApplicationContext());
        if (l == null){
            errorCallback.invoke("Failed to retrieve current location");
            return;
        }
        successCallback.invoke(locationToMap(l));
    }

    private static class LocationOptions {
        private final long timeout;
        private final double maximumAge;
        private final boolean highAccuracy;
        private final float distanceFilter;

        private LocationOptions(
                long timeout,
                double maximumAge,
                boolean highAccuracy,
                float distanceFilter) {
            this.timeout = timeout;
            this.maximumAge = maximumAge;
            this.highAccuracy = highAccuracy;
            this.distanceFilter = distanceFilter;
        }

        private static LocationOptions fromReactMap(ReadableMap map) {
            // precision might be dropped on timeout (double -> int conversion), but that's OK
            long timeout =
                    map.hasKey("timeout") ? (long) map.getDouble("timeout") : Long.MAX_VALUE;
            double maximumAge =
                    map.hasKey("maximumAge") ? map.getDouble("maximumAge") : Double.POSITIVE_INFINITY;
            boolean highAccuracy =
                    map.hasKey("enableHighAccuracy") && map.getBoolean("enableHighAccuracy");
            float distanceFilter = map.hasKey("distanceFilter") ?
                    (float) map.getDouble("distanceFilter") :
                    10;

            return new LocationOptions(timeout, maximumAge, highAccuracy, distanceFilter);
        }
    }

    <strong i="7">@ReactMethod</strong>
    public void watchPosition(ReadableMap options, Callback successCallback, Callback errorCallback){
        LocationOptions opts = LocationOptions.fromReactMap(options);
        LocationManager locationManager = (LocationManager)this.getReactApplicationContext().getSystemService(Context.LOCATION_SERVICE);
        Criteria criteria = new Criteria();
        if (opts.highAccuracy) {
            criteria.setAccuracy(Criteria.ACCURACY_FINE);
        }
        String bestProvider = locationManager.getBestProvider(criteria, true);

        locationManager.requestLocationUpdates(bestProvider, 1000, opts.distanceFilter, this);
    }

    <strong i="8">@Override</strong>
    public void onLocationChanged(Location location) {
        if (location == null) return;

        this.getReactApplicationContext()
                .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit("locationChanged", locationToMap(location));
    }

Buthrakaur أحاول إنشاء وحدة أصلية أجعلها تعمل بسبب فشلها في البناء. لقد قمت بنشر موضوعي https://gist.github.com/pewh/1fd64c8f0b3797ef2b7a7046b5a5f974 وآمل أن يقوم شخص ما بمراجعة جوهر بلدي. شكرا جزيلا وعيد ميلاد سعيد!

أدى استدعاء navigator.geolocation.getCurrentPosition بدون أي خيارات إلى حل المشكلة بالنسبة لي. أنا أقوم بتمرير عمليات الاسترداد للنجاح والخطأ فقط.

تم اختباره على جهاز حقيقي يعمل بنظام Android 5.1.

ginex هل أنت متأكد من أن البيانات جديدة؟ عندما أفعل ذلك أحصل على بيانات قديمة أحيانًا. (تقول أنا حيث كنت قبل ساعة).

هذا حقا يحتاج التصليح!

مرحبا

انا ايضا اواجه نفس المشكلة. أحصل على خطأ مهلة على بعض الأجهزة. لقد قمت بزيادة المهلة من ثانيتين إلى 10 دقائق ولكن دون الانتظار لمدة 10 دقائق ، فقد أخطأت فقط.

لقد حاولت أيضًا باستخدام enableHighAccuracy: false. في هذه الحالة ، يمكنني الحصول على الموقع (باستثناء وضع الجهاز).

لقد حاولت أيضًا دون اجتياز المعلمات. أنا قادر على الحصول على الموقع في هذه الحالة أيضًا ولكن باستثناء وضع الجهاز.

لقد حاولت أيضًا تجاوز الحد الأقصى للسن ولكن بدون نتيجة.
هذا هو الكود الخاص بي-

getCurrentPosition () {
navigator.geolocation.getCurrentPosition (
(الموقف) => {
console.log ('الحصول على موقف') ؛
this.location = {
خط الطول: position.coords.longitude ،
خط العرض: position.coords.latitude ،
خطأ: لاغية ،
} ؛
} ،
(خطأ) => {
console.log ('الحصول على خطأ الموقف' ، خطأ) ؛
this.location = {
خط الطول: لاغية ،
خط العرض: لاغية ،
خطأ: error.message،
} ؛
} ،
{
تمكين عالية الدقة: صحيح ،
المهلة: 600000
} ،
) ؛
}

إذا كان أي منكم يستخدم skipPermissionsRequest و geoLocation انتهى - راجع # 17487

مرحبا

ngandhy - لا ، أنا لا أستخدم "skipPermissionRequests": صحيح. و minSdkVersion هي 16

لدي نفس المشكلات مثل جميع الأشخاص ، جربت كل مجموعة ذكرها الأشخاص لنظام Android وحلها باستخدام هذا الموقع الجغرافي للخلفية التفاعلية ويمكننا الحصول على مواقع محفوظة وحتى مواقع GPS وستكون هذه المواقع دقيقة للغاية.

badis
نجح حلك بالنسبة لي - شكرًا لك!

طريقتي قبل الإصلاح:

getUserLocationHandler() { navigator.geolocation.getCurrentPosition(position => { console.log(position.coords.latitude, position.coords.longitude); }, err => { console.log(err); } }

طريقتي بعد الإصلاح:

getUserLocationHandler() { navigator.geolocation.getCurrentPosition(position => { console.log(position.coords.latitude, position.coords.longitude); }, err => { console.log(err); }, {enableHighAccuracy: false, timeout: 15000, maximumAge: 3600000}); }

لقد اختبرت هذا الرمز للتو ويمكن أن يكون حلاً:
https://www.abidibo.net/blog/2017/11/23/geolocation-react-native/

هل لديك هذه المشكلة أيضًا ، هل لدى أي شخص حل؟

لقد واجهت هذه المشكلة منذ فترة و "الحل" الوحيد الذي يعمل باستمرار هو تعطيل "enableHighAccuracy". تكمن المشكلة في أنه يستخدم بعد ذلك شبكتك بدلاً من GPS لتحديد موقعك ، مما يفقد الكثير من الدقة.

يبدو أن العديد من الحلول الأخرى تعمل في البداية ، لكنني وجدت أن هذا يرجع عادةً إلى استخدام موضع مؤقت وإذا قمت بإعادة تشغيل هاتفك وتشغيل تطبيقك ، فسيظل يفشل.

اليوم ، وجدت هذه الحزمة التي تستخدم واجهة برمجة تطبيقات المواقع المدمجة من Google لمواقع Android وتعود إلى تطبيق React Native الافتراضي لنظام التشغيل iOS (أنا لست مؤلف هذه الحزمة ، لكنني أشجعه على إنشائها):

https://www.npmjs.com/package/react-native-geolocation-service

لقد اختبرت ذلك قليلاً حتى الآن ، ولكن يبدو أنه يعمل بشكل جيد.

globetro شكرا! لقد تحققت من هذا أيضًا ، ويبدو أنه يعمل بشكل جيد!

globetro شكرا لك.
خدمة تحديد الموقع الجغرافي هي الحل الأفضل.

globetro لقد

رد الفعل الأصلي خدمة تحديد الموقع الجغرافي لا تساعدني :(

بفضل globetro ، * خدمة تحديد الموقع الجغرافي التي تتفاعل معها

تريد حقًا أن يكون لديك مستمعان للموقع (وهو مكلف) ، أحدهما يعمل بدقة عالية والآخر لا يفعل ذلك.

فأنت تريد مقارنة أيهما أكثر دقة وأحدث من موقعك "الحالي".


هذا حل "مؤقت" ، يجب أن يتم تنفيذه حقًا على جانب RN لذا فهو يستخدم أذونات COARSE و FINE إذا تم تمكين الدقة العالية.

لقد أصلحت هذه المشكلة ، ها هو المكون الذي أنشأته باستخدام وعد:
https://gist.github.com/a3diti/5466f7309752cbb2e63ecefff6365bb9
في android ، قمت بإزالة maximumAge ، واحتفظت بـ enableHighAccuracy إلى true ، وأضفت التحقق من الإذن من مكون RN PermissionsAndroid .

@ a3diti هل جربته في العالم الحقيقي؟ يمكن تخزين الموقع مؤقتًا.

@ a3diti ما لم يتم إصلاح شيء ما في أحدث إصدار أصلي ، فلن يعمل هذا في جميع الأوقات على Android. حاول تشغيل ذلك على جهاز Android حقيقي بعد إعادة التشغيل. من المحتمل أن يستغرق الأمر أكثر من 20 ثانية للحصول على تحديث للموقف ، إن لم يكن مجرد مهلة.

لماذا لا تدمج الكود المستخدم هنا https://www.npmjs.com/package/react-native-geolocation-service في النواة؟

أواجه نفس "مشكلة انتهاء المهلة" ، بعد البحث والتطوير أحاول "إعادة تشغيل الجهاز" ثم بعد الحصول على الموقع وعمله بشكل جيد.

الرجاء التحقق من الرمز الخاص بي.

componentDidMount = () => {
navigator.geolocation.getCurrentPosition (
(الموقف) => {
const initialPosition = JSON.stringify (الموقف) ؛
this.setState ({initialPosition}) ،
} ،
(خطأ) => تنبيه (رسالة خطأ) ،
{enableHighAccuracy: false، timeout: 20000، maxAge: 1000، DistanceFilter: 1}

  );
  this.watchID = navigator.geolocation.watchPosition((position) => {
     const lastPosition = JSON.stringify(position);
     this.setState({ lastPosition });
     Alert.alert("Location change",lastPosition);

  });

}

أي سبب لماذا لا يزال الناس يكافحون مع هذا ولا يستخدمونه

https://www.npmjs.com/package/react-native-geolocation-service

كما اقترح سابقا؟ إنه يعمل بشكل مثالي بالنسبة لي.

ألا تعمل من أجل الآخرين؟

تمت إضافة هذا إلى ملف AndroidManifest.xml وهو يعمل!

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

مرحبا شباب،

حاولت استخدام خدمة تحديد الموقع الجغرافي التفاعلية كما اقترحها

@ Patrick-Bayer أستخدمه على تطبيقي على Google Play حيث يعمل ، لكن إصدار التطوير الخاص بي يتعطل الآن على الفور لسبب غير معروف. يبدو أن خدمة تحديد الموقع الجغرافي لرد الفعل هي التي تسبب لي أيضًا التعطل.

Fatal Exception: java.lang.VerifyError: Verifier rejected class com.google.android.gms.location.FusedLocationProviderClient: void com.google.android.gms.location.FusedLocationProviderClient.<init>(android.app.Activity) failed to verify: void com.google.android.gms.location.FusedLocationProviderClient.<init>(android.app.Activity): [0x8] register v2 has type Precise Reference: com.google.android.gms.common.api.internal.zzg but expected Precise Reference: com.google.android.gms.common.api.internal.zzcz

اسمحوا لي أن أعرف إذا كنت تجد حلا.

oakis عملت الخطوات التالية بالنسبة لي:

  1. قم بتحديث Gradle وقم بتغيير الإصدار بتنسيق
dependencies {
        classpath 'com.android.tools.build:gradle:3.1.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }

  1. أضف "google ()" إلى المستودعات في android / build.gradle الخاص بك

في بعض الأحيان ، حتى بعد إضافة <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> إلى AndroidManifest.xml ، قد لا ينجح الأمر.
حل سريع

  1. يمكنك أن تطلب صراحةً معلومات موقع المستخدم عند تحميل الشاشة الأولى لتطبيقك على هذا النحو
    try { const granted = await PermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION ) if (granted == PermissionsAndroid.RESULTS.GRANTED) { // WHATEVER WAY YOU WANT THEM TO KNOW THAT THEY HAVE GRANTED THE PERMISSION //MAY BE USING BASIC ALERT OR TOASTANDROID } else { //SAME AS ABOVE } } catch (error) { //catch the error alert(error); }
  2. لا تقم أبدًا بتعيين enableHighAccuracy ليكون خطأ ، بدلاً من ذلك قم بإزالة maximumAge وقم بزيادة timeOut . شيء مثل {enableHighAccuracy: true, timeout: 100000,} سيفعل.

آمل أن يساعد هذا شخص ما.

بالنسبة لي ، قم بتعيين enableHighAccuracy إلى أعمال صحيحة على API 23 ، على الرغم من أنني بحاجة إلى الضبط على false في API 26.
(إنها الوحيدة التي أختبر عليها)

تحرير: انتهى بي الأمر بتثبيت خدمة تحديد الموقع الجغرافي المتفاعلة

مرحبا،

لدي نفس المشكلة وهنا حل آخر.

لقد أضفت العلامة التالية uses-feature في AndroidManifest.xml ويبدو أن التطبيق يعمل بشكل جيد مع highAccuracy: true

<uses-feature android:name="android.hardware.location.gps" />

يبدو أنه إذا قمت بتعيين highAccuracy: high ، فإن React Native تستخدم GPS_PROVIDER بدلاً من NETWORK_PROVIDER. وكما ورد في مستند Android Developers ، يجب أن يتضمن التطبيق الذي يستهدف API 21 أو أعلى هذه العلامة في AndroidManifest.xml لاستخدام GPS_PROVIDER.

تنبيه: إذا كان تطبيقك يستهدف Android 5.0 (مستوى API 21) أو أعلى ، فيجب أن تعلن أن تطبيقك يستخدم ميزة الأجهزة android.hardware.location.network أو android.hardware.location.gps في ملف البيان ، اعتمادًا على ما إذا كان يتلقى التطبيق تحديثات الموقع من NETWORK_PROVIDER أو من GPS_PROVIDER. إذا تلقى تطبيقك معلومات الموقع من أيٍّ من مصادر موفر الموقع هذه ، فستحتاج إلى التصريح بأن التطبيق يستخدم ميزات الأجهزة هذه في بيان التطبيق الخاص بك. على الأجهزة التي تعمل بإصدارات سابقة لـ Android 5.0 (API 21) ، فإن طلب إذن ACCESS_FINE_LOCATION أو ACCESS_COARSE_LOCATION يتضمن طلبًا ضمنيًا لميزات أجهزة تحديد الموقع. ومع ذلك ، فإن طلب هذه الأذونات لا يطلب تلقائيًا ميزات أجهزة الموقع على Android 5.0 (مستوى API 21) والإصدارات الأحدث.

https://developer.android.com/guide/topics/location/strategies#Permission

لا أعرف لماذا لا تحتاج إلى تضمين android.hardware.location.network في AndroidManifest.xml عند تعيين highAccuracy: false مما يعني أن LocationManager يستخدم NETWORK_PROVIDER وبالتالي فإن العلامة مطلوبة وفقًا للمستند.

أتمنى أن يعمل هذا الحل من أجلك.

لقد أجريت بعض التجارب ويبدو أن المهلة قد تكون لها علاقة بما إذا كانت خدمات موقع Google ممكّنة على الجهاز.
لقد لاحظت أنه عند تشغيل خدمات الموقع على الجهاز ، يسألك مربع تنبيه "هل تريد تحسين دقة الموقع؟" مع نص يوضح أن خدمات الموقع من Google ستعمل في الخلفية ، كما سترسل بيانات الموقع إلى google. يحدث هذا عادةً على جهاز جديد أو محاكي ، لأن معظمنا قد قام بالفعل بتمكين هذا على أجهزتنا العادية.

9vgfb

عندما لا يتم تمكين هذا ، يجب أن يحصل الجهاز على موقع جديد تقريبًا في كل مرة تطلبها (يتم التحكم فيه بواسطة إعدادات maximumAge ). إذا لم تطلب الموقع لفترة من الوقت ، وقيمة timeout ليست كافية للحصول على موقع جديد ، فإن navigator.geolocation.getCurrentPosition سيعيد المهلة.

لقد رأيت أيضًا أن هذا يتم حله عن طريق فتح خرائط google على الجهاز مرة واحدة (والذي يحصل مرة أخرى على موقع جديد).

مرة أخرى ، لا تدعي أن هذا هو التفسير / الحل الصحيح ، فقط أضف ملاحظاتي إلى هذا الموضوع

كنت قادرًا فقط على مشاهدة تغييرات الموقع على Android باستخدام موقع التفاعل الأصلي

أي شخص مهتم بدمج التغييرات من إحدى الوحدات المقترحة إلى جوهر؟

منذ بضعة أيام ، قمت بنشر تحديد الموقع الجغرافي المتوافق مع

رد فعل - أصلي - خدمة تحديد الموقع الجغرافي - تستخدم هذه الحزمة واجهة برمجة تطبيقات مدمجة للموقع وتعمل بشكل جيد للحصول على الموقع أو حتى لمشاهدة الموقع. hramos و reyalpsirc من فضلك جربها.

موقع hramos المصهور يعتمد على خدمات Google Play وأتساءل عما إذا كان الترخيص على ما يرام؟

لقد جربت كل شيء تقريبًا وتبين أنه غير متسق. لقد وجدت شيئًا قد يكون مفيدًا.

يعني تمكين الدقة العالية العثور على الموقع عبر شبكة GPS + (خدمات الناقل). عند التحقق من أذونات مستوى التطبيق ، تم تعطيل أذونات موقع خدمات الناقل على جهازي. إن تمكينه وإزالة المعامل الثالث من navigator.geolocation.getCurrentPosition () يعمل بالنسبة لي.
محاولة
-انتقل إلى إعدادات جهازك -> الأمان والموقع -> الموقع -> أذونات مستوى التطبيق
-تمكين إذن الموقع لخدمات الناقل
-إزالة تكوين الموقع (المعلمة الثالثة) من getCurrentPosition
-أعد تشغيل جهازك

أتمنى أن يساعدك هذا!

لست متأكدًا مما إذا كانت ذات صلة. لكن أحد الأمثلة على https://snack.expo.io/SkJqg8gYm. بعد تخصيص الكود ، ضرب الرمز بلوك catch طوال الوقت. ثم اكتشفت أنه كلما حدث استثناء لجافا سكريبت ، يتم إلقاؤه بصمت. بسبب هذا تم تنفيذ كتلة الصيد. ثم تأكدت من عدم حدوث خطأ أثناء استدعاء هذه الوظيفة. أعتقد أنه يجب تطبيق الكتابة المطبوعة في مثل هذه الحالات لمنع حدوث أخطاء في وقت التشغيل.

{enableHighAccuracy: true, timeout: 10000, maximumAge: 0}
ما وجدته في حالة تخطي المعلمة الثانية أو إعطاء أقل من 10000 قيمة مع إعطاء الخطأ

حاول إعطاء المعلمات الثلاثة المذكورة أعلاه ستحل مشكلتي على الأقل في المحاكي

حاول إضافة هذه الأذونات إلى _AndroidManifest.xml_ :

<_uses-الإذن i = "6" />
<_uses-الإذن i = "8" />
<_permission_ i = "10" /> _android: name = "android.permission.ACCESS_COARSE_LOCATION" _
_android: protectionLevel = "signature" _ />
<_permission_ i = "13" /> _android: name = "android.permission.ACCESS_FINE_LOCATION" _
_android: protectionLevel = "signature" _ />

مرحبًا ، كنت أواجه نفس المشكلة "انتهت مهلة الطلب" لقد جربت كل الحلول الممكنة كما هو مذكور أعلاه والتي لا يمكن أن تعمل من أجلي ولكني وجدت مؤخرًا وحدة واحدة تتغلب على هذه المشكلة.
https://www.npmjs.com/package/react-native-geolocation-service
هذا عمل لي .....

vishalTechnoFreek ، يوجد أيضًا رد فعل أصلي عبر تحديد الموقع الجغرافي .

إنه متوافق تمامًا مع الموقع الجغرافي RN الحالي ، ولكن باستخدام Google API الجديد. باستخدام واجهة برمجة التطبيقات هذه ، لا تقلق بشأن الوضع الذي يجب استخدامه ، تكتشف الخدمة تلقائيًا الخيار الأفضل.

ميزة أخرى هي أنه عندما تصحح RN هذه المشكلة ، يمكنك إزالتها دون التأثير على تطبيقك ، إذا كنت ترغب في ذلك.

بالنسبة لحالتي ، فإن ما ذكره

أنا أعمل مع Genymotion و Android 5.

أيضًا ، لمستخدمي Genymotion ، لقراءة الموضع بشكل صحيح ، يجب فتح نافذة خريطة Genymotion ؛ وإلا فإنه سيعمل ولكن مع موقع Geny الافتراضي

تعيين enableHighAccuracy إما true أو false لا يعمل معي.
حذف الوسيطة الثالثة لـ getCurrentPosition لاستخدام القيم الافتراضية من الوحدة النمطية الأصلية تناسبني.

المنقذ 👍 هذا عمل بالنسبة لي.

أنا رفاق ،
كنت أواجه نفس الخطأ ، لكن بعد عدة محاولات مع زملائي ، لاحظنا شيئًا غريبًا (لكنه طبيعي إذا كنت مهتمًا بنظام تحديد المواقع العالمي).

إذا أجريت اختبارات "داخل مكتبك" باستخدام جهاز مادي ، فيمكن أن يتأثر محدد موقع GPS بأشياء خارجية مثل الجدران ، أو لسبب بسيط هو أنك تحاول إجراء هذه العملية "داخليًا" ، وبشكل عام ، يجب تنفيذها في الهواء الطلق .

حسنًا ، بعد ذلك نخرج من مكتبنا ، ونعيد تنفيذ الاختبارات ويستجيب الجهاز كما هو مخطط له (لم نتلق خطأ انتهاء مهلة الطلب).

اقتراحي هو: حاول تحديد الموقع الجغرافي باستخدام تعيين "enableHighAccuracy" على "true" ، إذا فشل هذا (في المكتب يمكن أن يفشل ذلك) ، أعد المحاولة باستخدام false ، يجب أن ينجح هذا ، في حالتي.

أتمنى أن يساعد هذا.

أواجه نفس المشكلة ، ولكن تعيين enableHighAccuracy إلى false لا يعمل بالنسبة لي. لذا فإن هذا الحل الذي يبدو مثاليًا لا يناسبني.

لقد واجهت مشكلة مماثلة مع طلبات متعددة (التحديد المستمر لاستخدام الموقع الحالي) لقد أضفت إعادة المحاولة لطلب الموقع. ليست المشكلة بالضبط ولكنها قد تساعد شخصًا ما.

import retry from 'retry'
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
  const operation = retry.operation({ retries: 2 });
  operation.attempt(() => {
    navigator.geolocation.getCurrentPosition(
      (response) => { resolve(response) },
      (error) => {
        if (operation.retry(error)) {
          return;
        }
        reject(error)
     },
     { timeout: 2000, enableHighAccuracy: true, maximumAge: 100 },
   );
 })
} else {
  reject(new Error('Location access denied'))
}

https://www.npmjs.com/package/react-native-geolocation-service
هذه الحزمة حلت المشكلة بالنسبة لي.
لم تنجح جميع الاقتراحات المذكورة أعلاه تقريبًا بالنسبة لي.

مرحبًا ، ضيف حل المشكلة ، ما حدث هو أنه عندما نسأل عن الموقع في المرة الأولى ونستخدم "maximunAge" ، فليس لدينا موقع سابق مخبأ ، لذلك ، هناك خطأ ، تأكد من أنه في المرة الأولى عندما نسأل عن الموقع بدون "maximunAge"

الجواب البسيط هو الخروج من مكانك والذهاب إلى مساحة مفتوحة ثم المحاولة مرة أخرى.

علمه البسيط.

تتأثر خدمات GPS بالجدران السميكة والسيارات.

هذا عمل معي. لا حاجة لتعديل أي شيء !!!

في حالتي إزالة maxAge حل المشكلة.

شكرا جزيلا! عمل!

مرحبا،
لا يعمل أي من الحلول بالنسبة لي.
أستخدم navigator.geolocation ، باستخدام {enableHighAccuracy: false} فقط كمعامل ثالث.
في iOS ، يعمل بشكل جيد وفي نظام Android لا يعمل في أجهزة معينة.
لقد تحققت في Android 7 و 8 و 9. إنه لا يعمل في هاتف Lenovo مع Android 7. ولكنه يعمل مع الأجهزة الأخرى التي تعمل بنظام Android 7.

هل لدى أي شخص أي حل بديل لحل هذه المشكلة.
أي اقتراح هو موضع تقدير.

شكر

akhilsanker ربما جرب مكتبة مثل موقع التفاعل الأصلي

مرحبا reyalpsirc ،

شكرا على الرد. حقا نقدر وقتك.
لا توجد مشكلة في iOS وتعمل بشكل جيد في معظم أجهزة Android. لدي قيود زمنية محدودة وسيكون من الصعب استخدام مكتبة جديدة ، كما اقترحت.
هل لديك أي حل بديل آخر لحل هذه المشكلة؟
شكرا على وقتك.

شكرا لك.

عذرًا akhilsanker ، كل ما فعلته هو استخدام الموقع الجغرافي الأصلي لرد الفعل لنظام iOS و FusedLocation لنظام Android.

تعيين maximumAge:0 عمل لي:
{ enableHighAccuracy: true, timeout: 60000, maximumAge:0 }
ربما GersonM على حق ...

تمت إزالة وحدة تحديد الموقع الجغرافي من RN بشكل رئيسي ، ولن تكون متاحة في 0.60. يرجى استخدام https://github.com/react-native-community/react-native-geolocation والإبلاغ عن المشكلات هناك. شكرا لك

إنه عام 2019 ، جربت 3 مكتبات مواقع مختلفة ، ولم يعمل أي منها على Android. رائعة حقا.

إنه عام 2019 ، جربت 3 مكتبات مواقع مختلفة ، ولم يعمل أي منها على Android. رائعة حقا.

تعمل خدمة تحديد الموقع الجغرافي الأصلي بشكل جيد.

إذا كانت الحزمة لا تعمل ، فقم بإنشاء بطاقة إصدار في هذا الريبو. المشاكل لن تصلح نفسها ، انضم إلى المجتمع.

انظر تعليق iwangsyah . كنت بحاجة إلى كل من العلامات الوصفية <permission> __and__ <uses-permission>

https://www.npmjs.com/package/react-native-geolocation-service
هذه الحزمة حلت المشكلة بالنسبة لي.
لم تنجح جميع الاقتراحات المذكورة أعلاه تقريبًا بالنسبة لي.

شكرا لك!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات