【发布时间】:2016-09-22 09:26:25
【问题描述】:
我检查并确保 google places api for android 已启用。
一开始我用的是这个网址:
https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=34.0467359,-118.441764&radius=1000&sensor=true&key=YOUR_PLACE_API_KEY
然后切换到这个:
https://maps.googleapis.com/maps/api/place/details/json? reference=REFERENCE_STRING_OF_THE_PLACE&sensor=true&key=YOUR_PLACE_API_KEY
根据
中的建议Android - Google Places API - No "reviews" Array
但仍然出现同样的错误。
开启https://developers.google.com/places/web-service/details
据说引用已被弃用,现在我们必须使用 place_id。我将网址更改为:
https://maps.googleapis.com/maps/api/place/details/json?placeid=ChIJN1t_tDeuEmsRUsoyG83frY4&key=YOUR_API_KEY
后来我在 stackoverflow 上读到,在 2012 年,Google Places API 没有提取评论的功能。这适用于现在吗? 2016 年?如果没有,请帮助我在下面的代码中破译我做错了什么(正在做错什么)。
如果我复制并粘贴上述任何 url 的任何日志输出,评论会显示在我的浏览器中,但响应中的输出不会显示 url。
我收到此错误:
W/System.err: org.json.JSONException: No value for reviews
W/System.err: at org.json.JSONObject.get(JSONObject.java:389)
W/System.err: at org.json.JSONObject.getJSONArray(JSONObject.java:584)
W/System.err: at DownloadReviewsTask.doInBackground(DownloadReviewsTask.java:69)
W/System.err: at DownloadReviewsTask.doInBackground(DownloadReviewsTask.java:19)
W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:292)
W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
W/System.err: at java.lang.Thread.run(Thread.java:818)
下面是我的代码:
public class JSONParser {
String charset = "UTF-8";
HttpURLConnection conn;
DataOutputStream wr;
StringBuilder result = new StringBuilder();
URL urlObj;
JSONObject jObj = null;
StringBuilder sbParams;
String paramsString;
public JSONObject makeHttpRequest(String url, String method,
HashMap<String, String> params) {
sbParams = new StringBuilder();
int i = 0;
for (String key : params.keySet()) {
try {
if (i != 0){
sbParams.append("&");
}
sbParams.append(key).append("=")
.append(URLEncoder.encode(params.get(key), charset));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
i++;
}
if (method.equals("POST")) {
// request method is POST
try {
urlObj = new URL(url);
conn = (HttpURLConnection) urlObj.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Accept-Charset", charset);
conn.setReadTimeout(90000);
conn.setConnectTimeout(90000);
conn.connect();
paramsString = sbParams.toString();
wr = new DataOutputStream(conn.getOutputStream());
wr.writeBytes(paramsString);
wr.flush();
wr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
else if(method.equals("GET")){
// request method is GET
if (sbParams.length() != 0) {
url += "?" + sbParams.toString();
}
try {
urlObj = new URL(url);
conn = (HttpURLConnection) urlObj.openConnection();
conn.setDoOutput(false);
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept-Charset", charset);
conn.setConnectTimeout(90000);
conn.connect();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
//Receive the response from the server
InputStream in = new BufferedInputStream(conn.getInputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line;
while ((line = reader.readLine()) != null) {
result.append(line);
}
Log.d("JSON Parser", "result: " + result.toString());
} catch (IOException e) {
e.printStackTrace();
}
conn.disconnect();
// try parse the string to a JSON object
try {
jObj = new JSONObject(result.toString());
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
// return JSON Object
return jObj;
}
}
public class DownloadReviewsTask extends AsyncTask<String, Void, HashMap<String, List<MyModel>>> {
//Declarations
private Context mContext;
public Exception mException;
private OnEventListener<HashMap<String, List<MyModel>>> mCallBack;
JSONArray reviews;
String author_name;
String text;
//Constructor
public DownloadReviewsTask(Context context, OnEventListener callback) {
mCallBack = callback;
mContext = context;
}
//sets and passes the review author and text for each review and sets them in the My Model
public MyModel setPlace(JSONObject thisObject) throws JSONException {
JSONObject results = thisObject.getJSONObject("results");
MyModel thisMyModel = new MyModel();
if (!results.isNull("reviews")) {
reviews = results.getJSONArray("reviews");
Log.e("reviews array setPlace", String.valueOf(reviews));
for (int i = 0; i < reviews.length(); i++) {
//if(i==reviews.length()) break;
// if (thisObject.getJSONArray("reviews").getJSONObject(i).has("author_name")) //{
author_name = results.getJSONArray("reviews").getJSONObject(i).getString("author_name");//reviews.getJSONObject(i).getString("author");
Log.e("review_author in setup", results.getJSONArray("reviews").getJSONObject(i).getString("author_name"));
// }
//if (thisObject.getJSONArray("reviews").getJSONObject(i).has("text")) {
Log.e("review text in setup", results.getJSONArray("reviews").getJSONObject(i).getString("text"));
text = results.getJSONArray("reviews").getJSONObject(i).getString("text");//}
thisMyModel.setAuthor_name(author_name);
thisMyModel.setText(text);
}
}
return thisMyModel;
}
@Override
protected HashMap<String, List<MyModel>> doInBackground(String... args) {
try {
JSONParser jsonParser = new JSONParser();
JSONObject json;
String reviewUrl = args[0];
Log.e("reviewUrl",reviewUrl);
//Use a HashMap instead with the varargs:
HashMap<String, String> params = new HashMap<>();
json = jsonParser.makeHttpRequest(reviewUrl, "GET", params);
HashMap<String, List<MyModel>> myResults = new HashMap<>();
if(json != null) {
Log.e("reviews result", json.toString());
JSONArray parentArray = json.getJSONArray("reviews");
List<MyModel> allEventsList = new ArrayList<>();
//loops through json array
for (int i = 0; i < parentArray.length(); i++) {
JSONObject finalObject = parentArray.getJSONObject(i);
allEventsList.add(setPlace(finalObject));
Log.e("allEventsList", String.valueOf(allEventsList));
}
myResults.put("reviews", allEventsList);
Log.e("myResults",String.valueOf(myResults));
return myResults;
}else{
return null;
}
}
catch (JSONException e){
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(HashMap<String, List<MyModel>> result) {
if (mCallBack != null) {
if (mException == null) {
mCallBack.onSuccess(result);
} else {
mCallBack.onFailure(mException);
}
}
}
}
public class MyModel{
private String reference;
public void setReference(String reference) {
this.reference = reference;
}
public String getReference() {
return reference;
}
}
public class MainActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String reviewsUrl = "https://maps.googleapis.com/maps/api/place/details/json?reference="+reference+sensor+key;
DownloadReviewsTask rev = new DownloadReviewsTask(this, new OnEventListener<HashMap<String, List<MyModel>>>() {
@Override
public void onSuccess(HashMap<String, List<MyModel>> result) {
if(result != null && result.size() > 0) {
for (int i = 0; i < result.size(); i++){
Log.e("review SingleVewInit",result.get("reviews").get(0).getAuthor_name());
Log.e("review SingleVewInit",result.get("reviews").get(0).getText());
}
}
}
@Override
public void onFailure(Exception e) {
//Toast.makeText(this, "ERROR: " + e.getMessage(), Toast.LENGTH_LONG).show();
Log.e("ERROR: " ,e.getMessage());
}
});
rev.execute(reviewsUrl);
}
}
【问题讨论】:
-
我认为您只能获得评论,仍然无法提交评论。因为在这种情况下,每个人都可以自动发送评论,评论将失去其严肃性
-
@Hrabosch 代码是拉(GET)评论而不是发布评论。通过在 android 应用程序中显示,我的意思是将拉取的评论放在 textView 中。上面的代码不会生成评论。它们已经存在于 google 上
-
@Hrabosch 如果您确实有您认为可以完成工作的 android java 代码,即很好地从 google 获得评论,请随时在答案中发布。也许我错了
-
@Hrabosch 你是说你浏览了我的代码并发现它会生成评论吗?如果是这样,请帮我看看是哪些行
-
@JqueryNinja:我能够使用以下网址获取评论数组 - maps.googleapis.com/maps/api/place/details/…
标签: java android android-asynctask google-places-api review