Flutter-geolocator: Android Pie(API 28) Geolocator().getCurrentPosition()์ด ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์Œ

์— ๋งŒ๋“  2018๋…„ 11์›” 02์ผ  ยท  39์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Baseflow/flutter-geolocator

๐Ÿ› ๋ฒ„๊ทธ ์‹ ๊ณ 

Android Pie(API 28) ํ˜ธ์ถœ์ด ์žˆ๋Š” Android Emulator์—์„œ Geolocator().getCurrentPosition()์„ ์‹คํ–‰ํ•  ๋•Œ ํ˜ธ์ถœ์ด ์ „ํ˜€ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

API 27 ์œ„์น˜์—์„œ ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ƒˆ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ์•„๋ฌด ๊ฒƒ๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ตฌ์„ฑ

Android Pie๊ฐ€ ํฌํ•จ๋œ Android ์—๋ฎฌ๋ ˆ์ดํ„ฐ(API 28)

๋ฒ„์ „: 2.1.0

ํ”Œ๋žซํผ:

  • [ ] : ์•„์ดํฐ: iOS
  • [X ] :๋กœ๋ด‡: ์•ˆ๋“œ๋กœ์ด๋“œ

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉฐ ์ž‘๋™ํ•˜๋„๋ก ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด getLastKnownPosition()์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

Geolocator().getCurrentPosition().timeout(Duration(seconds: 10)).then((position) {
      //getting position without problems
      print(position);
    }).catchError((error) {
      if (error is TimeoutException) {
        Geolocator().getLastKnownPosition().then((position) {
          //getting last known position
          print(position);
        }).catchError((error) {
          //handle the exception
        });
      } else {
        //handle the exception
      }
    });

์ŠคํŠธ๋ฆผ๊ณผ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  39 ๋Œ“๊ธ€

๋‚˜๋„, ๋ฌด์Šจ ์ผ ์žˆ์–ด? :(

์—ฌ๊ธฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€!

@savjolovs ๋””๋ฒ„๊ทธํ•˜๋ฉด ๋””๋ฒ„๊ฑฐ๊ฐ€ Geolocator().getCurrentPosition()์—์„œ ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ• ์ดํ›„์˜ ์ค‘๋‹จ์ ์ด ์ ์ค‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ํ–‰๋™์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ™•์žฅ ์ปจํŠธ๋กค์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ถ€ ์ขŒํ‘œ๋ฅผ ํ‘ธ์‹œํ•  ๋•Œ๊นŒ์ง€ ๋™์ผํ•œ ๋™์ž‘์ž…๋‹ˆ๋‹ค.
๋‘ ๊ฐœ์˜ ๋ฌผ๋ฆฌ์  ์žฅ์น˜ ์ค‘ ํ•˜๋‚˜์™€ ๋™์ผํ•œ ๋™์ž‘์ž…๋‹ˆ๋‹ค. ๋จผ์ € Android 5์—์„œ - ์ž˜ ์ž‘๋™ํ•˜๊ณ  6์—์„œ - fakegps ์œ„์น˜๊ฐ€ ์—ฐ๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ์‘๋‹ต์ด ์—†์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— +1

์›์ธ์ด ๋ฌด์—‡์ธ์ง€ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ๊ธฐ๋Šฅ์€ ๋ชจ๋“  ๊ฒƒ์„ ๊นจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‹œ๋„ํ•œ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌธ์ œ๊ฐ€์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ๋ช…๋ฐฑํ•œ ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  ์œ„์น˜๋ฅผ ํŒŒ์•…ํ•˜๊ณ  ์ด๋™ํ–ˆ๋‹ค๋Š” GPS ์‹ ํ˜ธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์—…๋ฐ์ดํŠธ๋˜๊ธฐ ์ „์— ์ƒˆ๋กœ์šด ์œ„์น˜๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•˜์‹ญ๋‹ˆ๊นŒ?

@ibrierley ๋Š” ์ด๋™ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด GPS ์‹ ํ˜ธ๋ฅผ ์ˆ˜์‹ ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋™์‹œ์— Google ์ง€๋„์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์•ฑ์€ ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ฐพ๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. lastKnownPosition์€ ์•ฝ ์ˆ˜๋ฐฑ ๋ฏธํ„ฐ ๋–จ์–ด์ง„ ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Android 5์—์„œ๋Š” ์œ„์น˜ ๊ถŒํ•œ์„ ์š”์ฒญํ•˜์ง€ ์•Š์•„๋„ ์ „ํ˜€ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ํ™•์‹คํ•˜์ง€ ์•Š์Œ, ๋””๋ฒ„๊ทธ์—์„œ ์ด๊ฒƒ์„ ๋†“์ณค์„ ์ˆ˜ ์žˆ์Œ)

