Google Places API 自动完成仅获取城市列表

2024-01-03

我正在我的 Android 应用程序上实现谷歌的地点自动完成功能,它正在工作,显示每个相似的地点,但是只有当用户尝试搜索任何内容时,我如何才能获得城市建议。

我搜索了很多,但找不到 Android 地点自动完成的类似问题。

我已经从谷歌的示例中实现了 PlaceAutocompleteAdapter ,它看起来像这样

放置自动完成适配器

package com.tribikram.smartcitytraveler;

import android.content.Context;
import android.graphics.Typeface;
import android.text.style.CharacterStyle;
import android.text.style.StyleSpan;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.common.data.DataBufferUtils;
import com.google.android.gms.location.places.AutocompleteFilter;
import com.google.android.gms.location.places.AutocompletePrediction;
import com.google.android.gms.location.places.AutocompletePredictionBufferResponse;
import com.google.android.gms.location.places.GeoDataClient;
import com.google.android.gms.maps.model.LatLngBounds;
import com.google.android.gms.tasks.RuntimeExecutionException;
import com.google.android.gms.tasks.Task;
import com.google.android.gms.tasks.Tasks;

import java.util.ArrayList;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
 * Adapter that handles Autocomplete requests from the Places Geo Data Client.
 * {@link AutocompletePrediction} results from the API are frozen and stored directly in this
 * adapter. (See {@link AutocompletePrediction#freeze()}.)
 */
public class PlaceAutocompleteAdapter
        extends ArrayAdapter<AutocompletePrediction> implements Filterable {

    private static final String TAG = "PlaceACA";
    private static final CharacterStyle STYLE_BOLD = new StyleSpan(Typeface.BOLD);
    /**
     * Current results returned by this adapter.
     */
    private ArrayList<AutocompletePrediction> mResultList;

    /**
     * Handles autocomplete requests.
     */
    private GeoDataClient mGeoDataClient;

    /**
     * The bounds used for Places Geo Data autocomplete API requests.
     */
    private LatLngBounds mBounds;

    /**
     * The autocomplete filter used to restrict queries to a specific set of place types.
     */
    private AutocompleteFilter mPlaceFilter;

    /**
     * Initializes with a resource for text rows and autocomplete query bounds.
     *
     * @see android.widget.ArrayAdapter#ArrayAdapter(android.content.Context, int)
     */
    public PlaceAutocompleteAdapter(Context context, GeoDataClient geoDataClient,
                                    LatLngBounds bounds, AutocompleteFilter filter) {
        super(context, android.R.layout.simple_expandable_list_item_2, android.R.id.text1);
        mGeoDataClient = geoDataClient;
        mBounds = bounds;
        mPlaceFilter = filter;
    }

    /**
     * Sets the bounds for all subsequent queries.
     */
    public void setBounds(LatLngBounds bounds) {
        mBounds = bounds;
    }

    /**
     * Returns the number of results received in the last autocomplete query.
     */
    @Override
    public int getCount() {
        return mResultList.size();
    }

    /**
     * Returns an item from the last autocomplete query.
     */
    @Override
    public AutocompletePrediction getItem(int position) {
        return mResultList.get(position);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = super.getView(position, convertView, parent);

        // Sets the primary and secondary text for a row.
        // Note that getPrimaryText() and getSecondaryText() return a CharSequence that may contain
        // styling based on the given CharacterStyle.

        AutocompletePrediction item = getItem(position);

        TextView textView1 = (TextView) row.findViewById(android.R.id.text1);
        TextView textView2 = (TextView) row.findViewById(android.R.id.text2);
        textView1.setText(item.getPrimaryText(STYLE_BOLD));
        textView2.setText(item.getSecondaryText(STYLE_BOLD));

        return row;
    }

    /**
     * Returns the filter for the current set of autocomplete results.
     */
    @Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults results = new FilterResults();

                // We need a separate list to store the results, since
                // this is run asynchronously.
                ArrayList<AutocompletePrediction> filterData = new ArrayList<>();

                // Skip the autocomplete query if no constraints are given.
                if (constraint != null) {
                    // Query the autocomplete API for the (constraint) search string.
                    filterData = getAutocomplete(constraint);
                }

                results.values = filterData;
                if (filterData != null) {
                    results.count = filterData.size();
                } else {
                    results.count = 0;
                }

                return results;
            }

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {

                if (results != null && results.count > 0) {
                    // The API returned at least one result, update the data.
                    mResultList = (ArrayList<AutocompletePrediction>) results.values;
                    notifyDataSetChanged();
                } else {
                    // The API did not return any results, invalidate the data set.
                    notifyDataSetInvalidated();
                }
            }

            @Override
            public CharSequence convertResultToString(Object resultValue) {
                // Override this method to display a readable result in the AutocompleteTextView
                // when clicked.
                if (resultValue instanceof AutocompletePrediction) {
                    return ((AutocompletePrediction) resultValue).getFullText(null);
                } else {
                    return super.convertResultToString(resultValue);
                }
            }
        };
    }

    /**
     * Submits an autocomplete query to the Places Geo Data Autocomplete API.
     * Results are returned as frozen AutocompletePrediction objects, ready to be cached.
     * Returns an empty list if no results were found.
     * Returns null if the API client is not available or the query did not complete
     * successfully.
     * This method MUST be called off the main UI thread, as it will block until data is returned
     * from the API, which may include a network request.
     *
     * @param constraint Autocomplete query string
     * @return Results from the autocomplete API or null if the query was not successful.
     * @see GeoDataClient#getAutocompletePredictions(String, LatLngBounds, AutocompleteFilter)
     * @see AutocompletePrediction#freeze()
     */
    private ArrayList<AutocompletePrediction> getAutocomplete(CharSequence constraint) {
        Log.i(TAG, "Starting autocomplete query for: " + constraint);

        // Submit the query to the autocomplete API and retrieve a PendingResult that will
        // contain the results when the query completes.
        Task<AutocompletePredictionBufferResponse> results =
                mGeoDataClient.getAutocompletePredictions(constraint.toString(), mBounds,
                        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) {
            e.printStackTrace();
        }

        try {
            AutocompletePredictionBufferResponse autocompletePredictions = results.getResult();

            Log.i(TAG, "Query completed. Received " + autocompletePredictions.getCount()
                    + " predictions.");

            // Freeze the results immutable representation that can be stored safely.
            return DataBufferUtils.freezeAndClose(autocompletePredictions);
        } catch (RuntimeExecutionException e) {
            // If the query did not complete successfully return null
            Toast.makeText(getContext(), "Error contacting API: " + e.toString(),
                    Toast.LENGTH_SHORT).show();
            Log.e(TAG, "Error getting autocomplete prediction API call", e);
            return null;
        }
    }
}

