안드로이드 스튜디오 버튼 클릭시 오류
본문
안드로이드 스튜디오에서 plcaes api로 주변 식당,병원,등 시설을 표시하고 싶어서 유튜브 보고 따라하고 있는데 버튼클릭시 어플이 바로 꺼져버리네요. 도움한번만 부탁드립니다. ㅜㅜ
package com.example.myapplication; import android.Manifest; import android.content.pm.PackageManager; import android.location.Location; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.Spinner; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import com.example.myapplication.parsers.JsonParser; import com.google.android.gms.location.FusedLocationProviderClient; import com.google.android.gms.location.LocationServices; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; import com.google.android.gms.tasks.OnSuccessListener; import com.google.android.gms.tasks.Task; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.List; public class SubActivity3 extends AppCompatActivity { Spinner spType; Button btFind; SupportMapFragment supportMapFragment; GoogleMap map; FusedLocationProviderClient fusedLocationProviderClient; double currentLat = 0, currentLong = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sub3); spType = findViewById(R.id.sp_type); btFind = findViewById(R.id.bt_find); supportMapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.google_map); String[] placeTypeList = {"atm", "bank", "hospital", "movie_theater", "restaurant"}; String[] placeNameList = {"ATM", "Bank", "Hospital", "Movie Theater", "Restaurant"}; spType.setAdapter(new ArrayAdapter<>(SubActivity3.this, android.R.layout.simple_spinner_dropdown_item, placeNameList)); fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this); if (ActivityCompat.checkSelfPermission(SubActivity3.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { getCurrentLocation(); }else { ActivityCompat.requestPermissions(SubActivity3.this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},44); } btFind.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int i = spType.getSelectedItemPosition(); String url ="https://maps.googleapis.com/maps/api/place/nearbysearch/json" + "?location=" + currentLat + "," + currentLong + "&radius=5000" + "&types=" + placeTypeList[i] + "&sensor=true" + "&key=" + getResources().getString(R.string.google_map_key); new PlaceTask().execute(url); } }); } private void getCurrentLocation() { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return; } Task<Location> task = fusedLocationProviderClient.getLastLocation(); task.addOnSuccessListener(new OnSuccessListener<Location>() { @Override public void onSuccess(Location location) { if (location != null){ currentLat = location.getLatitude(); currentLong = location.getLongitude(); supportMapFragment.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(GoogleMap googleMap) { map = googleMap; map.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(currentLat,currentLong),10)); } }); } } }); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 44) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { getCurrentLocation(); } } } private class PlaceTask extends AsyncTask<String,Integer,String> { @Override protected String doInBackground(String... strings) { String data = null; try { data = downloadUrl(strings[0]); } catch (IOException e) { e.printStackTrace(); } return data; } @Override protected void onPostExecute(String s) { new ParserTask().execute(s); } } private String downloadUrl(String string) throws IOException { URL url = new URL(string); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.connect();; InputStream stream = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); StringBuilder builder = new StringBuilder(); String line = ""; while ((line = reader.readLine()) != null) { builder.append(line); } String data = builder.toString(); reader.close(); return data; } private class ParserTask extends AsyncTask<String,Integer, List<HashMap<String,String>>> { @Override protected List<HashMap<String, String>> doInBackground(String... strings) { JsonParser jsonParser = new JsonParser(); List<HashMap<String ,String >> mapList = null; JSONObject object = null; try { object =new JSONObject(strings[0]); mapList = jsonParser.parseResult(object); } catch (JSONException e) { e.printStackTrace(); } return mapList; } @Override protected void onPostExecute(List<HashMap<String, String>> hashMaps) { map.clear(); for (int i=0; i<hashMaps.size(); i++){ HashMap<String,String> hashMapList = hashMaps.get(i); double lat = Double.parseDouble(hashMapList.get("lat")); double lng = Double.parseDouble(hashMapList.get("lng")); String name = hashMapList.get("name"); LatLng latLng = new LatLng(lat,lng); MarkerOptions options = new MarkerOptions(); options.position(latLng); options.title(name); map.addMarker(options); } } } }
Jsonparser 입니다
package com.example.myapplication.parsers; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.HashMap; import java.util.List; public class JsonParser { private HashMap<String,String> parseJsonObject(JSONObject object){ HashMap<String,String> dataList = new HashMap<>(); try { String name = object.getString("name"); String latitude = object.getJSONObject("geometry") .getJSONObject("location").getString("lat"); String longitude = object.getJSONObject("geometry") .getJSONObject("location").getString("lng"); dataList.put("name",name); dataList.put("lat",latitude); dataList.put("lng",longitude); } catch (JSONException e) { e.printStackTrace(); } return dataList; } private List<HashMap<String,String>> parseJsonArray(JSONArray jsonArray){ List<HashMap<String,String >> dataList = new ArrayList<>(); for (int i=0; i<jsonArray.length(); i++){ try { HashMap<String,String> data = parseJsonObject((JSONObject) jsonArray.get(i)); dataList.add(data); } catch (JSONException e) { e.printStackTrace(); } } return dataList; } public List<HashMap<String,String>> parseResult(JSONObject object){ JSONArray jsonArray = null; try { jsonArray = object.getJSONArray("result"); } catch (JSONException e) { e.printStackTrace(); } return parseJsonArray(jsonArray); } }
답변 1
코드를 이렇게 올려줘도 문제점 파악이 너무 힘이 들죠.
아무리 고수라도 코드만 보고 문제점을 파악하기는 조금 힘들죠.
안드로이드 스튜디오에서 디버깅 모드를 활용해서 버튼 클릭시 발생하는 에러가 어떤 것인지.
(이벤트 발생, 에러 로그 등)
어느 부분에서 에러가 나는지 등을 체크해 보세요
답변을 작성하시기 전에 로그인 해주세요.