2014-09-21 49 views
1

我對android開發非常陌生,我一直在開發一個應用程序,並遵循開發人員文檔。我正在嘗試將Google地方api和自動完成功能整合到我的應用程序中。基本上,我已經集成了我的地圖片段和我的搜索小部件。我一直試圖整合代碼,以提供一個地方名單,每次輸入一個字母。如何在我的android應用中將Google自動填充功能置於搜索窗口小部件中?

index.java

package com.connortlee.justspace; 

import android.app.Activity; 


import android.app.SearchManager; 
import android.content.Context; 

import android.location.Location; 
import android.location.LocationManager; 
import android.location.LocationListener; 
import android.os.Bundle; 

import android.util.Log; 
import android.view.Menu; 

import android.view.MenuItem; 
import android.view.Window; 
import android.view.inputmethod.InputMethodManager; 
import android.widget.EditText; 
import android.widget.LinearLayout; 

import android.widget.SearchView; 
import android.widget.TextView; 
import android.widget.Toast; 
import android.content.Intent; 
import android.app.Dialog; 
import android.support.v4.app.DialogFragment; 
import android.content.IntentSender; 
import android.widget.TextView.OnEditorActionListener; 
import android.view.KeyEvent; 
import android.view.inputmethod.EditorInfo; 

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.GooglePlayServicesClient; 
import com.google.android.gms.common.GooglePlayServicesUtil; 
import com.google.android.gms.location.LocationClient; 
import com.google.android.gms.maps.CameraUpdate; 
import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.MapFragment; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 


public class index extends Activity implements LocationListener, 
     GooglePlayServicesClient.ConnectionCallbacks, 
     GooglePlayServicesClient.OnConnectionFailedListener { 
    private GoogleMap googleMap; 
    protected LatLng currentLocation; 
    protected LocationManager locationManager; 
    private LocationClient locationClient; 
    private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000; 


    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.activity_index); 

     SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     SearchView searchView = (SearchView) findViewById(R.id.stop); 
     searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 



     //google map and location services 

     googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); 
     googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
     googleMap.getUiSettings().setZoomControlsEnabled(false); 

     locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
      locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 1000, this); 
     } else { 
      locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 100, 1000, this); 
     } 

    } 

    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     final SearchView stop = (SearchView) findViewById(R.id.stop); 
     if ((keyCode == KeyEvent.KEYCODE_BACK)) { 
      stop.clearFocus(); 
     } 
     return super.onKeyDown(keyCode, event); 
    } 


    private void getLocationClient() { 
     if (locationClient == null) { 
      locationClient = new LocationClient(this, this, this); 
     } 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     setUpMapIfNeeded(); 
     if (servicesConnected()) { 
      getLocationClient(); 
      locationClient.connect(); 
     } 
    } 

    @Override 
    protected void onStop() { 
     locationClient.disconnect(); 
     super.onStop(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     currentLocation = new LatLng(location.getLatitude(), location.getLongitude()); 
     CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(currentLocation, 15); 
     googleMap.animateCamera(cameraUpdate); 
     locationManager.removeUpdates(this); 
    } 


    @Override 
    public void onStatusChanged(String s, int i, Bundle bundle) { 
     Log.d("Latitude", "status"); 
    } 

    public void onProviderEnabled(String provider) { 
     Log.d("Latitude", "enable"); 
    } 

    @Override 
    public void onProviderDisabled(String s) { 
     Log.d("Latitude", "disable"); 
    } 

    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.index, menu); 

     // Get the SearchView and set the searchable configuration 
     SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView(); 
     searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 

     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    private void setUpMapIfNeeded() { 
     if (googleMap == null) { 
      googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); 
     } 
    } 

    /* 
    * Define a request code to send to Google Play services 
    * This code is returned in Activity.onActivityResult 
    */ 

    public boolean servicesConnected() { 
     int errorCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); 
     if (errorCode != ConnectionResult.SUCCESS) { 
      GooglePlayServicesUtil.getErrorDialog(errorCode, this, 0).show(); 
      return false; 
     } 
     return true; 
    } 


    /* 
    * Called by Location Services when the request to connect the 
    * client finishes successfully. At this point, you can 
    * request the current location or start periodic updates 
    */ 
    @Override 
    public void onConnected(Bundle dataBundle) { 
     // Display the connection status 
     Toast.makeText(this, "Connected", Toast.LENGTH_SHORT).show(); 

    } 


    /* 
    * Called by Location Services if the connection to the 
    * location client drops because of an error. 
    */ 
    @Override 
    public void onDisconnected() { 
     // Display the connection status 
     Toast.makeText(this, "Disconnected. Please re-connect.", 
       Toast.LENGTH_SHORT).show(); 
    } 


    /* 
    * Called by Location Services if the attempt to 
    * Location Services fails. 
    */ 
    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     /* 
     * Google Play services can resolve some errors it detects. 
     * If the error has a resolution, try sending an Intent to 
     * start a Google Play services activity that can resolve 
     * error. 
     */ 
     if (connectionResult.hasResolution()) { 
      try { 
       // Start an Activity that tries to resolve the error 
       connectionResult.startResolutionForResult(this, CONNECTION_FAILURE_RESOLUTION_REQUEST); 
       /* 
       * Thrown if Google Play services canceled the original 
       * PendingIntent 
       */ 
      } catch (IntentSender.SendIntentException e) { 
       // Log the error 
       e.printStackTrace(); 
      } 
     } else { 
      /* 
      * If no resolution is available, display a dialog to the 
      * user with the error. 
      */ 
      Toast.makeText(getApplicationContext(), "Sorry. Location services not available.", Toast.LENGTH_LONG).show(); 
     } 
    } 


} 

searchableActivity.java

package com.connortlee.justspace; 

import android.app.ListActivity; 
import android.app.SearchManager; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 


public class SearchableActivity extends ListActivity { 

    private static final String LOG_TAG = "locationAlarm"; 

    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 = "AIzaSyAjtXXyZsECNNewDVAHKiN4QHIEZLWvW3g"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_index); 

     // Get the intent, verify the action and get the query 
     Intent intent = getIntent(); 
     if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 

      String query = intent.getStringExtra(SearchManager.QUERY); 
      doMySearch(query); 

     } 
    } 

    private void doMySearch(String query) { 

     Log.d("Event", query); 
    } 


} 

我還是很新的Android開發所以在正確的方向指針將是有益的。謝謝!

+0

我仍在試圖弄清楚這一點。我相信我需要一個內容提供者? – h20poloman 2014-09-21 01:31:17

回答

1

Windwaker的庫看起來非常適合Java端。如果您想嘗試一個爲Android提供GooglePlaceAutoComplete小部件的庫,您可以查看Sprockets(我是開發人員)。

使用您的Google API密鑰配置庫後,您可以將GooglePlaceAutoComplete元素添加到您的佈局。例如:

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

然後你就可以得到用戶選擇通過設置OnPlaceClickListenerPlace

public void onPlaceClick(AdapterView<?> parent, Prediction place, int position) { 
    /* do something with the Place */ 
} 
0

爲了這個目的,我實際上創建了一個Java庫。它基本上是Google Places API的封裝,功能齊全。爲了使用該庫,您必須擁有Google Places API密鑰。 (instructions

,您可以收到自動完成預測的,象這樣的庫:

GooglePlaces client = new GooglePlaces("YOUR_API_KEY_HERE"); 
List<Place> places = client.getQueryPredictions(query); 

或地名有:

List<Place> places = client.getPlacePrediction(placeName); 

確保你沒有在主線程上執行這些!

Library on GitHub

Documentation

希望這有助於!

相關問題