ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android] 현재위치 GPS정보 받기( + Firebase 연결)
    Android 2019. 10. 24. 10:21

     

    안드로이드에서는 GPS 정보를 가져온 후 자기 위치를 MAP 에 표시하거나 다른 사람에게 위치 정보를 알릴 있습니다. 현재 위치를 얻고 firebase에 업로드 하여 확인해 보겠습니다.

    1. 위치 권한 접근하기

    Android에서 위치 데이터를 얻기 위해서는 먼저 사용자의 폰에 권한을 설정 해야 합니다. 인터넷과 위치 권한을 허용하기 위한 코드를 넣습니다.

    App > manifests > AndroidManifest.xml파일로 들어가

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

    2. activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <ToggleButton
    android:id="@+id/button"
    android:textSize="15dp"
    android:textColor="#FFFFFF"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>
    <TextView
    android:id = "@+id/gps_info"
    android:text="GPS 정보"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

    </LinearLayout>

    실행화면

     

    3. MainActivity.java에 위치정보 가져오는 코드 넣기

    관련 모듈 import 하기

    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;

    위치 관리자 객체 참조하기

    final LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    버전 체크하기

    if ( Build.VERSION.SDK_INT >= 23 &&
           
    ContextCompat.checkSelfPermission( getApplicationContext(), android.Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED ) {
       
    ActivityCompat.requestPermissions( MainActivity.this, new String[] {  android.Manifest.permission.ACCESS_FINE_LOCATION  },
               
    0 );
    }

    위치 정보 갱신하기

    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, // 등록할 위치제공자
           
    100, // 통지사이의 최소 시간간격 (miliSecond)
           
    1, // 통지사이의 최소 변경거리 (m)
           
    gpsLocationListener);
    lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, // 등록할 위치제공자
           
    100, // 통지사이의 최소 시간간격 (miliSecond)
           
    1, // 통지사이의 최소 변경거리 (m)
           
    gpsLocationListener);

    -  위치정보 처리하기


    public final LocationListener gpsLocationListener = new LocationListener() {
       
    public void onLocationChanged(Location location) {

           
    String provider = location.getProvider();
           
    double longitude = location.getLongitude();
           
    double latitude = location.getLatitude();
           
    double altitude = location.getAltitude();

           
    gpsResult.setText("위치정보 : " + provider + "\n" +
                   
    "위도 : " + longitude + "\n" +
                   
    "경도 : " + latitude + "\n" +
                   
    "고도  : " + altitude);

        }

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

       
    public void onProviderEnabled(String provider) {
        }

       
    public void onProviderDisabled(String provider) {
        }
    };

    4. MainActivity.java에 Firebase와 연결하는 코드 넣기

    -  연결된 DatabaseReference 가져오기  

    FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
    DatabaseReference databaseReference = firebaseDatabase.getReference().child("GPS정보");

    -  사용자 키를 랜덤으로 생성해서 위치 추가하기

    userID = databaseReference.push().getKey();

    - 위도, 경도 데이터 업로드 하기

    databaseReference.child(userID).child("경도").setValue(longitude);
    databaseReference.child(userID).child("위도").setValue(latitude);

    5. 전체코드

    package com.shj.myapplication5;

    import androidx.appcompat.app.AppCompatActivity;
    import android.content.Context;
    import android.content.pm.PackageManager;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.os.Build;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.ToggleButton;

    import androidx.core.app.ActivityCompat;
    import androidx.core.content.ContextCompat;

    import com.google.firebase.database.DatabaseReference;
    import com.google.firebase.database.FirebaseDatabase;

    public class MainActivity extends AppCompatActivity {
    ToggleButton tb;
    TextView gpsResult;
    FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
    DatabaseReference databaseReference = firebaseDatabase.getReference().child("GPS정보");
    String userID;
    boolean check = true;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tb = (ToggleButton) findViewById(R.id.button);
    gpsResult = (TextView)findViewById(R.id.gps_info);
    if (Build.VERSION.SDK_INT >= 23 &&
    ContextCompat.checkSelfPermission(getApplicationContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
    0);
    }
    final LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    tb.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    try {
    if (tb.isChecked()) {
    gpsResult.setText("수신중..");
    if(check == true) {
    userID = databaseReference.push().getKey();
    // GPS 제공자의 정보가 바뀌면 콜백하도록 리스너 등록하기
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, // 등록할 위치제공자
    100, // 통지사이의 최소 시간간격 (miliSecond)
    1, // 통지사이의 최소 변경거리 (m)
    gpsLocationListener);
    lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, // 등록할 위치제공자
    100, // 통지사이의 최소 시간간격 (miliSecond)
    1, // 통지사이의 최소 변경거리 (m)
    gpsLocationListener);
    check = false;

    }
    } else {
    gpsResult.setText("위치정보 미수신중");
    lm.removeUpdates(gpsLocationListener); // 미수신할때는 반드시 자원해체를 해주어야 한다.
    }
    } catch (SecurityException ex) {
    }
    }
    });
    }

    public final LocationListener gpsLocationListener = new LocationListener() {
    public void onLocationChanged(Location location) {

    String provider = location.getProvider();
    double longitude = location.getLongitude();
    double latitude = location.getLatitude();
    double altitude = location.getAltitude();

    gpsResult.setText("위치정보 : " + provider + "\n" +
    "위도 : " + longitude + "\n" +
    "경도 : " + latitude + "\n" +
    "고도 : " + altitude);

    databaseReference.child(userID).child("경도").setValue(longitude);
    databaseReference.child(userID).child("위도").setValue(latitude);
    check = true;
    }

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

    public void onProviderEnabled(String provider) {
    }

    public void onProviderDisabled(String provider) {
    }
    };

    }

    실행화면

Designed by Tistory.