PlacePicker.IntentBuilder开盘后立即关闭 [英] PlacePicker.IntentBuilder closes immediately after opening

查看:559
本文介绍了PlacePicker.IntentBuilder开盘后立即关闭的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我实现了PlacePicker.IntentBuilder UI到我的应用程序。在很长的,它的工作没有问题,但现在只要用户界面出现后,它会关闭和IM不知道为什么。疯狂的事是在看logcat的它不会崩溃或导致任何异常,所以我不知道问题是什么。这是一个创建并调用它的类。

I implemented the PlacePicker.IntentBuilder UI into my application. For the longest it worked with no problem but now as soon as the UI appears, it closes and im not sure why. The crazy thing is looking at the logcat it doesn't crash or cause any exceptions so I don't know what the issue is. This is the class that creates and calls it.

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的,当我到达这个阶级和preSS的按钮,呼叫PlacePlace.IntentBuilder

This is the logcat when I get to this class and press the button the calls the 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

是否有人可以帮助我。

推荐答案

我有同样的问题。请确保您启用的地方为Android API并不仅仅是的地方API中的开发者控制台。因为它不是一个受欢迎的API(还); 为Android API的地方将不会在认证/ API的原料药及放出现。你将不得不使用API​​的搜索框进行搜索。

I was having the same issue. Make sure you enable "Places API for Android" and not just "Places API" in the Developer Console. "Places API for Android" will not show up under "APIs & Auth/APIs" because it isnt a popular API (yet). You will have to search for it using the API search box.

这篇关于PlacePicker.IntentBuilder开盘后立即关闭的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