Google地方信息自动填充Android - 无效

时间:2015-05-04 09:53:10

标签: android api autocomplete google-places-api

我是Android App开发的新手。 我按照this toturial编写了一个简单的Google商家信息自动填充Android应用,但是当我开始在应用中输入内容时,它不会返回任何建议。当我在自动完成文本视图中写入任何内容时,它会在LogCat中给出NativeCrypto错误。这是我的代码:

package com.example.newxyz; 

import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.Toast;

public class GooglePlacesAutocompleteActivity extends Activity implements OnItemClickListener {
    private static final String LOG_TAG = "Google Places Autocomplete";
    private static final String PLACES_API_BASE = "https://maps.googleapis.com/maps/api/place";
    private static final String TYPE_AUTOCOMPLETE = "/autocomplete";
    private static final String OUT_JSON = "/json";
    private static final String API_KEY = "AIzaSyAujQlZ1Jj64NAHMoynXjI253MVRzGW09w";
    private static final String True = "true";
    private static final String language = "en";

    AutoCompleteTextView autoCompView;
    @Override

   public void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        autoCompView = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView);

        autoCompView.setAdapter(new GooglePlacesAutocompleteAdapter(this, R.layout.list_item));

        autoCompView.setOnItemClickListener(this);

    } 



    public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {

        String str = (String) adapterView.getItemAtPosition(position);
        Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
   }

    public static ArrayList<String> autocomplete(String input) {
        ArrayList<String> resultList = null;
        HttpURLConnection conn = null;
        StringBuilder jsonResults = new StringBuilder();
       try {
            StringBuilder sb = new StringBuilder(PLACES_API_BASE + TYPE_AUTOCOMPLETE + OUT_JSON);
            sb.append("?sensor=" + True);
            sb.append("&key=" + API_KEY);
            sb.append("&language" + language);
            //sb.append("&components=country:gr");
            sb.append("&input=" + URLEncoder.encode(input, "utf8"));
            URL url = new URL(sb.toString());
            conn = (HttpURLConnection) url.openConnection();
            InputStreamReader in = new InputStreamReader(conn.getInputStream());


            // Load the results into a StringBuilder

           int read;
            char[] buff = new char[1024];
            while ((read = in.read(buff)) != -1) {
                jsonResults.append(buff, 0, read);
            }

        } catch (MalformedURLException e) {

            Log.e(LOG_TAG, "Error processing Places API URL", e);

            return resultList;
       } catch (IOException e) {
            Log.e(LOG_TAG, "Error connecting to Places API", e);
            return resultList;
        } finally {
            if (conn != null) {

                conn.disconnect();
            }
        }
        try {           
            // Create a JSON object hierarchy from the results
            JSONObject jsonObj = new JSONObject(jsonResults.toString());
            JSONArray predsJsonArray = jsonObj.getJSONArray("predictions");
            // Extract the Place descriptions from the results
            resultList = new ArrayList<String>(predsJsonArray.length());
            for (int i = 0; i < predsJsonArray.length(); i++) {
                System.out.println(predsJsonArray.getJSONObject(i).getString("description"));
                System.out.println("============================================================");
                resultList.add(predsJsonArray.getJSONObject(i).getString("description"));
            }
        } catch (JSONException e) {
            Log.e(LOG_TAG, "Cannot process JSON results", e);
     }
        return resultList;
    }
   class GooglePlacesAutocompleteAdapter extends ArrayAdapter<String> implements Filterable {
        private ArrayList<String> resultList;
        public GooglePlacesAutocompleteAdapter(Context context, int textViewResourceId) {
            super(context, textViewResourceId);
        }
        @Override
        public int getCount() {
            return resultList.size();
        }
        @Override
        public String getItem(int index) {
            return resultList.get(index);
        }
        @Override
        public Filter getFilter() {
            Filter filter = new Filter() {
                @Override
                protected FilterResults performFiltering(CharSequence constraint) {
                    FilterResults filterResults = new FilterResults();
                    if (constraint != null) {
                        // Retrieve the autocomplete results.

                      resultList = autocomplete(constraint.toString());
                        // Assign the data to the FilterResults
                        filterResults.values = resultList;
                        filterResults.count = resultList.size();
                    }
                    return filterResults;
                }
                @Override

               protected void publishResults(CharSequence constraint, FilterResults results) {
                   if (results != null && results.count > 0) {
                        notifyDataSetChanged();
                    } else {
                        notifyDataSetInvalidated();
                    }
                }

            };
            return filter;
       }
    }
}