我是初学者,如果您发现任何错误,请指出。那将是很大的帮助。 谢谢你!


您可以使用地点自动完成通过谷歌

Step 1:-

在谷歌开发者帐户中添加一个项目并从那里获取密钥

示例代码

Step 2:-

添加渐变

 implementation 'com.google.android.gms:play-services-places:9.6.0'

或最新版本

implementation 'com.google.android.gms:play-services-places:latest_version'

Step 3:-

在清单文件中添加此标签

<meta-data android:name="com.google.android.geo.API_KEY" android:value="Your api key"/>

Step 4:-

现在实现您的片段或活动类PlaceSelectionListener像这样

public class Fragment_Profile extends Fragment implements View.OnClickListener, PlaceSelectionListener

声明这个变量

private static final int REQUEST_SELECT_PLACE = 1000;

然后最后点击按钮调用这个

try {
                    AutocompleteFilter typeFilter = new AutocompleteFilter.Builder()
                            .setTypeFilter(AutocompleteFilter.TYPE_FILTER_CITIES)
                            .build();
                    Intent intent = new PlaceAutocomplete.IntentBuilder
                            (PlaceAutocomplete.MODE_FULLSCREEN)
                            .setFilter(typeFilter)
                            .build(getActivity());
                    startActivityForResult(intent, REQUEST_SELECT_PLACE);
                } catch (GooglePlayServicesRepairableException |
                        GooglePlayServicesNotAvailableException e) {
                    e.printStackTrace();
                }

这就是您正在寻找的过滤器

自动完成过滤器.TYPE_FILTER_CITIES

然后在重写的方法中获取选定的值

 @Override
    public void onPlaceSelected(Place place) {
        Log.i("Selected", "Place Selected: " + place.getAddress());

    }

您可以从这里查看文档https://developers.google.com/places/android-sdk/autocomplete https://developers.google.com/places/android-sdk/autocomplete and http://codesfor.in/android-places-autocomplete-example/ http://codesfor.in/android-places-autocomplete-example/

