问题描述
我正在跟踪一个教程,以查找有关当前用户位置的附近地点。但我无法做到这一点。每当我从摘要(例如:-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 (将#修改为@)