SearchView Автозаполнение предложений с помощью Google PLACES Api - PullRequest
1 голос
/ 26 марта 2020
@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);

        this.menu = menu;

        MenuItem menuItem = menu.findItem(R.id.action_search);
        menuItem.setIcon(ColorHelper.tintDrawable(
                ResourcesCompat.getDrawable(getResources(), R.drawable.ic_search_black_24dp, null),
                ContextCompat.getColor(this, R.color.colorPrimary))
        );

        SearchManager searchManager =
                (SearchManager) getSystemService(Context.SEARCH_SERVICE);

        final CustomSearchView searchView = (CustomSearchView) MenuItemCompat.getActionView(menuItem);
        searchView.setActivity(this);

        CustomSearchView.SearchAutoComplete textArea = searchView.findViewById(R.id.search_src_text);
        searchView.setSearchableInfo(
                searchManager.getSearchableInfo(getComponentName()));

        searchView.setSuggestionsAdapter(searchCursorAdapter);

        searchView.setOnSuggestionListener(new CustomSearchView.OnSuggestionListener() {
            @Override
            public boolean onSuggestionClick(int position) {
                CursorAdapter ca = searchView.getSuggestionsAdapter();
                Cursor cursor = ca.getCursor();
                cursor.moveToPosition(position);

                String placeId = cursor.getString(cursor.getColumnIndex(SearchCursorAdapter.SUGGESTION_ID));
                if (placeId.equals("notPlaceId")) return true;

                loadingDialog.show();
                placesClient.fetchPlace(FetchPlaceRequest.newInstance(placeId,fields))
                        .addOnSuccessListener(new OnSuccessListener<FetchPlaceResponse>() {
                    @Override
                    public void onSuccess(FetchPlaceResponse fetchPlaceResponse) {
                        Log.i("PLACE: ",fetchPlaceResponse.getPlace().toString());
                        mapFragment.setFoundPlace(
                                fetchPlaceResponse.getPlace().getLatLng(),
                                fetchPlaceResponse.getPlace().getName(),
                                fetchPlaceResponse.getPlace().getId());
                    }
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {

                    }
                });
//                placesClient.getPlaceById(mGoogleApiClient, placeId)
//                        .setResultCallback(new ResultCallback<PlaceBuffer>() {
//                            @Override
//                            public void onResult(PlaceBuffer places) {
//                                loadingDialog.dismiss();
//                                if (places.getStatus().isSuccess() && places.getCount() > 0) {
//                                    final Place myPlace = places.get(0);
//                                    Log.i(TAG, "Place found: " + myPlace.getName());
//                                    mapFragment.setFoundPlace(myPlace.getLatLng(), myPlace.getName(), myPlace.getId());
//                                } else {
//                                    Log.e(TAG, "Place not found");
//                                }
//                                places.release();
//                            }
//                        });

                return true;
            }

            @Override
            public boolean onSuggestionSelect(int position) {
                return true;
            }
        });
        searchView.setOnQueryTextListener(new CustomSearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                ViewHelper.hideSoftInput(MapsActivity.this);
                return true;
            }

            @Override
            public boolean onQueryTextChange(final String suggest) {

                if ((suggest.length() > 1) && mGoogleApiClient.isConnected()) {
                    Log.i(TAG, "Starting autocomplete query for: " + suggest);

                    Cursor cursor = searchCursorAdapter.getCursor();
                    if ((cursor == null) || (cursor.moveToFirst() && (cursor.getInt(cursor.getColumnIndex(BaseColumns._ID)) == -1))) {
                        MatrixCursor matrixCursor = new MatrixCursor(new String[]{BaseColumns._ID, SearchCursorAdapter.SUGGESTION_ID});
                        matrixCursor.addRow(new Object[]{-2, getString(R.string.no_place_id)});


                        searchCursorAdapter.changeCursor(matrixCursor);
                        searchCursorAdapter.notifyDataSetChanged();
                    }
                    else {

                        AutocompleteSessionToken token = AutocompleteSessionToken.newInstance();
                        RectangularBounds bounds = RectangularBounds.newInstance(WORLD_BOUNDS);

                        final FindAutocompletePredictionsRequest request =
                                FindAutocompletePredictionsRequest
                                        .builder()
                                        .setCountry("KE")
                                        .setLocationBias(bounds)
                                        .setTypeFilter(TypeFilter.ADDRESS)
                                        .setSessionToken(token)
                                        .setQuery(suggest)
                                        .build();

                        Log.i("REQUEST",request.toString());

                        placesClient.findAutocompletePredictions(request)
                                .addOnSuccessListener(new OnSuccessListener<FindAutocompletePredictionsResponse>() {

                            @Override
                            public void onSuccess(FindAutocompletePredictionsResponse findAutocompletePredictionsResponse) {
                                for (AutocompletePrediction prediction : findAutocompletePredictionsResponse.getAutocompletePredictions()) {
                                    Log.i(TAG, prediction.getPlaceId());
                                    Log.i(TAG, prediction.getPrimaryText(null).toString());
                                }

                                List<AutocompletePrediction> predictions = findAutocompletePredictionsResponse.getAutocompletePredictions();
                                MatrixCursor matrixCursor = new MatrixCursor(new String[]{BaseColumns._ID, SearchCursorAdapter.SUGGESTION_ID, SearchCursorAdapter.SUGGESTION_NAME, SearchCursorAdapter.SUGGESTION_EXTRA, SearchCursorAdapter.QUERY});

                                if (predictions.size() > 0) {
                                    for (int i = 0; i < predictions.size(); i++) {
                                        AutocompletePrediction prediction = predictions.get(i);
                                        CharacterStyle style = new StyleSpan(Typeface.NORMAL);
                                        Log.i(TAG, "Suggestion: " + prediction.getFullText(new StyleSpan(Typeface.NORMAL)));
                                        matrixCursor.addRow(new Object[]{i, prediction.getPlaceId(), prediction.getPrimaryText(style), prediction.getSecondaryText(style), suggest});
                                    }
                                }
                                else {
                                    matrixCursor.addRow(new Object[]{-1, getString(R.string.no_place_id),
                                            getString(R.string.primary_location_not_found, suggest),
                                            getString(R.string.secondary_location_not_found), suggest});
                                }

                                searchCursorAdapter.changeCursor(matrixCursor);
                                searchCursorAdapter.notifyDataSetChanged();
                            }
                        }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                if (e instanceof ApiException) {
                                    ApiException apiException = (ApiException) e;
                                    Log.e(TAG, "Place not found: " + apiException.getMessage());
                                }
                            }
                        });
                    }
                } else {
                    searchCursorAdapter.changeCursor(null);
                    searchCursorAdapter.notifyDataSetChanged();
                }
                return true;
            }
        });

        String fontPath = "fonts/" + getString(R.string.font_nunito)
                + "/" + getString(R.string.font_nunito) + "-Regular.ttf";
        textArea.setTypeface(Typeface.createFromAsset(getAssets(), fontPath));
        textArea.setHint(R.string.delivery_location);
        textArea.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15.5f);

        textArea.setCompoundDrawablesWithIntrinsicBounds(ColorHelper.tintDrawable(
                ResourcesCompat.getDrawable(getResources(), R.drawable.ic_search_black_24dp, null),
                ContextCompat.getColor(this, R.color.colorPrimary)), null, null, null);
        textArea.setCompoundDrawablePadding(ViewHelper.dp2px(this, 10));

        menuItem.expandActionView();

        searchView.setIconified(false);
        searchView.clearFocus();

        return true;
    }