์•ฑ์„ ๋‹ซ์•˜๋‹ค๊ฐ€ ๋‹ค์‹œ ์—ฌ๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ  Android oreo์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ

Android Wear ์‹œ๊ณ„๋ฅผ ๋งŒ์ง€์ž‘๊ฑฐ๋ฆฌ๋‹ค๊ฐ€ GPS์— ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(์˜ค๋žœ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ํƒ€์ž„์•„์›ƒ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๊ฑด ๋‹ค๋ฅธ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค).

๋‚˜๋Š” ๋งŽ์€ ๊ฒƒ์„ ์‹œ๋„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ •ํ™•ํžˆ ๋ฌด์—‡์ด ์ž‘๋™ํ–ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  ๋„์›€์ด๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

0) ์žฅ์น˜๊ฐ€ GPS ์‹ ํ˜ธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์—ฌ ์™ธ๋ถ€ ๋˜๋Š” ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ์œ„์น˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค(ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๋‹ค์šด๋กœ๋“œํ•œ GPX ๊ฒฝ๋กœ๋ฅผ ์žฅ์น˜์— ์ œ๊ณต).

1) ํ™”๋ฉด์ด ์ผœ์ ธ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. GPS๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ด๋“  ์ตœ์†Œ ๋ชจ๋“œ์ธ ๊ฒฝ์šฐ GPS๋Š” ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜์„ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Screen ํŒจํ‚ค์ง€์™€ Screen.keepOn(true)์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•  ๋•Œ ํ™”๋ฉด์„ ๊ฐ•์ œ๋กœ ์ผญ๋‹ˆ๋‹ค. ํ™”๋ฉด์ด ๊บผ์ ธ ์žˆ์œผ๋ฉด ํ™”๋ฉด์ด ๋‹ค์‹œ ์ผœ์งˆ ๋•Œ๊นŒ์ง€ ์ผ๋ จ์˜ ์œ„์น˜๋ฅผ โ€‹โ€‹์œ ์ง€ํ•˜๊ณ  ๋ฒ„ํผ๋งํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

2) ์ด๊ฒƒ์€ AndroidManifest.xml์— ์žˆ๋Š” ๋‚ด ๊ถŒํ•œ์ด๋ฉฐ ์‹œ๋„ํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

