【问题标题】:migrating to Places API, cannot resolve GEO_DATA_API GeoDataApi迁移到 Places API,无法解析 GEO_DATA_API GeoDataApi
【发布时间】:2019-05-04 12:43:35
【问题描述】:

here 所述,我正在使用兼容性库完成从废弃的 Places SDK 迁移到 Places API 的过程。在尝试迁移之前,一切都运行良好。我已经

1) 更新了我的依赖项

2) 更改我的导入语句

3) Min SDK 已经 21 岁了

我收到两个(看似相关的)错误。 cannot find symbol variable GEO_DATA_APIcannot find symbol variable GeoDataApi

代码

googleApiClient = new GoogleApiClient.Builder(PlacesActivity.this)
            .addApi(Places.GEO_DATA_API)  //***HERE***
            .enableAutoManage(this, GOOGLE_API_CLIENT_ID, this)
            .addConnectionCallbacks(this)
            .build();

private ArrayList<PlaceAutocomplete> getPredictions(CharSequence constraint) {
    if (googleApiClient !=null) {
        PendingResult<AutocompletePredictionBuffer> results = Places.GeoDataApi.getAutocompletePredictions(  // ***AND HERE***
                googleApiClient,
                constraint.toString(),
                latLngBounds,
                autocompleteFilter
        );

        // Wait for predictions, set the timeout.
        AutocompletePredictionBuffer autocompletePredictions = results.await(60, TimeUnit.SECONDS);

        final Status status = autocompletePredictions.getStatus();
        if (!status.isSuccess()) {
            //auto complete fail
            autocompletePredictions.release();
            return null;
        }
        //auto complete success
        Iterator<AutocompletePrediction> iterator = autocompletePredictions.iterator();
        ArrayList<PlaceAutocomplete> resultList = new ArrayList<>(autocompletePredictions.getCount());
        while (iterator.hasNext()) {
            AutocompletePrediction prediction = iterator.next();
            resultList.add(new PlaceAutocomplete(prediction.getPlaceId(), prediction.getFullText(null)));
        }
        // Buffer release
        autocompletePredictions.release();
        return resultList;
    }
    return null;
}