Я пытаюсь получить результаты из близлежащих мест, используя Google PLACES API. Я встроил функцию обратного вызова API в панель поиска поверх моей активности в Картах. Предложения должны появиться, поскольку я продолжаю печатать на панели поиска. Предложения будут отображаться в виде списка, из которого я могу выбрать место и продолжить свою логику c, используя координаты этого места. Есть ли более простой способ реализовать эту функцию? Мой запрос всегда по умолчанию приводит к ошибке API.

Это мой логический вывод

2020-03-26 14:38:42.328 28308-28308/com.mobar.android.mobar I/MapsActivity: Starting autocomplete query for: Ruiru
2020-03-26 14:38:42.330 28308-28308/com.mobar.android.mobar I/REQUEST: FindAutocompletePredictionsRequest{query=Ruiru, locationBias=RectangularBounds{southwest=lat/lng: (-1.430571,36.650945), northeast=lat/lng: (-1.129622,37.120314)}, locationRestriction=null, origin=null, countries=[KE], sessionToken=3173b22c-afc6-4997-9f12-16690a6f7123, typeFilter=ADDRESS, cancellationToken=null}
2020-03-26 14:38:42.343 28308-30243/com.mobar.android.mobar I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
2020-03-26 14:38:42.343 28308-30243/com.mobar.android.mobar I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
2020-03-26 14:38:42.347 7025-7025/? I/SKBD: [ATIM] [updateSelectionForInputModule] oldSelStart : 4, oldSelEnd : 4, newSelStart : 5, newSelEnd : 5, candidatesStart : 0, candidatesEnd : 5, viewClicked : false
2020-03-26 14:38:42.348 7025-7025/? I/SKBD: [ATIM] [updateSelectionForInputModule] isTyping : true, viewClicked : false, isKBDShown : true
2020-03-26 14:38:42.367 28308-28308/com.mobar.android.mobar E/MapsActivity: Place not found: 9011: The provided API key is invalid.

Ошибка указывает, что ключ API недействителен, это не так потому что, когда я выполняю веб-запрос, используя мой ключ API, я получаю результаты.

1 Ответ

0 голосов
/ 28 марта 2020

Полученная ошибка указывает на то, что проблема связана с вашим ключом API. Прежде всего, дважды убедитесь, что вы правильно добавляете свой ключ API , без пробелов и лишних символов на обоих концах ключа.

Во-вторых, убедитесь, что оно правильно ограничено; оно должно быть Android ограничено именем пакета вашего приложения и отпечатком. Если вы также добавили ограничения API, убедитесь, что в списке Адресов API. В целях тестирования вы также можете временно временно ограничить его, а затем проверить, работает ли функция автозаполнения с неограниченным ключом.

Надеюсь, это поможет вам!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...