```




ํŠนํžˆ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋ฒ„์ „์— ์ฃผ๋ชฉํ•˜์‹ญ์‹œ์˜ค. ํ•œ ๋ฒ„์ „์—์„œ ๋„์ค‘์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ๊ณ  ๋„์›€์ด ๋˜๋Š” ๊ฒƒ ๊ฐ™์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฐฐํ„ฐ๋ฆฌ ๋•Œ๋ฌธ์— wake_lock์„ ์›ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์„ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3) ์ŠคํŠธ๋ฆผ ์‹œ๊ฐ„ ์ดˆ๊ณผ์— ์ด์ƒํ•œ ์ ์ด ์žˆ์–ด์„œ ๊ฒฐ๊ตญ geolocator.getPositionStream์œผ๋กœ ์ŠคํŠธ๋ฆผ์„ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆผ์ด ์‹คํ–‰ ์ค‘์ธ ์ƒํƒœ์—์„œ ํƒ€์ด๋จธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ getCurrentPosition( desiredAccuracy: LocationAccuracy.high )๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์›๋ž˜ ๋ฌธ์ œ๋Š” ํ™”๋ฉด์ด ๊บผ์ง€๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ง€๊ธˆ์€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ด€์‹ฌ์„ ๊ฐ€์ง€๊ณ  ์‹œ๋„ํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ ์œ„์˜ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์œ„์น˜ ์ •๋ณด๋งŒ์œผ๋กœ ์ตœ์†Œํ•œ์˜ ํ”Œ๋Ÿฌํ„ฐ ์•ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋„ ๋™์ผํ•˜๊ฒŒ ์‹คํŒจํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๊ณ ํ†ต ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค :/.

๊ท€ํ•˜์˜ ์ •๋ณด์— ๋Œ€ํ•ด @ibrierley ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ์‹œ๋„ํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๊ฒฝํ—˜์— ๋Œ€ํ•ด ๋ณด๊ณ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜ ๋ฌผ๋ฆฌ์  ์žฅ์น˜์—์„œ GPS ํ…Œ์ŠคํŠธ์™€ ๊ฐ™์€ ์ถ”๊ฐ€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๊ตฌ๊ธ€๋งต์ด๋‚˜ ๋‹ค๋ฅธ ์ง€๋„ ์„œ๋น„์Šค๋ฅผ ํ•ด๋„ GPS ํ…Œ์ŠคํŠธ(์ฃผ๋ณ€์˜ ๊ตฌ๋ฆ„๊ณผ ํฐ ๊ฑด๋ฌผ ๋•Œ๋ฌธ์— 0 ์—ฐ๊ฒฐ 1 ์‚ฌ์šฉ ๊ฐ€๋Šฅ)์—์„œ ํ† ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„ ๋•Œ ์‘๋‹ต์ด ์—†์Šต๋‹ˆ๋‹ค.
์•‰์•˜์„ ๋•Œ ์‘๋‹ต์ด ์—†์ง€๋งŒ ์œ„์น˜ ์˜ต์…˜์— ์ •์˜๋œ ๊ฑฐ๋ฆฌ๊ฐ€ ์žˆ์ง€๋งŒ ์ด ๊ฒฝ์šฐ์—๋Š” 100%๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ์ขŒํ‘œ๋ฅผ ๊ฐ–๊ธฐ ์œ„ํ•ด ์ผ์ข…์˜ GPS ๋“œ๋ฆฌํ”„ํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
์‹ค์ œ ์œ„์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ์ „์— ํ˜„์žฌ ์œ„์น˜๊ฐ€ ํ•„์š”ํ•œ ์•ฑ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด lastknownlocation์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ฝ๊ฐ„์˜ ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
GPS ์„œ๋น„์Šค๊ฐ€ ์ŠคํŠธ๋ฆผ์„ ํ†ตํ•ด ์œ„์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” Geolocator์—์„œ ๊ฐ€๋Šฅํ•œ ์ฝœ๋ฐฑ๊ณผ ํ•จ๊ป˜ isReady์™€ ๊ฐ™์€ ์ผ์ข…์˜ ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ ์•„๋งˆ๋„ ํ›Œ๋ฅญํ•œ ์†”๋ฃจ์…˜์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

: ์‚ฌ๋žŒ์ด ์˜ˆ๋ฅผ ๋“ค์–ด ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค https://github.com/Lyokone/flutterlocation , ๋˜๋Š”์ด : https://github.com/Lyokone/flutterlocation ? ๋”ฐ๋ผ์„œ ์ด ํŒจํ‚ค์ง€์™€ ๊ด€๋ จ์ด ์—†๋Š” ์˜ค๋ฅ˜๋Š” ์ œ์™ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ–ˆ๊ณ  ์ด๊ฒƒ์œผ๋กœ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค (๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋Š” ๋ง์€ ์•„๋‹™๋‹ˆ๋‹ค.
์‹œ๋„ํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค!). ๊ทธ๋“ค ๋ชจ๋‘๋Š” '์ผ๋ถ€' ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์•ˆ๋“œ๋กœ์ด๋“œ์—๋Š” ๋ถ„๋ช…ํ•˜์ง€ ์•Š์€ ๊ฒƒ๋“ค์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์œ„์น˜๊ฐ€ ๋‹ค์Œ ์ค‘ ์–ด๋Š ๊ฒƒ์—๋„ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์„ ๋•Œ
ํŒจํ‚ค์ง€), ํ”Œ๋Ÿฌํ„ฐ ์—†๋Š” ๋ฌธ์ œ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(์˜ˆ: GPS๊ฐ€
์ ˆ์ „ ๋ชจ๋“œ ๋˜๋Š” GPS ์‹ ํ˜ธ ์—†์Œ).

2018๋…„ 11์›” 15์ผ ๋ชฉ์š”์ผ ์˜คํ›„ 7์‹œ 26๋ถ„ HerrNiklasRaab [email protected]
์ผ๋‹ค:

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๊ฒƒ์„ ์‹œ๋„ํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?
https://github.com/Lyokone/flutterlocation ๋˜๋Š” ์ด๊ฒƒ:
https://github.com/Lyokone/flutterlocation ? ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๋ฅผ ์ œ์™ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ํŒจํ‚ค์ง€์™€ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/BaseflowIT/flutter-geolocator/issues/135#issuecomment-439160446 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ADuG9WRbZuJYvi5N_2xrrku-Jurk6trIks5uvb_SgaJpZM4YKDSm
.

๋ˆ„๊ตฌ๋“ ์ง€ ๋‚ด ๊ฒƒ์„ ์‹œ๋„?
flutter_background_geolocation

๊ด€์‹ฌ์—†๋Š” ํ™”๋ฉด์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

2018๋…„ 11์›” 15์ผ ๋ชฉ์š”์ผ ์˜คํ›„ 8:16 Chris Scott ์•Œ๋ฆผ @github.com
์ผ๋‹ค:

๋ˆ„๊ตฌ๋“ ์ง€ ๋‚ด ๊ฒƒ์„ ์‹œ๋„?
flutter_background_geolocation
https://pub.dartlang.org/packages/flutter_background_geolocation#-readme-tab-

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/BaseflowIT/flutter-geolocator/issues/135#issuecomment-439175841 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ADuG9f5uvZK0lDnYecMoFZhJnF0ylz6Pks5uvcuygaJpZM4YKDSm
.

์•ฑ์„ ์ข…๋ฃŒ( stopOnTerminate: false )ํ•˜๊ฑฐ๋‚˜ ๊ธฐ๊ธฐ๋ฅผ ์žฌ๋ถ€ํŒ…( startOnBoot: true )ํ•ด๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

getCurrentPosition ์—์„œ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š๋Š” ๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
position = await Geolocator() .getCurrentPosition(desiredAccuracy: LocationAccuracy.best); setState(() { _position = position; }); if (position == null) Fluttertoast.showToast( msg: 'Position is null', toastLength: Toast.LENGTH_SHORT); else Fluttertoast.showToast( msg: 'Got Position', toastLength: Toast.LENGTH_SHORT);

๊ถŒํ•œ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.hardware.location.gps" /> <uses-permission android:name="android.hardware.location.network" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> .
ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด ํ™”๋ฉด ์ƒ๋‹จ์— ์œ„์น˜ ํ‘œ์‹œ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉฐ ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ๊ฐ€๋งŒํžˆ ์žˆ์Šต๋‹ˆ๋‹ค.
๋„์›€์ด ํ•„์š”ํ•˜์„ธ์š”?

API 23์„ ์‚ฌ์šฉํ•˜๋ฉด getCurrentPosition์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํ˜„์žฌ ์œ„์น˜๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์ž‘๋™ํ•˜๋Š” ์ด ํŒจํ‚ค์ง€ ๋˜๋Š” ๋Œ€์ฒด ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์กฐ๊ธˆ ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค. ๋จผ์ € Google ์ง€๋„ ์•ฑ์„ ์‹คํ–‰ํ•˜์—ฌ ์ง€๊ธˆ ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๊ณ  ๋‚ด ์œ„์น˜๋ฅผ ํƒญํ•  ๋•Œ GPS ํ™œ์„ฑํ™” ๊ถŒํ•œ์„ ์š”์ฒญํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ํ›„ getCurrentPosition์€ ๊ฐ‘์ž๊ธฐ ๋งค๋ ฅ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ค API๋กœ๋„ ์œ„์น˜๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ
์—ฌ๊ธฐ์—์„œ NOT ์—ฐ์‚ฐ์ž๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  return ๋ฌธ์„ ์ถ”๊ฐ€ํ–ˆ๋Š”๋ฐ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/BaseflowIT/flutter-geolocator/blob/master/android/src/main/java/com/baseflow/flutter/plugin/geolocator/tasks/LocationUpdatesUsingLocationManagerTask.java#L52

// If we are listening to multiple location updates we can go ahead
// and report back the last known location (if we have one).
if(mStopAfterFirstLocationUpdate && mBestLocation != null) {
reportLocationUpdate(mBestLocation);
return;
}

ํ”„๋กœ๋•์…˜์—์„œ ๋‚˜๋ฅผ ์‹ค๋ง์‹œํ‚ค๋Š” ๋‹ค๋ฅธ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•œ ํ›„ ์ •๋ง ๋น ๋ฅธ ์ˆ˜์ •์ด ํ•„์š”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. API 23(๋ฌผ๋ฆฌ์  ์žฅ์น˜), API 24(๋ฌผ๋ฆฌ์  ์žฅ์น˜) ๋ฐ API 28(๋ฌผ๋ฆฌ์  ์žฅ์น˜)์—์„œ ํ…Œ์ŠคํŠธํ–ˆ์œผ๋ฉฐ ๋ฌธ์ œ๊ฐ€ ์—†์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. API 23์—์„œ Google์ด ์œ„์น˜ ๋“ฑ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š”์ง€ ๋ฌป๋Š” ์งˆ๋ฌธ์— "์˜ˆ"๋ผ๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ฝ 20์ดˆ ์ •๋„ ํ›„์— ์œ„์น˜๋ฅผ ๋กœ๋“œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์—๋Š” ์—๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐ ์‹ค์ œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค(๊ธฐ๋ณธ Android ๊ฐœ๋ฐœ). ๊ทธ๋ž˜์„œ ๊ทธ๋ƒฅ ์—๋ฎฌ๋ ˆ์ดํ„ฐ ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉฐ ์ž‘๋™ํ•˜๋„๋ก ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด getLastKnownPosition()์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

Geolocator().getCurrentPosition().timeout(Duration(seconds: 10)).then((position) {
      //getting position without problems
      print(position);
    }).catchError((error) {
      if (error is TimeoutException) {
        Geolocator().getLastKnownPosition().then((position) {
          //getting last known position
          print(position);
        }).catchError((error) {
          //handle the exception
        });
      } else {
        //handle the exception
      }
    });

์ŠคํŠธ๋ฆผ๊ณผ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@NMateu ๊ธฐ์—ฌํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋งค์šฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ .forceAndroidLocationManager = true; ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์œตํ•ฉ ์œ„์น˜ ๊ด€๋ฆฌ์ž๊ฐ€ ๋•Œ๋•Œ๋กœ ๋ฐฉํ•ด๊ฐ€ ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ •๋ง ๋๋‚ด์•ผ ํ•ด์š”, ์—ฌ๋Ÿฌ๋ถ„!

๊ฐ™์€ ๋ฌธ์ œ, ๊ทธ๊ฒƒ์€ ios ์žฅ์น˜์—์„œ ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ์š”์ฆ˜ ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ๋Š” ์œ„์น˜๋ฅผ ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์‹ค์ œ๋กœ placemarkFromAddress ๋ฐฉ๋ฒ•์œผ๋กœ ์ฃผ์†Œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œ„์น˜ ์ž์ฒด๊ฐ€ ๊นจ์กŒ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ๊ฐ™์€ ๋ฌธ์ œ

๋ฌดํšจ _getUserLocation() ๋น„๋™๊ธฐ {
Geolocator geolocator = Geolocator()..forceAndroidLocationManager = true;
GeolocationStatus geolocationStatus = geolocator.checkGeolocationPermissionStatus()๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
์œ„์น˜ ์œ„์น˜ = Geolocator() ๋Œ€๊ธฐ
.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
๋ชฉ๋ก์žฅ์†Œ ํ‘œ์‹œ = Geolocator() ๋Œ€๊ธฐ
.placemarkFromCoordinates(์œ„์น˜.์œ„๋„, ์œ„์น˜.๊ฒฝ๋„);
์ธ์‡„("-----------------");
์ธ์‡„(placemark[0].์œ„์น˜);
print(geolocator.toString());
print(geolocationStatus.toString());
setState(() {
_initialPosition = ์œ„๋„(์œ„์น˜.์œ„๋„, ์œ„์น˜.๊ฒฝ๋„);

  locationController.text = placemark[0].name;
});

}

์ž˜๋ชป๋œ ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

I/flutter( 7363): ์œ„๋„: 37.421999899999996, ๊ฒฝ๋„: -122.08405750000001
I/flutter ( 7363): 'Geolocator' ์ธ์Šคํ„ด์Šค
I/flutter ( 7363): GeolocationStatus.granted

๋ฌดํšจ _getUserLocation() ๋น„๋™๊ธฐ {
Geolocator geolocator = Geolocator()..forceAndroidLocationManager = true;
GeolocationStatus geolocationStatus = geolocator.checkGeolocationPermissionStatus()๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
์œ„์น˜ ์œ„์น˜ = Geolocator() ๋Œ€๊ธฐ
.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
์œ„์น˜ ํ‘œ์‹œ ํ‘œ์‹œ = Geolocator() ๋Œ€๊ธฐ
.placemarkFromCoordinates(์œ„์น˜.์œ„๋„, ์œ„์น˜.๊ฒฝ๋„);
์ธ์‡„("-----------------");
์ธ์‡„(placemark[0].์œ„์น˜);
print(geolocator.toString());
print(geolocationStatus.toString());
setState(() {
_initialPosition = ์œ„๋„(์œ„์น˜.์œ„๋„, ์œ„์น˜.๊ฒฝ๋„);

  locationController.text = placemark[0].name;
});

}

์ด ์Šค๋‹ˆํŽซ์ด ์žˆ๋Š” ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
Geolocator()..forceAndroidLocationManager = true;

์ด ํŒจํ‚ค์ง€๋Š” ๋ชจ๋“  ๊ฒƒ์— ๋งค๋ ฅ์ฒ˜๋Ÿผ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

(https://github.com/alfanhui/new_geolocation)

๋ช‡ ๊ฐ€์ง€ Android ๊ธฐ๊ธฐ์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค -

Geolocator()..forceAndroidLocationManager = true ๊ฐ’์„ ์„ค์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ตœ์ข… Geolocator geolocator = Geolocator()..forceAndroidLocationManager = true;

๋ฒ„์ „ 6.0.0์—์„œ ํ•ด๊ฒฐ๋จ

์œ„์น˜ ์œ„์น˜ = Geolocator.getCurrentPosition(
์›ํ•˜๋Š” ์ •ํ™•๋„: LocationAccuracy.low,forceAndroidLocationManager: true);
๋‚ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

forceAndroidLocationManager ์ค„์— ๋นจ๊ฐ„์ƒ‰ ์ค„์ด ํ‘œ์‹œ๋˜๊ณ  ์˜ค๋ฅ˜๋Š” ....."'forceAndroidLocationManager' ์„ค์ •์ž๊ฐ€ 'Geolocator' ์œ ํ˜•์— ๋Œ€ํ•ด ์ •์˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
'forceAndroidLocationManager'๋ฅผ ์ •์˜ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๊ธฐ์กด setter์˜ ์ด๋ฆ„์œผ๋กœ ์ด๋ฆ„์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ 'forceAndroidLocationManager'๋ผ๋Š” ์ด๋ฆ„์˜ setter ๋˜๋Š” ํ•„๋“œ๋ฅผ ์ •์˜ํ•ด ๋ณด์‹ญ์‹œ์˜ค."......... ๋ˆ„๊ตฐ๊ฐ€ ๋‚˜๋ฅผ ๋„์™€์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@aditikumar-png ์–ด๋–ค ๋ฒ„์ „์˜ ์œ„์น˜ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์ตœ๊ทผ์— ๋ฒ„์ „ 6.x๋กœ ์—…๋ฐ์ดํŠธํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ฒ„์ „์—๋Š” ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Geolocator().forceAndroidLocationManager ์†์„ฑ์„ getCurrentPosition ๋ฐ getPositionStream ๋ฉ”์„œ๋“œ์˜ ๋ช…๋ช…๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง€๋ฆฌ ๊ฒ€์ƒ‰๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

final position = await Geolocator.getCurrentPosition(forceAndroidLocationManager: true);

์ด์ „ ๋Œ€์‹ :

final geolocator = Geolocator();
geolocator.forceAndroidLocationManager = true;

final position = await geolocator.getCurrentPosition();

@aditikumar-png ์–ด๋–ค ๋ฒ„์ „์˜ ์œ„์น˜ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์ตœ๊ทผ์— ๋ฒ„์ „ 6.x๋กœ ์—…๋ฐ์ดํŠธํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ฒ„์ „์—๋Š” ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Geolocator().forceAndroidLocationManager ์†์„ฑ์„ getCurrentPosition ๋ฐ getPositionStream ๋ฉ”์„œ๋“œ์˜ ๋ช…๋ช…๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง€๋ฆฌ ๊ฒ€์ƒ‰๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

final position = await Geolocator.getCurrentPosition(forceAndroidLocationManager: true);

์ด์ „ ๋Œ€์‹ :

final geolocator = Geolocator();
geolocator.forceAndroidLocationManager = true;

final position = await geolocator.getCurrentPosition();

์ •๋ง ๊ณ ๋ง™์Šต๋‹ˆ๋‹ค!!!!! u๋Š” ๋ช‡ ์ดˆ ๋งŒ์— ๋‚ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” 9์‹œ๊ฐ„ ์ดํ›„๋กœ ์ด๊ฒƒ์œผ๋กœ ๊ณ ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