2015-05-04 54 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

相關問題