Thanks

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google Places API 自动完成仅获取城市列表 的相关文章

  • Sqlite数据库生命周期?关闭应用程序后它会被删除吗?

    我正在遵循一个简单的教程 该教程创建一个从 SQLiteOpenHelper 扩展的类 并创建一个包含一个表和 5 行的数据库 好的 但我需要更多地了解 android Sqlite 数据库 例如 如果应用程序关闭或手机关机会发生什么 数据
  • Android 后退按钮无法与 Flutter 选项卡内的导航器配合使用

    我需要在每个选项卡内有一个导航器 因此当我推送新的小部件时 选项卡栏会保留在屏幕上 代码运行得很好 但是 android 后退按钮正在关闭应用程序而不是运行 Navigator pop import package flutter mate
  • 谷歌坐标认证

    当我尝试连接到 Google 坐标时 总是出现异常GoogleAuthException 我拥有 Google 地图协调中心许可证 我确实使用我的包应用程序名称和 SHA1 在 google 控制台中创建了我的客户端 ID 我将权限添加到清
  • 如何以编程方式检查 AndroidManifest.xml 中是否声明了服务?

    我正在编写一个库 该库提供了一项服务 其他开发人员可以通过将其包含在他们的项目中来使用该服务 因此 我无法控制 AndroidManifest xml 我在文档中解释了要做什么 但一个常见的问题是人们忽略了将适当的 标记添加到其清单中 或者
  • 是否可以将数组或对象添加到 Android 上的 SharedPreferences

    我有一个ArrayList具有名称和图标指针的对象 我想将其保存在SharedPreferences 我能怎么做 注意 我不想使用数据库 无论 API 级别如何 请检查SharedPreferences 中的字符串数组和对象数组 http
  • Android Activity 生命周期函数基础知识

    我正在测试这段代码 它显示活动所处的状态 public class Activity101Activity extends Activity String tag Lifecycle Called when the activity is
  • 找不到处理意图 com.instagram.share.ADD_TO_STORY 的活动

    在我们的 React Native 应用程序中 我们试图让用户根据视图 组件中的选择直接将特定图像共享到提要或故事 当我们尝试直接使用 com instagram share ADD TO FEED 进行共享时 它以一致的方式完美运行 但是
  • CollapsingToolBarLayout - 状态栏稀松布颜色不改变

    几天前我更新了我的 android studio 并开始使用 CoordinatorLayout 和 CollapsingToolbarLayout 只是尝试一些东西 工具栏稀松布颜色似乎覆盖了状态栏初始颜色和状态栏稀松布颜色 从 xml
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 如何使用 Cordova 获取当前安装的应用程序的版本?

    我已经找到了应用程序可用性插件 https github com ohh2ahh AppAvailability它主要检查用户是否在其设备上安装了某个应用程序 是否有可能获得应用程序的当前版本 开发者名称 重要 以及所有可能的信息 一般来说
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 尝试将相机切换回前面但出现异常

    尝试将相机切换回前面 但出现异常 找不到 问题请检查并帮助 error 01 27 11 49 00 376 E AndroidRuntime 30767 java lang RuntimeException Unable to start
  • 在 SQLite 中搜索时排除 HTML 标签和一些 UNICODE 字符

    更新 4 我已经成功运行了firstchar例如 但现在的问题是使用regex 即使包含头文件 它也无法识别regex操作员 有什么线索可以解决这个问题吗 更新 2 我已经编译了sqlite3我的项目中的库 我现在正在寻找任何人帮助我为我的
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 在 android DatePickerDialog 中将语言设置为法语

    有什么办法可以让日期显示在DatePickerDialog用法语 我已经搜索过这个但没有找到结果 这是我的代码 Calendar c Calendar getInstance picker new DatePickerDialog Paym
  • Android Studio 0.4.3 Eclipse项目没有gradle

    在此版本之前 在 Android Studio 中按原样打开 Eclipse 项目似乎很容易 无需任何转换 我更喜欢 Android Studio 环境 但我正在开发一个使用 eclipse 作为主要 IDE 的项目 我不想只为这个项目下载
  • 字符串数组文本格式化

    我有这个字符串 String text Address 1 Street nr 45 Address 2 Street nr 67 Address 3 Street nr 56 n Phone number 000000000 稍后将被使用
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • android sdk 的位置尚未在 Windows 操作系统的首选项中设置

    在 Eclipse 上 我转到 windows gt Android SDK 和 AVD Manager 然后弹出此消息 Android sdk 的位置尚未在首选项中设置 进入首选项 在侧边栏找到 Android 然后会出现一个 SDK 位
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview

