AutocompleteFragment 结果返回具有空属性的位置

Posted

技术标签:

【中文标题】AutocompleteFragment 结果返回具有空属性的位置【英文标题】:AutocompleteFragment results return a place with null attributes 【发布时间】:2019-07-09 11:59:31 【问题描述】:

我正在尝试使用导航抽屉和地图片段制作应用程序。我试图有一个自动完成片段,但是当我搜索一个地方时,我只收到 nameid 属性。 像这样:

I/PLACE: Placeaddress=null, attributions=[], id=ChIJVXealLU_xkcRja_At0z9AGY, latLng=null, name=Amsterdam, openingHours=null, phoneNumber=null, photoMetadatas=null, plusCode=null, priceLevel=null, rating=null, types=null, userRatingsTotal=null, viewport=null, websiteUri=null

这是我的 MapsFragment

public class MapsFragment extends Fragment implements OnMapReadyCallback, LocationListener 

MapView mapView;
GoogleMap nMap;

AutocompleteSupportFragment autocompleteFragment;
PlacesClient placesClient;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    final View rootView = inflater.inflate(R.layout.activity_maps, container, false);

    ...
    mapView = (MapView) rootView.findViewById(R.id.mapView);
    mapView.onCreate(savedInstanceState);
    mapView.getMapAsync(this);



@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) 
    super.onActivityResult(requestCode, resultCode, data);
    autocompleteFragment.onActivityResult(requestCode, resultCode, data);


...



@Override
public void onMapReady(GoogleMap googleMap) 
    Log.i("DEBUG", "onMapReady");

    nMap = googleMap;

    Context mContext = getActivity();
    if (mContext != null)
    Places.initialize(mContext, "*********MY API KEY*********");
    else
        Log.i("PLACE", "ERROR");
    

    placesClient = Places.createClient(getActivity());

    autocompleteFragment = (AutocompleteSupportFragment)
            getChildFragmentManager().findFragmentById(R.id.place_autocomplete_fragment);


    autocompleteFragment.setPlaceFields(Arrays.asList(Place.Field.ID, Place.Field.NAME));

    autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() 
        @Override
        public void onPlaceSelected(@NonNull Place place) 
            Log.i("PLACE", place.toString());
            // Define a Place ID.
            //nMap.moveCamera(CameraUpdateFactory.newLatLng(place.getLatLng()));
            //nMap.animateCamera(CameraUpdateFactory.newLatLngZoom(place.getLatLng(), 12.0f));
        

        @Override
        public void onError(@NonNull Status status) 
            Log.i("PLACE", status.toString());
        
    );

    autocompleteFragment.setUserVisibleHint(true);
    autocompleteFragment.setHint("Select your city");


    if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION)
            == PackageManager.PERMISSION_GRANTED) 
        nMap.setMyLocationEnabled(true);
     else 
        // Show rationale and request permission.
        Log.d(TAG, "error permission denied");
    

这是我的 map.xml

...
<fragment
    android:id="@+id/place_autocomplete_fragment"
    android:name="com.google.android.libraries.places.widget.AutocompleteSupportFragment"
    android:layout_
    android:layout_ />

<FrameLayout
    android:layout_
    android:layout_>

    <com.google.android.gms.maps.MapView
        android:id="@+id/mapView"
        android:layout_
        android:layout_ />
</FrameLayout>
...

我将我的 API KEY 放入代码(查看地图片段)、googles_maps_api.xml 以及 gradle.properties

PLACES_API_KEY="MY API KEY"

这是我对谷歌地图的依赖项

dependencies 
    ...
    implementation 'com.google.android.libraries.places:places:1.0.0'

我关注每个steps 来激活我的 API KEY

我也尝试使用 android 限制来保护我的 KEY,但没有任何改变

我的计费系统已启用。

【问题讨论】:

【参考方案1】:

你不允许在 setPlaceFields 中你想要什么。例如,我想要 latlang,所以我添加了 LAT_LNG。见下文。

 autocompleteFragment.setPlaceFields(Arrays.asList(Place.Field.ID, Place.Field.NAME,Place.Field.LAT_LNG));

【讨论】:

【参考方案2】:

如果您想使用 addressComponents 对象,您必须将 Place.Field.ADDRESS_COMPONENTS 添加到字段列表中。否则此对象将为空。

【讨论】:

【参考方案3】:

使用相同的:

List<Place.Field> fields = Arrays.asList(Place.Field.ID, Place.Field.NAME,Place.Field.ADDRESS,Place.Field.LAT_LNG);

但仍然给定 lat n lng 的空值,得到 i。

【讨论】:

以上是关于AutocompleteFragment 结果返回具有空属性的位置的主要内容,如果未能解决你的问题,请参考以下文章

阿里云调用 API 服务后返回啥结果

C#中如何获得一个MessageBox的返回结果

PDO 不返回任何结果,而 MySQL 命令行返回预期结果

postgresql 函数返回结果集(zz)

如何oracle function 返回结果集

setInterval如何在结束后返回执行结果?