Java 如何在Android Studio | NearbyPlaces中查找地图上的附近位置
在我的Android项目中,我想根据我在谷歌地图上的当前位置显示最近的位置。我通过听视频学习新知识。但是,当我想在微调器中选择场地类型时,我得到了这个错误。错误:E/libprocessgroup:set\u Timer缺少写入失败:不允许操作您能帮助我吗Java 如何在Android Studio | NearbyPlaces中查找地图上的附近位置,java,android,Java,Android,在我的Android项目中,我想根据我在谷歌地图上的当前位置显示最近的位置。我通过听视频学习新知识。但是,当我想在微调器中选择场地类型时,我得到了这个错误。错误:E/libprocessgroup:set\u Timer缺少写入失败:不允许操作您能帮助我吗 MainActivity.java: public class MainActivity extends AppCompatActivity { Spinner spinner; Button btn_find; Su
MainActivity.java:
public class MainActivity extends AppCompatActivity {
Spinner spinner;
Button btn_find;
SupportMapFragment supportmap;
GoogleMap map;
FusedLocationProviderClient fusedLocationProviderClient;
double currentLat = 0, currentLong = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinner = findViewById(R.id.spinner);
btn_find = findViewById(R.id.btn_find);
supportmap = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.google_map);
String[] placeTypeList = {"camii", "park", "avm", "müze", "restaurant"};
String[] placeNameList = {"Camii", "Müze", "Avm", "Park", "Restaurant"};
spinner.setAdapter(new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item, placeNameList));
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
getCurrentLocation();
} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 44);
}
btn_find.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int i = spinner.getSelectedItemPosition();
// String url = "https://maps.googleapis.com/maps/api/..." + "?location=" + currentLat + "," + currentLong + "&radius=5000" + "&type=" + placeTypeList[i] + "&sensor=true" + "&key=" + getResources().getString(R.string.google_map_key);
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();
supportmap.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) {
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);
}
super.onPostExecute(hashMaps);
}
}
}
JsonParser.java:
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("geometri").getJSONObject("location").getString("lat");
String longitude=object.getJSONObject("geometri").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("results");
} catch (JSONException e) {
e.printStackTrace();
}
return parseJsonArray(jsonArray);
}
}
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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:orientation="vertical"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
android:orientation="horizontal">
<Spinner
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:id="@+id/spinner"
android:background="@android:drawable/editbox_background"></Spinner>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_find"
android:text="BUL"></Button>
</LinearLayout>
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/google_map"
android:name="com.google.android.gms.maps.SupportMapFragment"></fragment>
</LinearLayout>
MainActivity.java:
公共类MainActivity扩展了AppCompatActivity{
纺纱机;
按钮btn_查找;
支持图片段支持图;
谷歌地图;
FusedLocationProviderClient FusedLocationProviderClient;
双currentLat=0,currentLong=0;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
微调器=findViewById(R.id.spinner);
btn_find=findviewbyd(R.id.btn_find);
supportmap=(SupportMapFragment)getSupportFragmentManager()
.findFragmentById(R.id.google_地图);
String[]placeTypeList={“camii”、“park”、“avm”、“müze”、“restaurant”};
String[]placeNameList={“Camii”、“Müze”、“Avm”、“Park”、“Restaurant”};
setAdapter(新的ArrayAdapter(MainActivity.this,android.R.layout.simple_spinner_dropdown_item,placeNameList));
fusedLocationProviderClient=LocationServices.getFusedLocationProviderClient(此);
if(ActivityCompat.checkSelfPermission(MainActivity.this、Manifest.permission.ACCESS\u FINE\u LOCATION)==PackageManager.permission\u已授予){
getCurrentLocation();
}否则{
ActivityCompat.requestPermissions(MainActivity.this,新字符串[]{Manifest.permission.ACCESS\u FINE\u LOCATION},44);
}
btn_find.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
int i=spinner.getSelectedItemPosition();
//字符串url=”https://maps.googleapis.com/maps/api/..." + "?location=“+currentLat+”、“+currentLong+”&radius=5000”+“&type=“+placeTypeList[i]+”&sensor=true”+“&key=“+getResources().getString(R.string.google\u map\u key);
字符串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\u map\u key);
新建PlaceTask().execute(url);
}
});
}
私有void getCurrentLocation(){
if(ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS\u FINE\u LOCATION)!=PackageManager.permission\u已授予和&ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS\u LOCATION)!=PackageManager.permission\u已授予){
返回;
}
Task Task=fusedLocationProviderClient.getLastLocation();
task.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时的公共无效(位置){
如果(位置!=null){
currentLat=location.getLatitude();
currentLong=location.getLongitude();
getMapAsync(新的OnMapReadyCallback(){
@凌驾
4月1日公开作废(谷歌地图谷歌地图){
地图=谷歌地图;
map.animateCamera(CameraUpdateFactory.newLatLngZoom(新LatLng(currentLat,currentLong),10));
}
});
}
}
});
}
@凌驾
public void onRequestPermissionsResult(int-requestCode,@NonNull-String[]permissions,@NonNull-int[]grantResults){
if(requestCode==44){
如果(grantResults.length>0&&grantResults[0]==已授予PackageManager.PERMISSION){
getCurrentLocation();
}
}
}
私有类PlaceTask扩展了AsyncTask{
@凌驾
受保护的字符串背景(字符串…字符串){
字符串数据=null;
试一试{
数据=下载URL(字符串[0]);
}捕获(IOE异常){
e、 printStackTrace();
}
返回数据;
}
@凌驾
受保护的void onPostExecute(字符串s){
新建ParserTask()。执行;
}
}
私有字符串下载URL(字符串字符串)引发IOException{
URL=新URL(字符串);
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
connection.connect();
InputStream=connection.getInputStream();
BufferedReader reader=新的BufferedReader(新的InputStreamReader(流));
StringBuilder=新的StringBuilder();
字符串行=”;
而((line=reader.readLine())!=null){
builder.append(行);
}
字符串数据=builder.toString();
reader.close();
返回数据;
}
私有类ParserTask扩展了AsyncTask{
@凌驾
受保护列表doInBackground(字符串…字符串){
JsonParser JsonParser=新的JsonParser();
列表映射列表=空;
JSONObject对象=null;
试一试{
object=新的JSONObject(字符串[0]);
mapList=jsonParser.parseResult(对象);
}捕获(JSONException e){
e、 printStackTrace();
}
返回地图列表;
}
@凌驾
受保护的void onPostExecute(列出哈希映射){
map.clear();
对于(int i=0;i