随机推荐

  • 信用卡/借记卡号是数字还是整数?

    由于数字也可以是小数 这让我认为 CC 数字应该是整数 这是有道理的 因为我认为没有任何信用卡以 0 开头 而且它们都遵循相同的模式 4444333322221111 所以我猜它们是一个整数 但我不太确定国际卡是什么样的 有0开头的吗 Up
  • 线程总是在增加

    我刚刚安装了 SmartFoxServer 重新启动 Sfs 后 Dashboard 线程池中的线程数不断增加 直到下次重新启动才再次减少 如果我增加线程池限制 线程数就会增加到该限制 任何扩展或服务尚未运行 线程数在 10 分钟内增加到
  • 验证有效的 SQL 字符串

    C 中是否有一种方法 或现有库 不一定内置于 NET 中 来执行简单的 SQL 字符串验证 场景 构建更新语句以减少 SQL 负载与单个语句的负载 如果字符串构建做了一些 奇怪 的事情 例如以逗号结尾 我希望能够验证该字符串是否正确 如果您
  • jQuery Validator,以编程方式显示错误

    我可以做这样的事情 validator showErrors nameOfField ErrorMessage 这工作得很好 但是如果我尝试做这样的事情 var propertyName nameOfField var errorMessa
  • 适用于 Visual Studio 2010 项目的 Mercurial .hgignore

    不要混淆适用于 Visual Studio 2008 项目的 Mercurial hgignore https stackoverflow com questions 34784 mercurial hgignore for visual
  • PHP/MySQL:突出显示“SOUNDS LIKE”查询结果

    快速 MYSQL PHP 问题 如果使用普通搜索查询找不到结果 我将使用 不太严格 的搜索查询作为后备 调整如下 foreach find array as word clauses firstname SOUNDS LIKE word O
  • 在 Express 中的 URL 中使用多个参数

    我将 Express 与 Node 一起使用 并且我有一个要求 用户可以请求 URL 如下所示 http myhost fruit apple red 此类请求将返回 JSON 响应 上述调用之前的 JSON 数据如下所示 fruit ap
  • ASP.NET 与 jQueryUI:服务器端事件未触发

    我有一个 ASP NET 页面 该页面使用 jQuery UI 对话框 当用户单击按钮时 btnGo 在页面中 我将检查用户是否登录 如果未登录 我将显示 jQuery UI 对话框进行登录 我使用了这段代码
  • Runtime.getRuntime().maxMemory()计算方法

    这是代码 System out println Runtime max mb Runtime getRuntime maxMemory MemoryMXBean m ManagementFactory getMemoryMXBean Sys
  • 与露天 cmis 的连接

    我正在尝试使用配置参数连接露天 但出现错误 Config sessionParameters put SessionParameter USER admin sessionParameters put SessionParameter PA
  • bash 进程替换中的 GNU 并行参数占位符

    我有以下 GNU 并行命令 parallel gnu jobs 4 normalize by median py k 20 C 20 paired N 4 x 6e9 out pdom diginorm fq pdom fq gz 200b
  • 如何在ie8中使用包含函数的值设置OnClick属性?

    我的目标是改变onclick链接的属性 我可以成功完成 但生成的链接在 ie8 中不起作用 它在 ff3 中确实有效 例如 这适用于 Firefox 3 但不适用于 IE8 为什么 p a href click me a p 您不需要为此使
  • 实现一个简单的文件下载 servlet [重复]

    这个问题在这里已经有答案了 我应该如何实现简单的文件下载servlet 这个想法是通过 GET 请求index jsp filename file txt 用户可以下载例如 file txt来自文件 servlet 文件 servlet 会
  • 这个 Monster Builder 是一个很好的 Builder / Factory 模式,用于抽象与 setter 混合的长构造函数吗?

    这是一个关于组合的人机界面问题步骤生成器模式 http rdafbn blogspot co uk 2012 07 step builder pattern 28 html与enhanced https stackoverflow com
  • 在记事本++中仅复制文本文件中的搜索表达式结果

    我有一个源代码 只想复制我用正则表达式找到的字符串 就像 asdladhsfhjk hello1 asdlkajhsd asdsa hello3 asdhjkl asd lkj hello5 我只是想从文本中复制 helloX 而且还不是线
  • Spring Security无状态配置

    我正在尝试按照文档实现 Spring 无状态身份验证 http static springsource org spring security site docs 3 1 x reference security filter chain
  • 使用“ODBC”将 Excel VBA 连接到 Oracle DB

    基本上我在一家软件公司工作 我的客户有一个 Oracle 数据库 我确实通过 SQL Developer 访问该数据库 我们也有一个虚拟桌面 里面有所有客户端应用程序 SQL Plus 等 现在 我团队中的另一个人创建了一个 Excel 宏
  • 使用 PHP 将文本分成两列

    我想知道是否可以将文本分成两部分 在我的网站上 我有一个产品描述 500 1000字 我想像这样显示它 div class text col div div class text col div 像这样的东西吗 len strlen inp
  • 编写一次并行数组 Haskell 表达式,通过 repa 和加速在 CPU 和 GPU 上运行

    修复并加速 API 相似度 Haskell repa 库用于在 CPU 上自动并行数组计算 加速库是 GPU 上的自动数据并行化 这些 API 非常相似 具有相同的 N 维数组表示 人们甚至可以在加速和修复阵列之间切换fromRepa an
  • Google Places API 自动完成仅获取城市列表

    我正在我的 Android 应用程序上实现谷歌的地点自动完成功能 它正在工作 显示每个相似的地点 但是只有当用户尝试搜索任何内容时 我如何才能获得城市建议 我搜索了很多 但找不到 Android 地点自动完成的类似问题 我已经从谷歌的示例中