반응형



LocationManager와 Geocoder를 사용하여 현재 위치에 대한 주소를 가져오는 예제입니다. 

구글맵을 사용하지 않고  현재 위치를 가져오는 방법입니다. 




2019. 3. 3      - 최초작성

2019. 11. 21  - androidx로 변경





다음 과정으로 실행됩니다.


1. 위치 서비스가 활성화 안되어 있는 경우 설정창을 띄워 사용자가 활성화 할 수 있도록 해줍니다. 

 

 




2. 위치 퍼미션이 허용안되어 있는 경우 사용자가 허용할 수 있도록 합니다. 

허용 후 오른쪽 스크린샷처럼 중앙에 텍스트뷰와 버튼이 보입니다. 


 




3. 버튼을 클릭하면 현재 위치의 위도와 경도를 Toast로 보여주고 텍스트뷰에 현재 위치에 대한 주소를 보여줍니다.  

처음 앱을 실행한 경우에는 왼쪽 스크린샷처럼 지오코더가 현재 위치에 대한 주소를 못찾을 수도 있습니다.  


 




다음 과정을 통해 포스팅의 코드를 테스트할 수 있습니다. 


1. AndroidManifest.xml 파일에 위치관련 권한을 추가합니다.


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




2. activity_main.xml 레이아웃은 주소를 가져올때 사용하는 버튼과 주소를 보여줄 TextView로 구성됩니다. 


<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintVertical_chainStyle="packed"
        app:layout_constraintBottom_toTopOf="@+id/button"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textview" />

</androidx.constraintlayout.widget.ConstraintLayout>




3. MainActivity.java 파일에서는 위치 접근 권한과 GPS 사용 가능 여부를 체크해서 처리합니다. 

버튼을 클릭하면 위치 정보를 가져오기 위해 GpsTracker 서비스를 사용합니다. 


package com.tistory.webnautes.get_gps_location;

import android.Manifest;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.location.LocationManager;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.appcompat.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;


import java.io.IOException;
import java.util.List;
import java.util.Locale;


public class MainActivity extends AppCompatActivity
{
    private GpsTracker gpsTracker;

    private static final int GPS_ENABLE_REQUEST_CODE = 2001;
    private static final int PERMISSIONS_REQUEST_CODE = 100;
    String[] REQUIRED_PERMISSIONS  = {Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION};


    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        if (!checkLocationServicesStatus()) {

            showDialogForLocationServiceSetting();
        }else {

            checkRunTimePermission();
        }

        final TextView textview_address = (TextView)findViewById(R.id.textview);


