2016-10-10 6 views
1

Я пытаюсь создать PlacePicker для своего приложения Google Maps и нашел для вас приятное руководство. Руководство не ужасно устарело, поэтому я не ожидал, что он будет использовать любые устаревшие функции. Как оказалось, это так, и я немного смущен тем, как справиться с этой проблемой, но я все еще новичок в Android Development.IntentBuilder не распознан в Android Studio (Google PlacePicker)

Я раньше не использовал IntentBuilder, поэтому я не уверен, что он даже используется правильно. Кажется, что Android просто не знает, что это такое, поскольку предлагаемое решение делает его классом.

Вот соответствующий код:

import android.app.Activity; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.location.Location; 
import android.os.Build; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.app.FragmentActivity; 
import android.os.Bundle; 
import android.support.v4.content.ContextCompat; 
import android.view.View; 
import android.view.ViewTreeObserver; 
import android.widget.Button; 
import android.widget.Toast; 

import com.firebase.client.ChildEventListener; 
import com.firebase.client.DataSnapshot; 
import com.firebase.client.Firebase; 
import com.firebase.client.FirebaseError; 
import com.firebase.client.ServerValue; 
import com.google.android.gms.common.GoogleApiAvailability; 
import com.google.android.gms.common.GooglePlayServicesNotAvailableException; 
import com.google.android.gms.common.GooglePlayServicesRepairableException; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.common.api.ResultCallback; 
import com.google.android.gms.location.places.Place; 
import com.google.android.gms.location.places.PlaceBuffer; 
import com.google.android.gms.location.places.Places; 
import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.OnMapReadyCallback; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.LatLngBounds; 
import com.google.android.gms.maps.model.MarkerOptions; 

import java.util.HashMap; 
import java.util.Map; 

public class PlacePicker extends FragmentActivity implements OnMapReadyCallback, ChildEventListener { 

private GoogleMap mMap; 
private GoogleApiClient mGoogleApiClient; 
private LatLngBounds.Builder mBounds = new LatLngBounds.Builder(); 
private static final int REQUEST_PLACE_PICKER = 1; 
public static final int REQUEST_ID_ACCESS_COURSE_FINE_LOCATION = 100; 

private static final String FIREBASE_URL = "MYURL"; 
private static final String FIREBASE_ROOT_NODE = "checkouts"; 

private Firebase mFirebase; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_place_picker); 
    // Obtain the SupportMapFragment and get notified when the map is ready to be used. 
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
      .findFragmentById(R.id.map); 
    mapFragment.getMapAsync(this); 

    // Set up the API client for Places API 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addApi(Places.GEO_DATA_API) 
      .build(); 
    mGoogleApiClient.connect(); 

    final Button button = (Button) findViewById(R.id.checkout_button); 
    button.getViewTreeObserver().addOnGlobalLayoutListener(
      new ViewTreeObserver.OnGlobalLayoutListener() { 
       @Override 
       public void onGlobalLayout() { 
        mMap.setPadding(0, button.getHeight(), 0, 0); 
       } 
      } 
    ); 

    Firebase.setAndroidContext(this); 
    mFirebase = new Firebase(FIREBASE_URL); 
    mFirebase.child(FIREBASE_ROOT_NODE).addChildEventListener(this); 


} 

public void checkOut(View view) { 
    try { 
     PlacePicker.IntentBuilder intentBuilder = new PlacePicker.IntentBuilder(); 
     Intent intent = intentBuilder.build(this); 
     startActivityForResult(intent, REQUEST_PLACE_PICKER); 
    } catch (GooglePlayServicesRepairableException e) { 
     GoogleApiAvailability.getInstance().getErrorDialog(this, e.getConnectionStatusCode(), 
       REQUEST_PLACE_PICKER); 
    } catch (GooglePlayServicesNotAvailableException e) { 
     Toast.makeText(this, "Please install Google Play Services!", Toast.LENGTH_LONG).show(); 
    } 
} 

