相对于用户当前位置,Google地图中未显示附近的地点

问题描述

我正在跟踪一个教程,以查找有关当前用户位置的附近地点。但我无法做到这一点。每当我从摘要(例如:-ATM)中选择任何一项以了解周围所有ATM的位置时,地图上都不会出现

我的MainActivity代码:--->


package com.example.nearbyplaces;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
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 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 MainActivity extends AppCompatActivity {

Spinner spinner;
Button button;
SupportMapFragment supportMapFragment;
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.sp_type);
    button = findViewById(R.id.bt_find);

    supportMapFragment = (SupportMapFragment) 
getSupportFragmentManager().findFragmentById(R.id.google_map);
    //Initialize array of place type
    final String[] placeTypeList = {"atm","bank","hospitals","movie_theater","restaurent","pubs"};
    //Intialsizing array of place name
    String[] placeNameList = {"ATM","Bank","Hospital","Movie Theater","Restaurent","Pubs"};
    //Set adapter on spinner
    spinner.setAdapter(new ArrayAdapter<>(MainActivity.this,android.R.layout.simple_spinner_dropdown_item,placeNameList));

    //Initialize fused location provider client
    fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);

    //check permission
    if (ActivityCompat.checkSelfPermission(MainActivity.this,Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
    //when permission granted
    //call method
    getCurrentLocation();
    }
else {
    //When permission denied
        //Request permission
        ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},44);

    }
button.setonClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //Get selected [position of spinner
        int i = spinner.getSelectedItemPosition();
        //Initialize url
        String url = "https://maps.googleapis.com/maps/api/place/nearbysearch/json" +//Url
        "?location=" + currentLat +","+ currentLong+//Location latitude and longitude
        "&radius=5000" + //Nearby radius
        "&types=" +placeTypeList[i]+//place type
        "&sensor=true" +//Sensor
        "&key=" +getResources().getString(R.string.google_map_key);//Google map key

        //Execute place task method to download json data
        new PlaceTask().execute(url);
    }
});
}