        Button ShowLocationButton = (Button) findViewById(R.id.button);
        ShowLocationButton.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View arg0)
            {

                gpsTracker = new GpsTracker(MainActivity.this);

                double latitude = gpsTracker.getLatitude();
                double longitude = gpsTracker.getLongitude();

                String address = getCurrentAddress(latitude, longitude);
                textview_address.setText(address);

                Toast.makeText(MainActivity.this, "현재위치 \n위도 " + latitude + "\n경도 " + longitude, Toast.LENGTH_LONG).show();
            }
        });
    }


    /*
    * ActivityCompat.requestPermissions를 사용한 퍼미션 요청의 결과를 리턴받는 메소드입니다.
    */
    @Override
    public void onRequestPermissionsResult(int permsRequestCode,
                                          @NonNull String[] permissions,
                                          @NonNull int[] grandResults) {

        if ( permsRequestCode == PERMISSIONS_REQUEST_CODE && grandResults.length == REQUIRED_PERMISSIONS.length) {

            // 요청 코드가 PERMISSIONS_REQUEST_CODE 이고, 요청한 퍼미션 개수만큼 수신되었다면

            boolean check_result = true;


            // 모든 퍼미션을 허용했는지 체크합니다.

            for (int result : grandResults) {
                if (result != PackageManager.PERMISSION_GRANTED) {
                    check_result = false;
                    break;
                }
            }


            if ( check_result ) {

                //위치 값을 가져올 수 있음
                ;
            }
            else {
                // 거부한 퍼미션이 있다면 앱을 사용할 수 없는 이유를 설명해주고 앱을 종료합니다.2 가지 경우가 있습니다.

                if (ActivityCompat.shouldShowRequestPermissionRationale(this, REQUIRED_PERMISSIONS[0])
                        || ActivityCompat.shouldShowRequestPermissionRationale(this, REQUIRED_PERMISSIONS[1])) {

                    Toast.makeText(MainActivity.this, "퍼미션이 거부되었습니다. 앱을 다시 실행하여 퍼미션을 허용해주세요.", Toast.LENGTH_LONG).show();
                    finish();


                }else {

                    Toast.makeText(MainActivity.this, "퍼미션이 거부되었습니다. 설정(앱 정보)에서 퍼미션을 허용해야 합니다. ", Toast.LENGTH_LONG).show();

                }
            }

        }
    }

    void checkRunTimePermission(){

        //런타임 퍼미션 처리
        // 1. 위치 퍼미션을 가지고 있는지 체크합니다.
        int hasFineLocationPermission = ContextCompat.checkSelfPermission(MainActivity.this,
                Manifest.permission.ACCESS_FINE_LOCATION);
        int hasCoarseLocationPermission = ContextCompat.checkSelfPermission(MainActivity.this,
                Manifest.permission.ACCESS_COARSE_LOCATION);


        if (hasFineLocationPermission == PackageManager.PERMISSION_GRANTED &&
                hasCoarseLocationPermission == PackageManager.PERMISSION_GRANTED) {

            // 2. 이미 퍼미션을 가지고 있다면
            // ( 안드로이드 6.0 이하 버전은 런타임 퍼미션이 필요없기 때문에 이미 허용된 걸로 인식합니다.)


            // 3.  위치 값을 가져올 수 있음



        } else//2. 퍼미션 요청을 허용한 적이 없다면 퍼미션 요청이 필요합니다. 2가지 경우(3-1, 4-1)가 있습니다.

            // 3-1. 사용자가 퍼미션 거부를 한 적이 있는 경우에는
            if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, REQUIRED_PERMISSIONS[0])) {

                // 3-2. 요청을 진행하기 전에 사용자가에게 퍼미션이 필요한 이유를 설명해줄 필요가 있습니다.
                Toast.makeText(MainActivity.this, "이 앱을 실행하려면 위치 접근 권한이 필요합니다.", Toast.LENGTH_LONG).show();
                // 3-3. 사용자게에 퍼미션 요청을 합니다. 요청 결과는 onRequestPermissionResult에서 수신됩니다.
                ActivityCompat.requestPermissions(MainActivity.this, REQUIRED_PERMISSIONS,
                        PERMISSIONS_REQUEST_CODE);


            } else {
                // 4-1. 사용자가 퍼미션 거부를 한 적이 없는 경우에는 퍼미션 요청을 바로 합니다.
                // 요청 결과는 onRequestPermissionResult에서 수신됩니다.
                ActivityCompat.requestPermissions(MainActivity.this, REQUIRED_PERMISSIONS,
                        PERMISSIONS_REQUEST_CODE);
            }

        }

    }


    public String getCurrentAddress( double latitude, double longitude) {

        //지오코더... GPS를 주소로 변환
        Geocoder geocoder = new Geocoder(this, Locale.getDefault());

        List<Address> addresses;

        try {

            addresses = geocoder.getFromLocation(
                    latitude,
                    longitude,
                    7);
        } catch (IOException ioException) {
            //네트워크 문제
            Toast.makeText(this, "지오코더 서비스 사용불가", Toast.LENGTH_LONG).show();
            return "지오코더 서비스 사용불가";
        } catch (IllegalArgumentException illegalArgumentException) {
            Toast.makeText(this, "잘못된 GPS 좌표", Toast.LENGTH_LONG).show();
            return "잘못된 GPS 좌표";

        }



        if (addresses == null || addresses.size() == 0) {
            Toast.makeText(this, "주소 미발견", Toast.LENGTH_LONG).show();
            return "주소 미발견";

        }

        Address address = addresses.get(0);
        return address.getAddressLine(0).toString()+"\n";

    }


    //여기부터는 GPS 활성화를 위한 메소드들
    private void showDialogForLocationServiceSetting() {

        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setTitle("위치 서비스 비활성화");
        builder.setMessage("앱을 사용하기 위해서는 위치 서비스가 필요합니다.\n"
                + "위치 설정을 수정하실래요?");
        builder.setCancelable(true);
        builder.setPositiveButton("설정", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int id) {
                Intent callGPSSettingIntent
                        = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                startActivityForResult(callGPSSettingIntent, GPS_ENABLE_REQUEST_CODE);
            }
        });
        builder.setNegativeButton("취소", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
            }
        });
        builder.create().show();
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {

            case GPS_ENABLE_REQUEST_CODE:

                //사용자가 GPS 활성 시켰는지 검사
                if (checkLocationServicesStatus()) {
                    if (checkLocationServicesStatus()) {

                        Log.d("@@@", "onActivityResult : GPS 활성화 되있음");
                        checkRunTimePermission();
                        return;
                    }
                }

                break;
        }
    }

    public boolean checkLocationServicesStatus() {
        LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

        return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)
                || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    }

}




