我将PlacePicker.IntentBuilder UI实现到我的应用程序中。对于最长的它没有问题,但现在一旦UI出现,它关闭,我不知道为什么。疯狂的事情是看它没有崩溃或导致任何例外的logcat所以我不知道问题是什么。这是创建和调用它的类。
package com.example.apthagreat.faf;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import com.google.android.gms.common.GooglePlayServicesRepairableException;
import com.google.android.gms.location.places.Place;
import com.google.android.gms.location.places.ui.PlacePicker;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.LatLngBounds;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
public class DetermineSearchCoordinatesScreen extends ActionBarActivity
{
//Instance Variables
int PLACE_PICKER_REQUEST = 1;
int SELECTED_PLACE_REQUEST = 2;
LatLng southWestBounds;
LatLng northEastBounds;
String zipCodeString;
String zipCodeURL;
String user;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_determine_search_coordinates_screen);
final EditText zipCode = (EditText) findViewById(R.id.enterZip);
final Button findZip = (Button) findViewById(R.id.findZipButton);
user = getIntent().getExtras().getString("username");
//Find button is used when user enters a zip code and not the device's GPS
findZip.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if (findZip.getText().equals("FIND!"))
{
//build the URL to be passed to determine coordinates for given zip code
zipCodeURL = "http://maps.googleapis.com/maps/api/geocode/json?address=";
zipCodeString = zipCode.getText().toString();
if (zipCodeString.length() == 5)
{
//Fetch to go get GPS coordinates for zip code
zipCodeURL += zipCodeString;
GetZipCoordinates task = new GetZipCoordinates(southWestBounds, northEastBounds);
task.execute(zipCodeURL);
findZip.setText("PUSH TO SEE PLACES");
}
else
{
Toast.makeText(getApplicationContext(), "Must enter a valid 5 digit zip code", Toast.LENGTH_SHORT).show();
}
}
else if (findZip.getText().equals("PUSH TO SEE PLACES"))
{
//AsyncTask was successful in finding coordinates and now we can pass the coordinates in and display places to user
PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder();
LatLngBounds llb = new LatLngBounds(southWestBounds, northEastBounds);
builder.setLatLngBounds(llb);
findZip.setText("FIND!");
try
{
startActivityForResult(builder.build(DetermineSearchCoordinatesScreen.this), PLACE_PICKER_REQUEST);
}
catch (GooglePlayServicesRepairableException e)
{
e.printStackTrace();
}
catch (GooglePlayServicesNotAvailableException e)
{
e.printStackTrace();
}
catch(NullPointerException npe)
{
Toast.makeText(getBaseContext(),"Retrieval of coordinates is not yet complete! Try Again.", Toast.LENGTH_LONG).show();
}
}
}
});
//Here we will use the device's GPS coordinates and display nearby places
Button currentSpot = (Button) findViewById(R.id.currentLocationButton);
currentSpot.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder();
try
{
startActivityForResult(builder.build(DetermineSearchCoordinatesScreen.this), PLACE_PICKER_REQUEST);
}
catch (GooglePlayServicesRepairableException e)
{
e.printStackTrace();
}
catch (GooglePlayServicesNotAvailableException e)
{
e.printStackTrace();
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_search_category_location_screen, menu);
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();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings)
{
return true;
}
return super.onOptionsItemSelected(item);
}
public void setNorthEastBounds(LatLng northEastBounds)
{
this.northEastBounds = northEastBounds;
}
public void setSouthWestBounds(LatLng southWestBounds)
{
this.southWestBounds = southWestBounds;
}
/*
Once the user selects a place, a dialog will appear prompting the user if they would like
to create an activity at this place
*/
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (requestCode == PLACE_PICKER_REQUEST)
{
if (resultCode == RESULT_OK)
{
//The place the user selected
final Place place = PlacePicker.getPlace(data, this);
//The dialog that will prompt the user to create an activity when a place is selected
AlertDialog.Builder createActivity = new AlertDialog.Builder(this);
createActivity.setMessage("Would you like to create an activity at this location?");
createActivity.setPositiveButton("YES", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
//Here the user will be directed to the create activity screen and the name and address of selected place will be passed along with it
Intent create = new Intent(getApplicationContext(), CreateActivityScreen.class);
create.putExtra("username", user);
create.putExtra("placeName", place.getName());
create.putExtra("placeAddress", place.getAddress());
startActivityForResult(create, SELECTED_PLACE_REQUEST);
finish();
}
});
createActivity.setNegativeButton("NO", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
//If the user doesn't want to create an activity nothing will happen
}
});
createActivity.show();
}
}
}
/*
The class that is taking the URL and fetching to the internet to find
the GPS coordinates for the user given zip code.
Parses the data into a JSON object and converts it into Latitude and Longitude
coordinates.
The coordinates are given in the form of the Southwest bound coordinates and
Northeast bound coordinates around the zip code.
*/
private class GetZipCoordinates extends AsyncTask<String, Void, String>
{
LatLng sw;
LatLng ne;
public GetZipCoordinates(LatLng sw, LatLng ne)
{
this.sw = sw;
this.ne = ne;
}
@Override
protected String doInBackground(String... placesURL)
{
//fetch places
StringBuilder placesBuilder = new StringBuilder();
//process search parameter string(s)
for (String placeSearchURL : placesURL)
{
//execute search
HttpClient placesClient = new DefaultHttpClient();
try
{
//try to fetch the data
HttpGet placesGet = new HttpGet(placeSearchURL);
HttpResponse placesResponse = placesClient.execute(placesGet);
StatusLine placeSearchStatus = placesResponse.getStatusLine();
//System.err.println(placeSearchStatus);
if (placeSearchStatus.getStatusCode() == 200)
{
//we have an OK response
HttpEntity placesEntity = placesResponse.getEntity();
InputStream placesContent = placesEntity.getContent();
InputStreamReader placesInput = new InputStreamReader(placesContent);
BufferedReader placesReader = new BufferedReader(placesInput);
String lineIn;
while ((lineIn = placesReader.readLine()) != null)
{
placesBuilder.append(lineIn);
}
}
}
catch (Exception e)
{
System.err.println("The website is never executed");
}
}
return placesBuilder.toString();
}
//Take the results from the URL, separate it, and get the Southwest and Northeast bound coordinates
protected void onPostExecute(String result)
{
LatLng SWBounds = null;
LatLng NEBounds = null;
try
{
JSONObject resultObject = new JSONObject(result);
JSONArray placesArray = resultObject.getJSONArray("results");
try
{
JSONObject placeObject = placesArray.getJSONObject(0);
JSONObject southWestLoc = placeObject.getJSONObject("geometry").getJSONObject("bounds").getJSONObject("southwest");
JSONObject northEastLoc = placeObject.getJSONObject("geometry").getJSONObject("bounds").getJSONObject("northeast");
SWBounds = new LatLng(Double.valueOf(southWestLoc.getString("lat")), Double.valueOf(southWestLoc.getString("lng")));
NEBounds = new LatLng(Double.valueOf(northEastLoc.getString("lat")), Double.valueOf(northEastLoc.getString("lng")));
setSouthWestBounds(SWBounds);
setNorthEastBounds(NEBounds);
}
catch (JSONException jse)
{
System.err.println("The bounds were not computed");
}
}
catch (Exception e)
{
System.err.println("The JSON object was never read");
}
}
}
@Override
public void onPause()
{
super.onPause();
//Blank the URL after the Map is displayed
zipCodeURL = null;
}
@Override
public void onResume()
{
super.onResume();
//For safe measures, set to blank when activity reappears
zipCodeURL = "";
}
}
这是logcat,当我到达这个类并按下按钮调用PlacePlace.IntentBuilder
04-16 21:19:24.513 7650-7650/com.example.apthagreat.faf D/Activity﹕ performCreate Call debug elastic valuetrue
04-16 21:19:24.683 7650-7671/com.example.apthagreat.faf D/OpenGLRenderer﹕ endAllStagingAnimators on 0x9d2dd000 (RippleDrawable) with handle 0xb4ad4d60
04-16 21:19:24.703 7650-7650/com.example.apthagreat.faf I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@24ce418b time:4496690
04-16 21:19:24.973 7650-7650/com.example.apthagreat.faf V/ActivityThread﹕ updateVisibility : ActivityRecord{26aa4d14 token=android.os.BinderProxy@1b7217fa {com.example.apthagreat.faf/com.example.apthagreat.faf.ActivityListScreen}} show : false
04-16 21:19:26.633 7650-7650/com.example.apthagreat.faf D/ViewRootImpl﹕ ViewPostImeInputStage ACTION_DOWN
04-16 21:19:26.813 7650-7671/com.example.apthagreat.faf D/OpenGLRenderer﹕ endAllStagingAnimators on 0x9d2e9600 (RippleDrawable) with handle 0x9f64add0
04-16 21:19:27.543 7650-7650/com.example.apthagreat.faf W/IInputConnectionWrapper﹕ showStatusIcon on inactive InputConnection
04-16 21:19:28.143 7650-7650/com.example.apthagreat.faf I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@24ce418b time:4500135
有人可以帮我解决这个问题吗。
答案 0 :(得分:12)
我遇到了同样的问题。请务必在Developer Console中启用“Places API for Android”,而不仅仅是“Places API”。 “Places API for Android”不会显示在“API&amp; Auth / API”下,因为它还不是一个受欢迎的API。您必须使用API搜索框搜索它。
答案 1 :(得分:3)
尝试将com.google.android.maps.v2.API_KEY
更改为com.google.android.geo.API_KEY
中的AndroidManifest.xml
。
Here是指向更多信息的链接。
答案 2 :(得分:1)
经历那些:
答案 3 :(得分:1)
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/key_google_map"/>
确保已在清单文件中定义。