private void getCurrentLocation() {
    //Initialize task location

    Task<Location> task = fusedLocationProviderClient.getLastLocation();
    task.addOnSuccessListener(new OnSuccessListener<Location>() {
        @Override
        public void onSuccess(Location location) {
            //When success
            if(location != null){
                //when location is not equal to null
                //Get current latitude
                currentLong = location.getLatitude();
                //Get current longitude
                currentLong = location.getLongitude();
                //Sync map
                supportMapFragment.getMapAsync(new OnMapReadyCallback() {
                    @Override
                    public void onMapReady(GoogleMap googleMap) {
                        //When map is ready
                        map= googleMap;
                        //Zoom current location on map
                        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){
            //When permission granted
            //call method
            getCurrentLocation();
        }
    }

    super.onRequestPermissionsResult(requestCode,permissions,grantResults);
}

private class PlaceTask extends AsyncTask<String,Integer,String> {

    @Override
    protected String doInBackground(String... strings) {
        String data= null;

        try {
            //Initialize data
           data = downloadUrl(strings[0]);
        } catch (IOException e) {
            e.printstacktrace();
        }
        return data;
    }

    @Override
    protected void onPostExecute(String s) {
        //Execute parse task
        new ParserTask().execute(s);
    }
}

private String downloadUrl(String string) throws IOException {
    //Initialize url
    URL url = new URL(string);
    //Initialize connection
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    //Connect connection
    connection.connect();
    //Initialize input stream
    InputStream stream = connection.getInputStream();
    //Initialize buffer reader
    BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
    //Initializing string builder
    StringBuilder builder = new StringBuilder();
    //Initialize string variable
    String line="";
    //Use while loop
    while ((line = reader.readLine())!= null){
        //Append line
        builder.append(line);

    }
    //Get append data
    String data = builder.toString();
    //Close reader
    reader.close();
    //Return data
    return data;

}

private class ParserTask extends AsyncTask<String,List<HashMap<String,String>>>{
    @Override
    protected List<HashMap<String,String>> doInBackground(String... strings) {
        //Create json parser class
        JsonParser jsonParser= new JsonParser();
        //Initializing hash map list
        List<HashMap<String,String>> mapList = null;
        JSONObject object= null;
        try {
            //Initializing json object
             object = new JSONObject(strings[0]);
             //Parse json object
            mapList=jsonParser.parseResult(object);
        } catch (JSONException e) {
            e.printstacktrace();
        }
        //Return map list
        return mapList;
    }

    @Override
    protected void onPostExecute(List<HashMap<String,String>> hashMaps) {
        //Clear map
        //Use for loop
        for(int i = 0;i<hashMaps.size();i++){
            //Initialize hash map
            HashMap<String,String> hashMapList = hashMaps.get(i);
            //Get latitude
            double lat = Double.parseDouble(hashMapList.get("lat"));
            //Get longitude
            double lng = Double.parseDouble(hashMapList.get("lng"));
            //Get name
            String name =hashMapList.get("name");
            //Concat latitude and longiyude
            LatLng latLng= new LatLng(lat,lng);
            //Initialize marker options
            MarkerOptions options = new MarkerOptions();
            //Set Position
            options.position(latLng);
            //Set title
            options.title(name);
            //Add marker on map
            map.addMarker(options);
        }
    }
}
}

JsonParser类:---->


package com.example.nearbyplaces;

import android.widget.LinearLayout;

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) {
    //Initialize hash map
    HashMap<String,String> dataList = new HashMap<>();
    try {
        //Get Name From Object
        String name = object.getString("name");
        //Get Latitude from object
        String latiitude = object.getJSONObject("geometry")
                .getJSONObject("location").getString("lat");
        //Get longitude from object
        String longitude = object.getJSONObject("geometry")
                .getJSONObject("location").getString("lng");
        //Put all value in hash map
        dataList.put("name",name);
        dataList.put("lat",latiitude);
        dataList.put("lng",longitude);
    } catch (JSONException e) {
        e.printstacktrace();
    }
    //Return hash map
    return dataList;
}
private List<HashMap<String,String>> parseJsonArray(JSONArray jsonArray){
    //Initializing hash map list
    List<HashMap<String,String>> datalist = new ArrayList<>();
    for (int i= 0;i<jsonArray.length();i++){
        try {
            //Initialize hash map
            HashMap<String,String> data = parseJsonObject((JSONObject)jsonArray.get(i));
            //Add data in hash map list
            datalist.add(data);
        } catch (JSONException e) {
            e.printstacktrace();
        }
    }
    //Return hash map list
    return datalist;
}
public  List<HashMap<String,String>> parseResult(JSONObject jsonObject){
    //Initializing json array
    JSONArray jsonArray = null;
    //Get result array
    try{
        jsonArray = jsonObject.getJSONArray("results");
    }catch (JSONException e){
        e.printstacktrace();
    }
    //Return array
    return parseJsonArray(jsonArray);
}
}

MainActivity 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:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="8dp">
    
    <Spinner
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:id="@+id/sp_type"
        android:background="@android:drawable/editBox_background"/>


    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/bt_find"
        android:text="find" />


</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"/>
</LinearLayout>

AndroidManifest代码:---->


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.nearbyplaces">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <Meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="@string/google_map_key"/>

    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

Build.gradle代码:---->


apply plugin: 'com.android.application'

android {
compileSdkVersion 29
buildToolsversion "30.0.1"

defaultConfig {
    applicationId "com.example.nearbyplaces"
    minSdkVersion 16
    targetSdkVersion 29
    versionCode 1
    versionName "1.0"

    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro'
    }
}
}


dependencies {

implementation filetree(dir: "libs",include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation 'com.google.android.gms:play-services-maps:17.0.0'
implementation 'com.google.android.gms:play-services-location:17.0.0'

}

当我按下“查找”按钮时,什么也没有发生,我的意思是,如果我选择在我附近找到ATM,那么它就不会显示我附近的ATM。当我按下“查找”按钮时,我在Log cat中也没有收到任何错误。我不知道上面的代码有什么不正确或缺失。另外,我已经有一个Google Map Platform结算帐户。

请帮助!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)