private void addPointToViewPort(LatLng newPoint) { 
    mBounds.include(newPoint); 
    mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(mBounds.build(), 
      findViewById(R.id.checkout_button).getHeight())); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_PLACE_PICKER) { 
     if (resultCode == Activity.RESULT_OK) { 
      Place place = PlacePicker.getPlace(data, this); 

      Map<String, Object> checkoutData = new HashMap<>(); 
      checkoutData.put("time", ServerValue.TIMESTAMP); 

      mFirebase.child(FIREBASE_ROOT_NODE).child(place.getId()).setValue(checkoutData); 

     } else if (resultCode == PlacePicker.RESULT_ERROR) { 
      Toast.makeText(this, "Places API failure! Check the API is enabled for your key", 
        Toast.LENGTH_LONG).show(); 
     } 
    } else { 
     super.onActivityResult(requestCode, resultCode, data); 
    } 
} 

@Override 
public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
    String placeId = dataSnapshot.getKey(); 
    if (placeId != null) { 
     Places.GeoDataApi 
       .getPlaceById(mGoogleApiClient, placeId) 
       .setResultCallback(new ResultCallback<PlaceBuffer>() { 
             @Override 
             public void onResult(PlaceBuffer places) { 
              LatLng location = places.get(0).getLatLng(); 
              addPointToViewPort(location); 
              mMap.addMarker(new MarkerOptions().position(location)); 
              places.release(); 
             } 
            } 
       ); 
    } 
} 
public void onMapReady(GoogleMap googleMap) { 
    mMap = googleMap; 


    if (Build.VERSION.SDK_INT >= 23) { 
     int accessCoarsePermission 
       = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION); 
     int accessFinePermission 
       = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION); 


     if (accessCoarsePermission != PackageManager.PERMISSION_GRANTED 
       || accessFinePermission != PackageManager.PERMISSION_GRANTED) { 
      // The Permissions to ask user. 
      String[] permissions = new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION, 
        android.Manifest.permission.ACCESS_FINE_LOCATION}; 
      // Show a dialog asking the user to allow the above permissions. 
      ActivityCompat.requestPermissions(this, permissions, 
        REQUEST_ID_ACCESS_COURSE_FINE_LOCATION); 

      return; 
     } 
    } 
    mMap.setMyLocationEnabled(true); 
    mMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() { 
     @Override 
     public void onMyLocationChange(Location location) { 
      LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); 
      addPointToViewPort(ll); 
      // we only want to grab the location once, to allow the user to pan and zoom freely. 
      mMap.setOnMyLocationChangeListener(null); 
     } 
    }); 
    // Add a marker in Sydney and move the camera 

} 

Также getPlace и RESULT_ERROR красный как хорошо, и непризнанный Android Studio здесь.

Я не уверен, могу ли я опубликовать ссылку на руководство, о котором идет речь, поэтому я буду публиковать сообщения только в том случае, если вас попросят.

Я все еще довольно новичок в Android Studio, поэтому вся помощь очень ценится!

+0

вы добавили импорт? 'import com.google.android.gms.location.places.ui.PlacePicker;' – antonio

+0

@antonio, этот конкретный импорт также не recoqnized, но я добавил все нормальные места импорта. Я отреагировал свой ответ на импорт. –

+0

В зависимости от используемой вами версии сервисов Google Play вам может потребоваться внести изменения в ваше приложение для [новой модели разрешений] (https://developer.android.com/training/permissions/index.html) , Как указано в [Разрешения на выбор места размещения] (https://developers.google.com/places/android-api/placepicker#permissions) при условии, что вы используете версию 8.1 или более позднюю версию служб Google Play, вы можете настроить свою приложение для установки на Android 6.0 Marshmallow SDK и использование новой модели разрешений. – Teyam

ответ

0

пожалуйста, добавьте в ваших зависимостей в вашем файле app.gradle

compile 'com.google.android.gms:play-services-places:9.2.0' 
+0

У меня уже есть 9.4.0 в зависимостях, я должен использовать 9.2.0? Был ли IntentBuilder устарел? –

+0

необходимо добавить библиотеки мест с 9.2.0 и изменить это, если у вас его в коде import com.google.android.gms.location.places; - import com.google.android.gms.location.places.Place; – zombie

+0

попытался перейти от библиотеки 9.4.0 к библиотеке 9.2.0 мест, и я все равно получаю ту же ошибку. –