使用Place Picker Google API在安卓中选择匿名位置时,禁用选择按钮。

17

我想保存带有位置字段的用户表单信息。对于位置,我想在某个按钮点击时打开谷歌地图,并在用户在地图上单击位置并填写位置后将其提交到表单。

我找到了与此相关的解决方案Place Picker,因此我使用了Place Picker Google API,并成功地打开了谷歌地图,当我在首选位置上移动箭头并单击“选择此位置(出现黑色颜色,现在坐标显示在下面)”时。

确认框会打开2个选项:

1.) 更改位置
2.) 选择(禁用模式)

我想选择匿名位置并返回主活动。

以下是我的代码:

private TextView get_place;
int PLACE_PICKER_REQUEST    =   1;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    get_place   =   (TextView)findViewById(R.id.textView1);
    get_place.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            PlacePicker.IntentBuilder builder   =   new PlacePicker.IntentBuilder();
            Intent intent;
            try {
                intent  =   builder.build(getApplicationContext());
                startActivityForResult(intent,PLACE_PICKER_REQUEST );
            } catch (GooglePlayServicesRepairableException e) {
                e.printStackTrace();
            } catch (GooglePlayServicesNotAvailableException e) {
                e.printStackTrace();
            }
        }
    });
}

protected void onActivityResult( int requestCode , int resultCode , Intent data ){
    if( requestCode == PLACE_PICKER_REQUEST)
    {
        if(resultCode == RESULT_OK)
        {
            Place place =   PlacePicker.getPlace(data,this);
            Double latitude = place.getLatLng().latitude;
            Double longitude = place.getLatLng().longitude;
            String address = String.valueOf(latitude)+String.valueOf(longitude);
            get_place.setText(address);
        }
    }
}

当前位置坐标不可见

Valid XHTML.

点击“选择此按钮”后,下方窗口中的选择按钮将被禁用

Valid XHTML.

请告知是否有其他更好的解决方案。代码回复或参考链接将非常有帮助。


我目前也有一个用户遇到了同样的问题,所以很想找到解决方案。您安装了哪个版本的Google Play服务? - DilbertDave
我刚刚在从Play商店安装应用程序并删除手机上的开发(调试)版本后复制了这个问题。也许是API密钥的问题? - DilbertDave
@abielita - 在我的情况下,互联网连接不是问题。如果我使用调试密钥部署到我的设备上,则一切正常。如果我使用发布密钥部署,则会出现上述行为,但地图在应用程序的其他部分中显示正常。 - DilbertDave
我正在使用以下软件包 - 1.) com.android.support:appcompat-v7:24.2.0 2.) com.google.android.gms:play-services:8.3.0 3.) com.google.maps.android:android-maps-utils:0.3.4 - Dr_Dang
你是否检查了清单文件中API密钥的配置(请参见我下面的答案)? - DilbertDave
显示剩余2条评论
8个回答

8

2

我曾经遇到过相同的问题(请参见原帖中的评论),后来发现是由于在 AndroidManifest.xml 文件中 API 密钥条目不匹配所致。

我使用的是 Xamarin.Android,但在 Java 中原理应该是相同的 - 不过可能会有所不同。

基本上我的应用程序正在使用地图 API,在清单文件中我指定了 API 密钥为 com.google.android.maps.v2.API_KEY - 一切正常。当我实现了 Places Picker 后,我需要将密钥名称更改为 com.google.android.geo.API_KEY(我不需要更改密钥本身!)。我已经为调试配置做了这个更改,但没有为发布配置做这个更改 - 后者仍然使用 Maps 密钥名称。因此,构建可发布的软件包会导致清单无法满足 Places API 的要求,但可以满足 Maps API 的要求。

更改发布配置解决了我的问题。


你实际上做了什么?如何更改发布配置? - Vikas Pandey
@VikasPandey - 正如我所提到的,我正在使用Xamarin和Visual Studio,因此这可能不适用于您。我有一个单独的GoogleMapsKey.cs文件,其中包含两个MetaDataAttributes,一个包含我的调试API密钥,另一个包含发布密钥。我使用条件编译符号在它们之间切换,例如#if DEBUG。您可以在此处查看示例:https://github.com/adrianstevens/XamarinAndroidFlyoutMaps/blob/master/ActionBarMap/GoogleMapsKey.cs - DilbertDave

