2015-04-17 17 views
9

Ho implementato l'interfaccia utente di PlacePicker.IntentBuilder nella mia applicazione. Per il più lungo ha funzionato senza problemi ma ora non appena l'interfaccia utente appare, si chiude e non sono sicuro del perché. La cosa pazza è guardare il logcat che non si blocca o causare eccezioni, quindi non so quale sia il problema. Questa è la classe che crea e chiama.PlacePicker.IntentBuilder si chiude immediatamente dopo l'apertura

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

} 

Questa è la logcat quando arrivo a questa classe e si preme il pulsante delle chiamate del 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: [email protected] time:4496690 
04-16 21:19:24.973 7650-7650/com.example.apthagreat.faf V/ActivityThread﹕ updateVisibility : ActivityRecord{26aa4d14 [email protected] {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: [email protected] time:4500135 

favore qualcuno può aiutare con questo.

+0

hai provato il debug? – Keshav1234

+0

Ho provato il debug e il logcat dice le stesse informazioni –

+0

Atleast puoi dirlo mentre l'esecuzione di quale metodo si chiude? – Keshav1234

risposta

11

Avevo lo stesso problema. Assicurati di abilitare "Places API per Android" e non solo "Places API" nello Developer Console. "Places API per Android" non verrà visualizzato sotto "API & Auth/API" perché non è ancora un'API popolare. Dovrai cercarlo usando la casella di ricerca API.

+0

Ho problemi con PlacePicker.IntentBuilder() non può risolvere in eclissi. Mi potete aiutare? –

+0

Questo ha funzionato grazie! –

+0

Questa è stata la risposta giusta per me! Grazie mille! – apmartin1991

3

Provare a cambiare com.google.android.maps.v2.API_KEY a com.google.android.geo.API_KEY nel AndroidManifest.xml.

Here è un collegamento a ulteriori informazioni.

Problemi correlati