4. GpsTracker.java는 현재 위치를 가져와 주소로 변환하는 처리를 합니다. 


package com.tistory.webnautes.get_gps_location;

import android.Manifest;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import androidx.core.content.ContextCompat;
import android.util.Log;



public class GpsTracker extends Service implements LocationListener {

    private final Context mContext;
    Location location;
    double latitude;
    double longitude;

    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10;
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1;
    protected LocationManager locationManager;


    public GpsTracker(Context context) {
        this.mContext = context;
        getLocation();
    }


    public Location getLocation() {
        try {
            locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);

            boolean isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
            boolean isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

            if (!isGPSEnabled && !isNetworkEnabled) {

            } else {

                int hasFineLocationPermission = ContextCompat.checkSelfPermission(mContext,
                        Manifest.permission.ACCESS_FINE_LOCATION);
                int hasCoarseLocationPermission = ContextCompat.checkSelfPermission(mContext,
                        Manifest.permission.ACCESS_COARSE_LOCATION);


                if (hasFineLocationPermission == PackageManager.PERMISSION_GRANTED &&
                        hasCoarseLocationPermission == PackageManager.PERMISSION_GRANTED) {

                    ;
                } else
                    return null;


                if (isNetworkEnabled) {


                    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);

                    if (locationManager != null)
                    {
                        location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if (location != null)
                        {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }


                if (isGPSEnabled)
                {
                    if (location == null)
                    {
                        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                        if (locationManager != null)
                        {
                            location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            if (location != null)
                            {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                            }
                        }
                    }
                }
            }
        }
        catch (Exception e)
        {
            Log.d("@@@", ""+e.toString());
        }

        return location;
    }

    public double getLatitude()
    {
        if(location != null)
        {
            latitude = location.getLatitude();
        }

        return latitude;
    }

    public double getLongitude()
    {
        if(location != null)
        {
            longitude = location.getLongitude();
        }

        return longitude;
    }

    @Override
    public void onLocationChanged(Location location)
    {
    }

    @Override
    public void onProviderDisabled(String provider)
    {
    }

    @Override
    public void onProviderEnabled(String provider)
    {
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras)
    {
    }

    @Override
    public IBinder onBind(Intent arg0)
    {
        return null;
    }


    public void stopUsingGPS()
    {
        if(locationManager != null)
        {
            locationManager.removeUpdates(GpsTracker.this);
        }
    }


}





반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

유튜브 구독하기


