728x90
retrofit을 통해 arraylist형태로 데이터를 받아서 마커를 삽입해보겠습니다.
순서
1. onCreate()
2. onMapReady()
3. call retrofit method
4. setMarker method
5. response
참고 글
https://stickode.tistory.com/655
이 숫자마커를 롱클릭이 아닌, DB에서 받아와 set해주겠습니다.
1. onCreate()
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.stickode_test);
mapView = findViewById(R.id.map_stickode);
tv_markerNum = (TextView)findViewById(R.id.tv_markerNum); // 마커에 삽입될 숫자뷰
// 네이버 지도 초기화
mapView.onCreate(savedInstanceState);
mapView.getMapAsync(this); // 네이버지도에서 반환되는 콜백함수를 자신(this)으로 지정하는 역할
// Async : 비동기(로 NaverMap객체를 얻는다)
}
2. onMapReady()
// NaverMap객체가 준비되면 콜백메소드를 호출한다.
@Override
public void onMapReady(@NonNull NaverMap naverMap) { //지도의 작동을 다룸
Log.e(TAG, "onMapReady() 입장");
네이버Map = naverMap;
//현재위치 GPS
locationSource = new FusedLocationSource(Map2_stickodeTest.this, LOCATION_PERMISSION_REQUEST_CODE); //권한요청객체생성(GPS)
naverMap.setLocationSource(locationSource); //현재위치
naverMap.setLocationTrackingMode(LocationTrackingMode.Follow); //트래킹모드를 선언해야 위치오버레이가 보임
retrofit_getLocationMarker(네이버Map, "365"); //방번호 넣어주기
tv_markerNum.setVisibility(View.GONE); //사용 다 했으니 숨기기
}
3. call retrofit method
private void retrofit_getLocationMarker(NaverMap naverMap, String myRoom_no) {
Log.e(TAG, "retrofit마커get() 메소드 입장// myRoom_no : "+myRoom_no);
Sharing 마커불러오기 = retrofit객체().create(Sharing.class); // Sharing라는 interface에서 recyclerviewRecord()메소드로 보낸다.
Call<ArrayList<getMarker>> call = 마커불러오기.markerArraylistGet2(myRoom_no); // Call<ArrayList<getMarker>> : 데이터를 받아오는 곳
//네트워킹 시도
call.enqueue(new Callback<ArrayList<getMarker>>() { //enqueue : 비동기식 통신을 할 때 사용/ execute: 동기식
@SuppressLint({"SetTextI18n", "NotifyDataSetChanged", "ClickableViewAccessibility"})
@Override
public void onResponse(Call<ArrayList<getMarker>> call, @NonNull Response<ArrayList<getMarker>> response) {
//ㅡㅡㅡㅡㅡㅡㅡㅡ
// 응답받은 배열
//ㅡㅡㅡㅡㅡㅡㅡㅡ
ArrayList<getMarker> items = response.body(); // 대입하는 순간 SerializedName에 따라 이름따라 값이 들어가짐 !! 중요
마커셋팅(naverMap, items); //지도뷰에 마커삽입
}
@Override
public void onFailure(Call<ArrayList<getMarker>> call, Throwable t) {
Log.e("onFailure : ", t.getMessage());
}
});
}
3-1. interface
public interface Sharing {
//위치공유방 참여자가 경로마커 보기
@FormUrlEncoded
@POST("iamhere/markerList_get2.php")
Call<ArrayList<getMarker>> markerArraylistGet2(
@Field("Room_no") String Room_no //방번호(쉐어드저장)를 보내면 RouteMaarker테이블에서 row를 추출하겠지
);
}
3-2. model
public class getMarker {
// [
// {
// "arrLat": "37.48503839980235",
// "arrLng": "126.9683922068462"
// },
// {
// "arrLat": "37.48503839980235",
// "arrLng": "126.9683922068462"
// }
// ] 다음과 같은 형태로 받아와짐
@Expose
@SerializedName("arrLat")
public double arrLat;
@Expose
@SerializedName("arrLng")
public double arrLng;
public double getArrLat() {
return arrLat;
}
public double getArrLng() {
return arrLng;
}
public getMarker(double arrLat, double arrLng) {
this.arrLat = arrLat;
this.arrLng = arrLng;
}
}
3-3. retrofit instance
private Retrofit retrofit객체() {
retrofit2.Retrofit retrofit = new retrofit2.Retrofit.Builder() //Retrofit 인스턴스 생성
.baseUrl("http://15.164.~~/") //baseUrl 등록
.client(createOkHttpClient()) //네트워크 통신 로그보기(서버로 주고받는 파라미터) - 생략가능
.addConverterFactory(GsonConverterFactory.create()) //http통신시에 주고받는 데이터형태를 변환시켜주는 컨버터를 지정한다. Gson, Jackson 등이 있다. Gson 변환기 등록
.addConverterFactory(ScalarsConverterFactory.create())
.build();
return retrofit;
}
4. setMarker method
//서버에서 받아온 위도경도를 지도에 뷰로 뿌리기
private void 마커셋팅(NaverMap naverMap, ArrayList<getMarker> 위도경도리스트) {
Log.e(TAG, "마커셋팅() 들어옴 ");
for (int i=0; i<위도경도리스트.size(); i++) { //마커리스트가 null인 경우가 있어서 마커위도리스트를 기준으로 삼음
Log.e(TAG, "마커셋팅() i : "+i);
Marker marker = new Marker(); //다시 마커객체 생성해서 다시 위치에 삽입함
marker.setPosition(new LatLng(위도경도리스트.get(i).getArrLat(), 위도경도리스트.get(i).getArrLng())); //static변수로 액티비티가 파괴되어도 사용할 수 있게함
marker.setWidth(90);
marker.setHeight(90);
marker.setMap(naverMap); //다시 대입한다 /해야 보임
tv_markerNum.setText(String.valueOf(i+1)); //인덱스+1해야 자연수가 나옴
marker.setIcon(OverlayImage.fromView(tv_markerNum)); //숫자먼저 set하고 뷰를 삽입한다.
}
}
5. response
<?php
include 'db.php'; //비밀번호 보호차원에서 include로 불러옴
$방번호 = $_POST['Room_no']; //방번호가 쉐어드에 저장되어있어서 꺼져도 꺼내서 서버로 받을 수 있음
$sql_select="select * from RouteMarker where Room_no = '$방번호'"; //해당 방에 찍힌 마커들이 조회됨 (0~20개)
// $sql_select="select * from RouteMarker where Room_no = '$방번호'"; //해당 방에 찍힌 마커들이 조회됨 (0~20개)
$result=mysqli_query($db,$sql_select); //방이름 중복체크
$num = mysqli_num_rows($result); //경로마커 갯수가 1개 이상이면 배열보내기
$경로마커들 = array();
while($row = mysqli_fetch_array($result)){ //row 한 줄 한 줄 반복해서 배열에 담는다.
array_push($경로마커들, array('arrLat'=>$row['Lat'],
'arrLng'=>$row['Lng'] ));
}
if($num > 0) {
echo json_encode($경로마커들, JSON_PRETTY_PRINT+JSON_UNESCAPED_UNICODE);
} else {
array_push($경로마커들, array('Room_mapCapture'=>"없음")); //배열의 첫번째에 "없음"을 넣는다.
echo json_encode($경로마커들, JSON_PRETTY_PRINT+JSON_UNESCAPED_UNICODE);
}
?>
본인이 생성한 테이블에 맞게 쿼리를 날립니다.
'$경로마커들' 안에 위도, 경도 값이 담겨있습니다.
'안드로이드 자바' 카테고리의 다른 글
[Android][Java] 툴바 버튼에 뱃지 추가하기 (0) | 2023.02.01 |
---|---|
[Android][Java]TransitionAnimation 을 이용해 Activity 전환 애니메이션 만들기 (0) | 2023.01.30 |
[안드로이드 자바] Matisse 라이브러리 사용하기 (0) | 2023.01.24 |
[Android][Java] 토스트 메시지 꾸미기 2 (0) | 2023.01.23 |
[Android][Java] 내 연락처 가져오기 (0) | 2023.01.20 |