2015-05-04 56 views
0

我是Android App开发新手。 我跟着this toturial写了一个简单的Google Places自动填充Android应用程序,但是当我开始在应用程序中输入时,它不会返回任何建议;当我在自动完成textview中写入任何内容时,它会在LogCat中给出NativeCrypto错误。这里是我的代码:Google Places autocomplete Android - 不工作

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启用谷歌Places API的为Android
  • 我使用的是我的应用程序的浏览器密钥
  • 我已经找过我的问题的答案,并且还没有找到任何相关答案
  • 我给了Inter在Menifest文件中的网络权限
  • 在开发者控制台的概述中,图表显示了请求,这意味着请求已完成但没有响应。

任何帮助将不胜感激。 感谢

+0

工程 “它给NativeCrypto错误logcat的”?然后请发布dat logcat(记录器实际上有助于调试)... – shkschneider

+0

请检查已编辑的文章 –

+0

可能值得看看Android的新Places API(https://developers.google.com/places/android /),它支持自动完成。 – plexer

回答

-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()); 

它在我的情况下工作。

+0

它想给出相同的错误:( –

+1

实际的问题是在您的API密钥 当我尝试与我的代码不工作 但我的API密钥工作正常 –

+0

所以我能做什么?我删除了密钥,并做了一个新的,但仍然没有运气... –

1

由于您正在使用Places API网络服务(而不是Android服务),因此您必须在Google Developers Console中启用Google Places API Web Service API。

一旦你有了这个工作,如果你想简化你的代码并使用一个提供GooglePlaceAutoComplete小部件的库,请查看Sprockets(我是开发人员)。与您的API密钥设置它之后,你可以工作Places API的自动完成功能添加到您的布局是这样的:

<net.sf.sprockets.widget.GooglePlaceAutoComplete 
    android:id="@+id/place" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"/> 
+0

如果我的API密钥不起作用,那么什么用途将是一个库? –

+0

看起来你只需要启用另一个API。我已将详细信息添加到答案中。 – pushbit

+0

我为Android制作了一个关键字,并启用了适用于Android的Google Places API,但出现同样的错误。 –

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,怎么理解发生了什么?

+0

我尝试删除并制作新的API_KEY,SH1正在为Google地图工作,但不是Google地点。 Google Places API for Android是我注册的...我不明白你的第二点。请你详细说明 –

+0

oops,我刚刚意识到我回答了错误的问题。我正在谈论谷歌地图的东西从Android谷歌播放服务。但您可能有兴趣查看https://developers.google.com/places/android/autocomplete。 – Ivan

+0

这个API并非真正意义上的使用,而是关闭的原因。看这里:http://venturebeat.com/2015/07/24/google-will-restrict-access-to-its-autocomplete-api-on-august-10-asks-developers-to-use-custom-search -发动机/ – portfoliobuilder

0

在我的情况下,问题是

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

,将溶液使谷歌Places API的Web服务在谷歌API控制台中。

0

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

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

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); 
} 

} 
0

启用“Google Places API Web服务”API并尝试一下。它为我工作。

4

转​​>> Api >>启用Google Places API Web服务。 见Solution

-1

的解决方案是增加googlePlaceApi在console.developers.google.com

相关问题