将当前位置设置为自动完成片段

时间:2017-03-02 13:29:22

标签: android autocomplete

我想在创建活动时将当前位置设置为地点自动完成片段。

我可以加载Google Maps API,并且已在我的应用程序中成功实施了Place Autocomplete Fragment。但是,我想放置自动完成片段将当前位置设置为默认字符串到位自动完成片段。就像优步一样。当我们打开Uber并点击编辑文本时说“在哪里?”它要求我们输入或搜索目的地位置,并自动将位置设置为当前位置。我的代码如下:

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.os.Build;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.places.Place;
import com.google.android.gms.location.places.PlaceDetectionApi;
import com.google.android.gms.location.places.ui.PlaceAutocompleteFragment;
import com.google.android.gms.location.places.ui.PlaceSelectionListener;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MapStyleOptions;
import com.google.android.gms.maps.model.MarkerOptions;

import java.util.Arrays;
import java.util.List;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

private GoogleMap mMap;
private static final int REQUEST_SEND_SMS = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);
    // Obtain the SupportMapFragment and get notified when the map is ready to be used.
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
}

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    try {
        // Customise the styling of the base map using a JSON object defined
        // in a raw resource file.
        boolean success = mMap.setMapStyle(
                MapStyleOptions.loadRawResourceStyle(
                        this, R.raw.aubergine_maps_style_json));

        if (!success) {
            Log.e("MapsActivityRaw", "Style parsing failed.");
        }
    } catch (Resources.NotFoundException e) {
        Log.e("MapsActivityRaw", "Can't find style.", e);
    }

    // Add a marker in Sydney and move the camera
    /* LatLng sydney = new LatLng(-34, 151);
    mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
    mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); */
    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    Criteria criteria = new Criteria();

    if(Build.VERSION.SDK_INT >=23){
        if (Build.VERSION.SDK_INT >= 23) {
            if (checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED || checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {

            } else {
                if (shouldShowRequestPermissionRationale(android.Manifest.permission.ACCESS_FINE_LOCATION) || shouldShowRequestPermissionRationale(android.Manifest.permission.ACCESS_COARSE_LOCATION)) {
                }
                requestPermissions(new String[]{
                        android.Manifest.permission.ACCESS_FINE_LOCATION,
                        android.Manifest.permission.ACCESS_COARSE_LOCATION
                }, REQUEST_SEND_SMS);
            }
        }
    }

    Location location = getLastKnownLocation();

    if (location != null)
    {
        this.mMap.getUiSettings().setMyLocationButtonEnabled(false);
        this.mMap.setMyLocationEnabled(true);

        GPSTracker tracker = new GPSTracker(this);
        double latitude = 0;
        double longitude = 0;
        if (!tracker.canGetLocation()) {
            tracker.showSettingsAlert();
        } else {
            latitude = tracker.getLatitude();
            longitude = tracker.getLongitude();
        }

        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude, longitude), 15));
    } else {
        Toast.makeText(getApplicationContext(), "Location Is Null", Toast.LENGTH_LONG).show();
    }

    PlaceAutocompleteFragment autocompleteFragment = (PlaceAutocompleteFragment)
            getFragmentManager().findFragmentById(R.id.place_autocomplete_fragment);

    autocompleteFragment.setText("");

    autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
        @Override
        public void onPlaceSelected(Place place) {
            // TODO: Get info about the selected place.
            System.out.println("Place Name: " + place.getName());
            System.out.println("Place ID: " + place.getId());
            System.out.println("Place Address: " + place.getAddress());
            System.out.println("Place LatLng: " + place.getLatLng());
            String latLng = place.getLatLng().toString();
            latLng = latLng.replace("lat/lng: (", "");
            latLng = latLng.replace(")","");
            String[] latLngArray = latLng.split(",");
            System.out.println("Latitude Only: " + latLngArray[0]);
            System.out.println("Longitude Only: " + latLngArray[1]);

            mMap.clear();

            mMap.addMarker(new MarkerOptions()
                    .position(new LatLng(Double.parseDouble(latLngArray[0]), Double.parseDouble(latLngArray[1])))
                    .title(place.getName().toString())
            );
        }

        @Override
        public void onError(Status status) {
            // TODO: Handle the error.
            System.out.println("An error occurred: " + status);
        }
    });

}