제가 쓴 책도 한번 검토해보세요.

  1. 이전 댓글 더보기
  2. ㅇㅇ 2019.05.08 23:21

    다행히 잘 돌아가네요! 좋은 코드 감사합니다. 많이 배워가요 :)

  3. 2019.06.12 13:51

    비밀댓글입니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.12 16:20 신고

      적으신대로 사용하셔도 괜찮습니다.
      소스 코드에만 가능하면 출처를 남겨주세요.

      글 남겨주셔서 감사합니다 : )

    • 2019.06.12 21:13

      비밀댓글입니다

  4. 감사 2019.11.04 15:20

    실행이 잘되요 매번 감사합니다
    궁금한점이
    if문을 이용해서 자동으로 문자메시지를 보내려고 하는데 문자메시지 내용에 주소값을 받아서 보내려고 합니다
    주소값 변수가 어떤건지 알 수 있을까요?

  5. 창이 2019.11.21 01:50

    안녕하세요. 코드 그대로 실행해서 동작은 되는걸 확인했습니다.
    그런데 이게 위치설정 안한상태로 최초 실행을 하면 경도 위도가 모두 0,0 으로 찍히고 앱 종료후 다시 접속해야
    제대로 된 값을 가져오는데 이것저것 시도를 해봐도 답이 안나와서 여쭤보게 되었습니다...

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.21 09:21 신고

      제가 해보니 잘되는데

      혹시 0,0으로 나오는 경우 다시 버튼 클릭 시도하면 되지 않나요?

  6. 창이 2019.11.23 00:53

    @Override
    public void onLocationChanged(Location location) {
    this.location = location;
    latitude = location.getLatitude();
    longitude = location.getLongitude();
    Log.d("TAG",""+longitude);
    Log.d("TAG",""+latitude);
    }

    결국 맵을 다시 만들어서 업데이트된 위치로 다시 뿌려주도록 변경해서 해결했습니다.

  7. 맘속제자 2019.12.06 04:21

    제가 딥러닝이랑 안드로이드 프로젝트하는데.. 맨날 구글링할때마다 선생님 (ㅋㅋㅋ제 맘속으론 선생님이에요) 만나서 너무 신기하고 대단하고 반갑네요ㅎㅎ 진짜 멋지세요

  8. Favicon of https://taiyakee.tistory.com BlogIcon @호박 2019.12.24 09:51 신고

    Size가 계속 0으로 나오는데.. API를 받아야 하나요?

  9. Favicon of https://taiyakee.tistory.com BlogIcon @호박 2019.12.28 14:29 신고

    List<Address> addresses 의 address 사이즈가 0으로 나오네요.. 위도 경도 값을 서울시청 값으로 직접 설정해 주었는데요 size가 0이라고 나와서요ㅠ.. 현재 에뮬레이터는 pie x86 image를 사용하고 있습니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.12.28 14:41 신고

      로그캣을 확인해야 무슨.문제인지.알수 있십니다. 가능하다면.폰에서도 테스트해보세요

  10. 학생 2020.01.28 16:23

    이 예제는 실시간으로 값을 받아오고있는 상태인가요 아니면 버튼 눌러서 값가져올때 그 순간에 갱신해서 가져오는 건가요?

  11. 연습중 2020.02.12 12:15

    위치가 미국으로 뜨는데 이거는 무슨오류일까요??ㅠㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.02.12 13:38 신고

      에뮬레이터로하면 미국으로 뜨는게 맞는데 혹시 안드로이드 폰에서 그런가요?

  12. 연습 2020.02.14 14:25

    위치가 바뀔때마다 주소가 변경되나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.02.14 16:25 신고

      버튼을 누를때마다 가져옵니다. 장소 변경할때마다 나오게 하려면 구글맵 API와 연동해야 합니다

  13. 도와주세요 2020.02.14 22:10

    혹시 현재 위치 표시된 곳이 도로위인지 건물인지 구분할 수 있는 방법이 있을까요??

  14. 김당근 2020.03.02 06:03

    안녕하세요 선생님, 저번에도 선생님 글 보고 매우 도움을 받았던 학생입니다.
    이번에도 선생님 블로그 통해서 많이 배웠습니다.
    주석 처리를 꼼꼼하게 적어주셔서 다른 글보다 훨씬 이해가 잘 가네요.
    코로나 바이러스가 난리인데, 몸 관리 잘하시길 바랄게요!

  15. Favicon of https://tvple.me/tv/%EC%95%84%EB%82%B4%EC%9D%98%20%EB%A7%9B BlogIcon 아내의 맛 다시보기 2020.04.01 15:18

    잘배워갑니다.

  16. Favicon of https://kimhc67.tistory.com BlogIcon 김현철67 2020.04.19 19:13 신고

    안녕하세요.. 또 도움좀 받으려고 문의 드립니다..
    앱 수정할게 있어서 오랫만에 안드로이드 스튜디오를 접속했는데..
    업데이트가 많이 돼더라구요..

    그리고 실행하는데 다음과 같은 에러가 생겨서요..
    뭔가를 업데이트 하라는거 같은데..
    아무리 뒤져봐도 모르겠어서요..

    이거저거 건드리다 전에 첨부터 다시한적이 있어서 겁도 좀 나고요..
    도움 좀 부탁드립니다..



    Executing tasks: [:app:assembleDebug] in project C:\Users\KIM\AndroidStudioProjects\googlemapexample

    > Task :app:preBuild UP-TO-DATE
    > Task :app:preDebugBuild UP-TO-DATE
    > Task :app:compileDebugAidl NO-SOURCE
    > Task :app:generateDebugBuildConfig UP-TO-DATE
    > Task :app:javaPreCompileDebug UP-TO-DATE
    > Task :app:compileDebugRenderscript NO-SOURCE
    > Task :app:mainApkListPersistenceDebug UP-TO-DATE
    > Task :app:generateDebugResValues UP-TO-DATE
    > Task :app:generateDebugResources UP-TO-DATE
    > Task :app:mergeDebugResources UP-TO-DATE
    > Task :app:createDebugCompatibleScreenManifests UP-TO-DATE
    > Task :app:extractDeepLinksDebug UP-TO-DATE
    > Task :app:processDebugManifest UP-TO-DATE
    > Task :app:processDebugResources UP-TO-DATE
    > Task :app:compileDebugJavaWithJavac UP-TO-DATE
    > Task :app:compileDebugSources UP-TO-DATE
    > Task :app:mergeDebugShaders UP-TO-DATE
    > Task :app:compileDebugShaders UP-TO-DATE
    > Task :app:generateDebugAssets UP-TO-DATE
    > Task :app:mergeDebugAssets UP-TO-DATE
    > Task :app:processDebugJavaRes NO-SOURCE
    > Task :app:mergeDebugJavaResource UP-TO-DATE
    > Task :app:dexBuilderDebug UP-TO-DATE
    > Task :app:checkDebugDuplicateClasses UP-TO-DATE
    > Task :app:mergeExtDexDebug UP-TO-DATE
    > Task :app:mergeLibDexDebug UP-TO-DATE
    > Task :app:mergeProjectDexDebug UP-TO-DATE
    > Task :app:mergeDebugJniLibFolders UP-TO-DATE
    > Task :app:mergeDebugNativeLibs UP-TO-DATE
    > Task :app:stripDebugDebugSymbols UP-TO-DATE
    > Task :app:validateSigningDebug UP-TO-DATE
    > Task :app:packageDebug UP-TO-DATE
    > Task :app:assembleDebug UP-TO-DATE

    BUILD SUCCESSFUL in 1s
    24 actionable tasks: 24 up-to-date

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.04.19 19:22 신고

      코드에 변화가 생긴게 아니라 빌드에 대한 업데이트만 이루어진 듯합니다.
      진행하셔도 문제 없을듯합니다.

      실수로 프로젝트가 잘못될 가능성이 있는게 걱정된다면..
      주기적으로 깃허브에 프로젝트를 올려두거나 프로젝트 폴더를 압축해서 보관해두세요..

    • Favicon of https://kimhc67.tistory.com BlogIcon 김현철67 2020.04.19 19:54 신고

      감사합니다..

      잘 나옵니다 ^^

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.04.19 20:37 신고

      다행입니다~^^

    • Favicon of https://allaalla007.tistory.com BlogIcon allaalla 2020.05.29 17:47 신고

      안녕하세요. 선생님 덕분에 원하는 기능 구현하는데 도움이 많이 됐습니다. 그런데 위치 설정 X 위치 권한 X 인 상태에서 실행하면 먼저 위치 설정을 하라는 대화 상자가 뜨고 설정하고 뒤로 가기를 누르면 위치 권한을 승인하라는 알림이 뜨는데 둘 다 허용해도 권한이 승인되지 않았다는 Toast가 뜨네요. 그리고 주소 미발견으로 좌표를 잡지 Button을 계속 누르면 좌표를 가져오는데 성공하는데 뭐가 문제일까요? 해당 본문에 기재해주신 코드를 붙여 넣기 해도 똑같고 제가 만든 코드에 적용시켜도 똑같습니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.05.29 20:11 신고

      모든 경우를 테스트해보며 만들었던 건데 안되는 부분이 있나보군요..

      어떨때 동작 안하는지 확인해서 부족한 점을 보완해야 할 듯합니다.

      혹 안드로이드 OS가 업데이트하면서 API에서 바뀐 부분이 있어서 그럴 수도 있습니다.

      정확한 원인을 알려면 권한 테스트해보면서 로그캣을 같이 보는 수 밖에 없습니다.

  17. 대학생 2020.04.28 00:07

    현재 구글맵과 서치뷰를 연동하였습니다 지금은 그냥 검색한대로 나오고 마커가 찍히는데
    google places api와 연동하여 특정 단어 검색이아닌 주소 자동완성은 어떻게 하는지 궁금합니다
    또한 위의 방식으로 어느 곳을 지정해놓고 (여러군데)그 주변에 근처에 도달하면 알람이 울리게 할 것인데
    구글맵에서 현재 위치 지속적으로 위도 경도 알아오고
    검색하여 찍은 마커의 위도 경도 알아와서 반경을 또 설정하고
    서로의 위도 경도가 맞는지 확인해야 하나요? (근접 경보 알림 같은 거입니다)

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.04.28 20:35 신고

      안드로이드에서는 주소 자동완성이 안되고 웹에서만 되는 걸로 알고 있습니다.


      생각하신대로 구현하면 될거 같습니다.

  18. nna2250@naver.com 2020.06.04 22:12

    지오코더 네트워크 오류가 나는데 어떻게 해결하나요??

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.06.04 22:14 신고

      정확히 어떤 에러인가요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.06.04 22:14 신고

      정확히 어떤 에러인가요?

    • nna2250@naver.com 2020.06.04 22:46

      main thread에서 처리하는데 시간이 오류난다고 뜹니다! 원래 작동했는데 갑자기 이러네요 ㅠㅠ

    • nna2250@naver.com 2020.06.04 22:47

      addresses = geocoder.getFromLocation(
      latitude,
      longitude,
      7);

      정확히 이 부분이 작동하지 않고, catch로 바로 가는데, 네트워크 오류 부분으로 이동합니다 ㅠㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.06.04 22:48 신고

      로그캣에서 발생한 오류 내용을 찾아야 빨리 해결할 수 있습니다

  19. 노예 2020.06.16 23:05

    안녕하세요. 올려주신 코드 덕분에 큰 도움을 얻은 한창 대학을 다니고 있는 학생입니다.
    올려주신 코드를 실행해 보니 정상적으로 돌아가는것 같은데 출력이 미국에 있는 어느 한 지역의 주소가 출력이 되던데 혹시 이것을 제가 실제로 위치한 지역의 주소로 출력하게 하는 방법을 알려주실수 있나요?

  20. Favicon of https://ddolcat.tistory.com BlogIcon 똘켓 2020.07.09 13:35 신고

    Geocoder.getFromLocation 메소드 사용은 무료인가요?

  21. jun 2020.07.30 10:19

    정말 도움이 많이 되었습니다!
    코드를 보면서 몇가지 질문이 있는데,
    GpsTracker 클래스가 Service 인것 같은데,
    Manifest에서 Service에 추가하면 Background 실행이 가능할까요?

+ Recent posts