PlacePicker.IntentBuilder在打开后立即关闭

时间:2015-04-17 01:23:16

标签: android user-interface android-intent

我将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

有人可以帮我解决这个问题吗。

4 个答案:

答案 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)

经历那些:

  1. 检查 Google developer console 以检查是否已启用“ 用于Android的Place SDK
  2. 添加已启用API的凭据。使用您的软件包名称和SHA1键。
  3. 检查AndroidManifest文件是否已添加API密钥,元标记和权限

答案 3 :(得分:1)

<meta-data
    android:name="com.google.android.geo.API_KEY"
    android:value="@string/key_google_map"/>

确保已在清单文件中定义。