2015-04-17 49 views
9

Tôi đã triển khai giao diện người dùng PlacePicker.IntentBuilder vào ứng dụng của mình. Đối với lâu nhất nó đã làm việc với không có vấn đề nhưng bây giờ ngay sau khi giao diện người dùng xuất hiện, nó đóng cửa và im không chắc chắn lý do tại sao. Điều điên rồ là nhìn vào logcat nó không sụp đổ hoặc gây ra bất kỳ trường hợp ngoại lệ vì vậy tôi không biết vấn đề là gì. Đây là lớp tạo và gọi nó.PlacePicker.IntentBuilder đóng ngay lập tức sau khi mở

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

} 

Đây là logcat khi tôi nhận được vào lớp này và nhấn nút gọi các 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 

Ai đó có thể vui lòng giúp tôi với điều này.

+0

bạn đã thử gỡ lỗi chưa? – Keshav1234

+0

Tôi đã thử gỡ lỗi và logcat nói cùng một thông tin –

+0

Atleast bạn có thể nói trong khi thực hiện ứng dụng phương pháp nào đóng? – Keshav1234

Trả lời

11

Tôi gặp sự cố tương tự. Đảm bảo bạn bật "API địa điểm cho Android" và không chỉ "API địa điểm" trong Developer Console. "API địa điểm cho Android" sẽ không hiển thị trong "API & Auth/APIs" bởi vì nó không phải là API phổ biến (chưa). Bạn sẽ phải tìm kiếm nó bằng cách sử dụng hộp tìm kiếm API.

+0

Tôi gặp vấn đề với PlacePicker.IntentBuilder() không thể giải quyết trong nhật thực. Bạn có thể giúp tôi được không? –

+0

Điều này làm việc cảm ơn bạn! –

+0

Đây là câu trả lời đúng cho tôi! Cảm ơn rất nhiều! – apmartin1991

3

Hãy thử thay đổi com.google.android.maps.v2.API_KEY thành com.google.android.geo.API_KEY trong AndroidManifest.xml.

Here là liên kết để biết thêm thông tin.

Các vấn đề liên quan