- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在我的应用程序中实现了 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 = "";
}
}
这是我进入此类并按下调用 PlacePlace.IntentBuilder 的按钮时的 logcat
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
谁能帮我解决这个问题。
最佳答案
我遇到了同样的问题。确保在 Developer Console 中启用“Android 版 Places API” 而不仅仅是 “Places API” . “Places API for Android” 不会出现在“APIs & Auth/APIs”下,因为它还不是一个流行的 API(目前)。您必须使用 API 搜索框进行搜索。
关于android - PlacePicker.IntentBuilder 打开后立即关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29688642/
非常烦人,我的 google place 只有在用户双击时才能工作。 为什么会这样? 我的代码,地点选择器初始化的地方 etLocationD.setOnClickListener(new View.
Android Placepicker is deprecated since last month .我如何使用"new"谷歌地图平台 (API) 获取或构建一个简单的经纬度坐标(地点)选择器? 最
我想更改下图中突出显示的标题语言 我怎样才能做到这一点? 最佳答案 就像许多其他 Google 应用程序一样,这些字符串会自动翻译成用户语言。我目前正在使用 PlacePicker 开发一个应用程序,
我在我的 Android 应用程序中使用 Google PlacePicker。我可以用它来选择地址。但是,一旦选择了地址,它就不会返回到调用者 Activity 。相反,我必须按下后退按钮! 这是我
我注意到随着 xcode 9 的更新,在呈现 Google Place Picker 时会弹出运行时警告消息: UI API called from background thread present
Places SDK 错误:Error Domain=com.google.places.ErrorDomain Code=-3 “Places SDK 库中发生内部错误。如果您认为此错误代表错误,请
我正在使用 google play-services version 9.4.0 我正在使用 PlaceAutocomplete with overlay mode .但现在它有这个奇怪的重叠问题。
我在我的应用程序中实现了 PlacePicker.IntentBuilder UI。在最长的时间内它没有问题,但现在一旦 UI 出现,它就会关闭,我不确定为什么。疯狂的事情是查看 logcat 它不会
我正在尝试开发基于 google place API 的应用程序。当我尝试使用时 Place place=PlacePicker.getPlace(data,this); 有一个错误显示 getPla
我正在开发一个 Android 应用程序,并正在研究 Google Places 以了解该应用程序中的某些功能。 Google 最近发布了我正在使用的 PlacePicker 功能。我已遵循 Goog
我正在尝试从属于我的 Android 应用程序的 fragment 中使用 google placepicker。我似乎无法使用 onActivityResult 返回的数据。我使用了 ( https
我使用地点选择器 API 获取了用户当前位置。现在我想在我的 Activity 中显示用户选择的位置。下面是我的代码: public class StoreFinder extends AppComp
我已经安装了 pod 但现在我想再添加一个 pod 'GMSPlacePickerController' ,过去我已经更改了我的项目名称所以每当我尝试安装 pod 时有时找不到 pod 文件,有时会发
很遗憾,我无法在 Android Place Picker closes immediately after launch 找到答案.对我来说,PlacePicker 启动,将位置显示为未知,然后返回
我正在使用 Google Play 服务中的 PlacePicker 库来启动新 Activity 。新的 Activity/选择器有一个默认没有样式的工具栏(actionbar)。 PlacePic
我想从 Android PlacePicker API 中删除确认对话框,这可能吗? 最佳答案 目前无法在地点选取器中禁用确认步骤。 关于Android PlacePicker API IntentB
这是我试过的代码,但是当用户没有选择任何东西而只是返回时, Activity 不会调用 onActivityResult() 方法 我将 PlacePIcker 称为 googleMap.setOnM
基于 Google API 的应用程序。当我尝试使用 Place place = PlacePicker.getPlace(this, data) 出现错误显示: cannot resolve met
在我的项目中,PlacePicker 运行良好,但今天突然在启动后立即关闭,结果代码为 2。 这是 logcat 输出 07-06 16:06:36.596 1023-20519/? W/Plac
我的应用程序使用 google maps api 和 google places api。一切正常,直到我搜索某个地方,当我搜索一个地方然后从结果中选择它时,会出现一个对话框(不应显示)并提示用户是否
我是一名优秀的程序员,十分优秀!