0
  1. 请确保您已在console.developers.google.com中启用了此API。
  2. 同时(这是我的情况),请确保您的API密钥是正确的 - 从gradle应用程序ID字段复制包。一个好的测试是如果您禁用API密钥的限制。

0

我遇到了同样的问题,当我在我的Google云项目中启用了Google Places API for Android API时,问题得到了解决。


Google API已启用Android。 - Dr_Dang
您需要同时启用Google Maps Android APIGoogle Places API for Android - Lahiru Chandima
1
@LahiruChandima 我已经启用了两个API,但仍然无法工作。 - Aks4125

0

我还需要启用地理编码API。这些是我正在使用的API:

enter image description here


0

所有的答案都已经过时或者不相关。我尝试了两种解决方案,它们对我有效。

解决方案1

compile 'com.google.android.gms:play-services:9.4.0'
    compile 'com.google.android.gms:play-services-base:9.4.0'
    compile 'com.google.android.gms:play-services-appindexing:9.4.0'
    compile 'com.google.android.gms:play-services-contextmanager:9.4.0'
    compile 'com.google.android.gms:play-services-places:9.4.0'
    compile 'com.google.android.gms:play-services-nearby:9.4.0'
    compile 'com.google.android.gms:play-services-maps:9.4.0'
    compile 'com.google.android.gms:play-services-ads:9.4.0'
    compile 'com.google.android.gms:play-services-auth:9.4.0'
    compile 'com.google.android.gms:play-services-gcm:9.4.0'
    compile 'com.google.android.gms:play-services-analytics:9.4.0'
    compile 'com.google.android.gms:play-services-location:9.4.0'

参考:谷歌文档

解决方案2

  1. 进入Google API控制台
  2. 找到项目使用的Android密钥
  3. 选择Android操作系统,输入包名和SHA1
  4. 检查来自Firebase的google-services.json文件,它应该使用此密钥。

重新构建,一切正常。


0

你应该使用这个

  <application>
  ...
  <meta-data
      android:name="com.google.android.geo.API_KEY"
      android:value="YOUR_API_KEY"/>
</application>

而不是

<application>
    <meta-data
          android:name="com.google.android.maps.v2.API_KEY"
          android:value="YOUR_API_KEY"/>
    <application>

0
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     if (requestCode==PLACE_PICKER_REQUEST|requestCode==REQUEST_CHECK_SETTING){
           if(resultCode==RESULT_OK) {
               mlocationUpdate = true;
//               startLocationUpdate();
               Place place = PlacePicker.getPlace(data, this);


               String str_txt = place.getName().toString();
               str_txt += "\n" + place.getAddress().toString();
               placeMarkerOnMap(place.getLatLng());

                mStringBuilder = new StringBuilder();
               String mplacename = String.format("%s", place.getName());
               mlatitude = (place.getLatLng().latitude);

               mlongitude = (place.getLatLng().longitude);
               String maddress = String.format("%s", place.getAddress());

               mStringBuilder.append("NAME :");
               mStringBuilder.append(mplacename);
               mStringBuilder.append("\n");

               Log.e("SRC-->",mplacename);
               Log.e("THIS-->",maddress);



               mStringBuilder.append("ADDRESS :");
               mStringBuilder.append(maddress);
             /*mStringBuilder.append("\n");*/
                if (isPickUp==true){
                    edt_pickup.setText(mStringBuilder);

                    isPickUp=false;
                                    }

else if (isDrop==true){
                    edt_drop.setText(mStringBuilder);
                    mlatitudeEnd = (place.getLatLng().latitude);

                    mlongitudeEND = (place.getLatLng().longitude);
                    isDrop=false;
                }

           }}


        super.onActivityResult(requestCode, resultCode, data);
    }

请使用以下内容,并确保启用了按钮,然后添加-on。 - vishal yadav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接