这是我的LogCat错误:

05-04 13:16:27.705: E/NativeCrypto(9312): ssl=0x611c0a20 cert_verify_callback x509_store_ctx=0x62625940 arg=0x0
05-04 13:16:27.705: E/NativeCrypto(9312): ssl=0x611c0a20 cert_verify_callback calling verifyCertificateChain authMethod=ECDHE_RSA
  • 我在console.developers.google.com
  • 中启用了适用于Android的Google Places API
  • 我正在为我的应用使用浏览器密钥
  • 我找到了问题的答案,但尚未找到任何相关的答案
  • 我在Menifest文件中提供了Internet权限
  • 在开发者控制台概述中,图表显示请求,这意味着发出了请求但没有响应。

非常感谢任何帮助。 感谢

7 个答案:

答案 0 :(得分:4)

转到Google Console&gt;&gt; Api&gt;&gt;启用Google Places API网络服务。 见Solution

答案 1 :(得分:0)

我昨天正在打这个问题,所以要么

  • 错误API_KEY(例如,您可能会在build.gradle中设置不同的前缀来调试版本或使用错误的SH1或注册到其他一些而不是“Google Places API for Android”)
  • 如果您的GoogleApiClient未使用enableAutoManage(fragmentActivity, clientId, connectionCallback) GoogleApiClient.blockingConnect()GoogleApiClient.connect()调用
  • 而构建

坦率地说,我对#Google如何完成此API感到高兴。很奇怪,如果你得到代码9001,9006,9007,怎么理解发生了什么?

答案 2 :(得分:0)

就我而言,问题是

"status":"REQUEST_DENIED",
"error_message":"This API project is not authorized to use this API. Please ensure that this API is activated "

该解决方案是在Google Api控制台中启用 Google Places API网络服务

答案 3 :(得分:0)

我喜欢一个解决方案,文本观察者没有任何问题。

在下面的代码中,我没有覆盖&#34; performFiltering&#34;方法。我添加了它,我的自动完整文本框现在正常工作。

public class CustomAutoCompleteView extends AutoCompleteTextView {  

public CustomAutoCompleteView(Context context) {  
    super(context);  
    // TODO Auto-generated constructor stub  
}  

public CustomAutoCompleteView(Context context, AttributeSet attrs) {  
    super(context, attrs);  
    // TODO Auto-generated constructor stub  
}  

public CustomAutoCompleteView(Context context, AttributeSet attrs,  
        int defStyle) {  
    super(context, attrs, defStyle);  
    // TODO Auto-generated constructor stub  
}  

@Override  
protected void performFiltering(final CharSequence text, final int keyCode) {  
    String filterText = "";  
    super.performFiltering(filterText, keyCode);  
}  
/** 
* After a selection, capture the new value and append to the existing 
* text 
*/  
@Override  
protected void replaceText(final CharSequence text) {  
    super.replaceText(text);  
}  

}  

答案 4 :(得分:0)

启用“Google Places API Web服务”API并尝试一下。它对我有用。

答案 5 :(得分:-1)

请尝试做类似的事情:

final StringBuilder sb = new StringBuilder(PLACES_API_BASE + TYPE_AUTOCOMPLETE + OUT_JSON);
sb.append("?key=" + API_KEY);
sb.append("&input=" + URLEncoder.encode(input, "utf8"));
final URL url = new URL(sb.toString());
conn = (HttpURLConnection) url.openConnection();
final InputStreamReader in = new InputStreamReader(conn.getInputStream());

这是我的工作。

答案 6 :(得分:-1)

The solution is adding googlePlaceApi to project in console.developers.google.com