private Location getLastKnownLocation() {
    LocationManager mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);;
    List<String> providers = mLocationManager.getProviders(true);
    Location bestLocation = null;
    for (String provider : providers) {
        if(Build.VERSION.SDK_INT >=23){
            if (Build.VERSION.SDK_INT >= 23) {
                if (checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED || checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {

                } else {
                    if (shouldShowRequestPermissionRationale(android.Manifest.permission.ACCESS_FINE_LOCATION) || shouldShowRequestPermissionRationale(android.Manifest.permission.ACCESS_COARSE_LOCATION)) {
                    }
                    requestPermissions(new String[]{
                            android.Manifest.permission.ACCESS_FINE_LOCATION,
                            Manifest.permission.ACCESS_COARSE_LOCATION
                    }, REQUEST_SEND_SMS);
                }
            }
        }
        Location l = mLocationManager.getLastKnownLocation(provider);
        System.out.println("last known location, provider: %s, location: %s");

        if (l == null) {
            continue;
        }
        if (bestLocation == null
                || l.getAccuracy() < bestLocation.getAccuracy()) {
            System.out.println("found best last known location: %s");
            bestLocation = l;
        }
    }
    if (bestLocation == null) {
        return null;
    }
    return bestLocation;
}
}

3 个答案:

答案 0 :(得分:0)

我想我回答这个问题有点晚了。我在下面找到了最突出的解决方案。也许它将帮助某人。直接解决方案是setText API的PlaceAutocompleteFragment方法。有关详细答案,请通过以下答案进行。

  1. 加载Google地图
  2. 初始化PlaceAutocompleteFragment
  3. onMapReady方法中的getCurrentLocation
  4. 设置当前位置标记
  5. 现在,只需通过调用setAuto方法来设置PlaceAutocompleteFragment的名称即可。 (例如sourcePlace.setText("Current Location");

注意:这是我发现的最简单的方法。试试它,如果它也适合您的需求。

答案 1 :(得分:0)

尽管已经过去了 3 年,但我还是决定回答,以防有人需要它。我遇到了同样的问题,不得不以编程方式打开 Places Autocomplete。https://developers.google.com/maps/documentation/places/android-sdk/autocomplete#option_2_use_an_intent_to_launch_the_autocomplete_activity 由于 startActivityForResult 已被弃用,我在这里采用了新的方法来处理活动结果。当您创建 Intent 以打开自动完成活动时,您应该在构建它之前应用 setInitialQuery("Hawaii")。您可以使用 LiveData 从活动中调用该方法。这是我的活动中的全部代码:

var resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        // There are no request codes
        val data: Intent? = result.data

        data?.let {
            val place = Autocomplete.getPlaceFromIntent(data)
            makeToast(place.name.toString()) // <- Consume your result
        }
    }
}

private fun openSearchAutocomplete() {
    val fields = listOf(Place.Field.ID, Place.Field.NAME, Place.Field.ADDRESS, Place.Field.LAT_LNG)

    val intent = Autocomplete.IntentBuilder(
        AutocompleteActivityMode.OVERLAY, fields).setCountry("US") //United States
        .setInitialQuery("Hawaii") // <- set initial query here
        .build(this)
    resultLauncher.launch(intent)
}

答案 2 :(得分:-1)

        <android.support.v7.widget.CardView
        android:layout_marginTop="60dp"
        android:layout_height="50dp"
        android:layout_width="match_parent"
        android:id="@+id/cardView">
        <fragment  android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/place_autocomplete_fragment"
            android:name="com.google.android.gms.location.places.ui.PlaceAutocompleteFragment"
            />

把它放在你的android xml代码里面,就像亲戚一样   然后通过调用onCreate方法中的autocom()方法添加休眠的java代码,并在Mainefest文件中添加位置权限

private void autocom()
{
    PlaceAutocompleteFragment autocompleteFragment = (PlaceAutocompleteFragment)
            getFragmentManager().findFragmentById(R.id.place_autocomplete_fragment);

    autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
        @Override
        public void onPlaceSelected(Place place) {
            LatLng string_location = place.getLatLng();
            String address = (String) place.getAddress();
            String name = (String) place.getName();
            // Log.i("LocationLatlang", String.valueOf(string_location));
            //Log.i("LocationAddress", address);
            //Log.i("Locationname", name);
            //Log.i("pppp", "Place: " + place.getName());

        }

        @Override
        public void onError(Status status) {
            Log.i("ppperror", "An error occurred: " + status);
        }
    });
}