【问题讨论】:

    标签: android google-places-api google-places googleplacesautocomplete


    【解决方案1】:

    需要完全重写代码。这是获取 lat、lng 和名称的工作代码(例如)

    public class MainActivity extends AppCompatActivity {
        String TAG = "placeautocomplete";
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        // Initialize Places.
        Places.initialize(getApplicationContext(), "YOUR_API_KEY");
        // Create a new Places client instance.
        PlacesClient placesClient = Places.createClient(this);
    
        // Initialize the AutocompleteSupportFragment.
        AutocompleteSupportFragment autocompleteFragment = (AutocompleteSupportFragment)
                getSupportFragmentManager().findFragmentById(R.id.autocomplete_fragment);
    
        // Specify the types of place data to return.
        autocompleteFragment.setPlaceFields(Arrays.asList(
             Place.Field.NAME,
             Place.Field.LAT_LNG
        ));
    
        // Set up a PlaceSelectionListener to handle the response.
        autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
            @Override
            public void onPlaceSelected(Place place) {
                // TODO: Get info about the selected place.
                String name = place.getName();
                double lat, lng;
                if (place.getLatLng() !=null){
                    lat =place.getLatLng().latitude;
                    lng =place.getLatLng().longitude;
                }
    
                //do something
            }
    
            @Override
            public void onError(Status status) {
                // TODO: Handle the error.
                Log.i(TAG, "An error occurred: " + status);
            }
        });
    }
    }
    

    示例 xml

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        >
        <android.support.v7.widget.CardView
            android:id="@+id/idCardView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            app:cardCornerRadius="4dp"
            >
            <fragment
                android:id="@+id/autocomplete_fragment"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:name="com.google.android.libraries.places.widget.AutocompleteSupportFragment"
                />
        </android.support.v7.widget.CardView>
    </LinearLayout>
    

    【讨论】:

    • 当我们使用地理编码时,如何通过地点 API 获取地址组件,例如州、城市、引脚?
    【解决方案2】:

    问题1:找不到符号变量GEO_DATA_API

    解决方案 1: 首先让我们了解 Places.GEO_DATA_API 的用法

    它说“Geo Data API 提供了通过地点 ID 获取地点信息、按名称或地址自动完成用户搜索查询以及将新地点添加到 Google 地点数据库的访问权限。”

    来源 (https://developers.google.com/android/reference/com/google/android/gms/location/places/GeoDataApi)

    因此,如果我们想从地点 id 获取地点信息,那么我们必须 使用下面的代码:

    // Define a Place ID.
    String placeId = "INSERT_PLACE_ID_HERE";
    
    // Specify the fields to return (in this example all fields are returned).
    List<Place.Field> placeFields = Arrays.asList(Place.Field.ID, Place.Field.NAME);
    
    // Construct a request object, passing the place ID and fields array.
    FetchPlaceRequest request = FetchPlaceRequest.builder(placeId, placeFields).build();
    
    placesClient.fetchPlace(request).addOnSuccessListener((response) -> {
        Place place = response.getPlace();
        Log.i(TAG, "Place found: " + place.getName());
    }).addOnFailureListener((exception) -> {
        if (exception instanceof ApiException) {
            ApiException apiException = (ApiException) exception;
            int statusCode = apiException.getStatusCode();
            // Handle error with given status code.
            Log.e(TAG, "Place not found: " + exception.getMessage());
        }
    });
    

    问题2:找不到符号变量GeoDataApi

    解决方案 2: 作为新地点 api 指示“使用 findAutocompletePredictions() 返回地点预测以响应用户搜索查询。findAutocompletePredictions() 的功能类似于 getAutocompletePredictions()。”

    来源 (https://developers.google.com/places/android-sdk/client-migration)

    因此,我们可以使用以下代码来获得自动完成预测:

    // Create a new token for the autocomplete session. Pass this to FindAutocompletePredictionsRequest,
    // and once again when the user makes a selection (for example when calling fetchPlace()).
    AutocompleteSessionToken token = AutocompleteSessionToken.newInstance();
    // Create a RectangularBounds object.
    RectangularBounds bounds = RectangularBounds.newInstance(
      new LatLng(-33.880490, 151.184363),
      new LatLng(-33.858754, 151.229596));
    // Use the builder to create a FindAutocompletePredictionsRequest.
    FindAutocompletePredictionsRequest request = FindAutocompletePredictionsRequest.builder()
    // Call either setLocationBias() OR setLocationRestriction().
       .setLocationBias(bounds)
       //.setLocationRestriction(bounds)
       .setCountry("au")
       .setTypeFilter(TypeFilter.ADDRESS)
       .setSessionToken(token)
       .setQuery(query)
       .build();
    
    placesClient.findAutocompletePredictions(request).addOnSuccessListener((response) -> {
       for (AutocompletePrediction prediction : response.getAutocompletePredictions()) {
           Log.i(TAG, prediction.getPlaceId());
           Log.i(TAG, prediction.getPrimaryText(null).toString());
       }
    }).addOnFailureListener((exception) -> {
       if (exception instanceof ApiException) {
           ApiException apiException = (ApiException) exception;
           Log.e(TAG, "Place not found: " + apiException.getStatusCode());
       }
    });
    

    【讨论】:

      【解决方案3】:
      1. 将 GoogleApiClient 替换为 GeoDataClient

        mGoogleApiClient = Places.getGeoDataClient(this, null);

      2. 将 AutocompletePredictionBuffer 替换为 AutocompletePredictionBufferResponse

      private ArrayList getAutocomplete(CharSequence 约束) {

          if (mGoogleApiClient != null) {
              // Submit the query to the autocomplete API and retrieve a PendingResult that will
              // contain the results when the query completes.
              Task<AutocompletePredictionBufferResponse> results = mGoogleApiClient.getAutocompletePredictions(constraint.toString(), null, mPlaceFilter);
      
                  // This method should have been called off the main UI thread. Block and wait for at most 60s
                  // for a result from the API.
                  try {
                      Tasks.await(results, 60, TimeUnit.SECONDS);
                  } catch (ExecutionException | InterruptedException | TimeoutException e) {
                      Utils.handleException(e);
                  }
      
                  AutocompletePredictionBufferResponse autocompletePredictions = results.getResult();
      
                  // Freeze the results immutable representation that can be stored safely.
                  return DataBufferUtils.freezeAndClose(autocompletePredictions);
              }
              return null;
          }
      

      【讨论】:

        猜你喜欢
        • 2019-03-23
        • 1970-01-01
        • 2023-03-03
        • 2019-01-18
        • 2019-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多