java - 我的简单程序显示了我的位置,但没有显示在微调器中选择的位置的多段线

标签 java android google-maps

我的简单程序应该显示我的位置并绘制一条折线到在微调器中选择的位置。它目前只显示我的位置,但我不知道为什么。也许问题出在 Android Marshmallow 中引入的权限。 这是我的代码:

    public class MapsActivity extends FragmentActivity {

    private final LatLng MainHousing = new LatLng(49.83511, 24.01446);
    private final LatLng FirstHousing = new LatLng(49.83533, 24.01004);
    private final LatLng FifthHousing = new LatLng(49.835, 24.00824);
    private static final int REQUEST_LOCATION = 1;
    private static String[] PERMISSIONS_STORAGE = {
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION
    };
    GoogleMap googleMap;
    Location location;
    LatLng myPosition;
    Spinner spinner;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        List<String> list = new ArrayList<>();
        list.add("Головний корпус");
        list.add("I корпус");
        list.add("V корпус");

        spinner = (Spinner) findViewById(R.id.spinner);
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<>(this,
                android.R.layout.simple_spinner_item, list);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(dataAdapter);

        showMyLocation();
    }


    private void showMyLocation() {
        // Getting reference to the SupportMapFragment of activity_main.xml
        SupportMapFragment fm = (SupportMapFragment)
                getSupportFragmentManager().findFragmentById(R.id.map);

        // Getting GoogleMap object from the fragment
        googleMap = fm.getMap();

        // Enabling MyLocation Layer of Google Map
        googleMap.setMyLocationEnabled(true);

        // Getting LocationManager object from System Service LOCATION_SERVICE
        LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

        // Creating a criteria object to retrieve provider
        Criteria criteria = new Criteria();

        // Getting the name of the best provider
        String provider = locationManager.getBestProvider(criteria, true);
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    PERMISSIONS_STORAGE, REQUEST_LOCATION);
        }

        location = locationManager.getLastKnownLocation(provider);

        if (location != null) {
            // Getting latitude of the current location
            double latitude = location.getLatitude();

            // Getting longitude of the current location
            double longitude = location.getLongitude();

            // Creating a LatLng object for the current location
            LatLng latLng = new LatLng(latitude, longitude);

            myPosition = new LatLng(latitude, longitude);

            googleMap.addMarker(new MarkerOptions().position(myPosition).title("Start"));

            final PolylineOptions pOptions = new PolylineOptions();

            spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                    switch (spinner.getSelectedItemPosition()) {
                        case 0:
                            pOptions.add(myPosition).add(MainHousing).width(5).color(Color.BLUE).geodesic(true);
                            googleMap.addPolyline(pOptions);
                            googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(MainHousing, 13));
                            break;
                        case 1:
                            pOptions.add(myPosition).add(FirstHousing).width(5).color(Color.BLUE).geodesic(true);
                            googleMap.addPolyline(pOptions);
                            googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(FirstHousing, 13));
                            break;
                        case 2:
                            pOptions.add(myPosition).add(FifthHousing).width(5).color(Color.BLUE).geodesic(true);
                            googleMap.addPolyline(pOptions);
                            googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(FifthHousing, 13));
                            break;
                    }
                }

                @Override
                public void onNothingSelected(AdapterView<?> parent) {

                }
            });
        }
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                           int[] grantResults) {
        switch (requestCode) {
            case REQUEST_LOCATION:
                if (grantResults.length > 0 &&
                        grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // Permission Granted
                } else {
                    // Permission Denied
                    Toast.makeText(MapsActivity.this, "LOCATION Denied", Toast.LENGTH_SHORT)
                            .show();
                }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
}

那么,我的问题是什么?它可能是一个愚蠢的,因为我是 android 的新手。提前致谢。

最佳答案

首先,您需要实现 OnMapReady 接口(interface)以及 ConnectionCallbacks,因为加载 map 并将您的逻辑移至 onConnected() 方法需要一些时间,您将在该方法中询问用户他的位置并设置您的微调器与折线。

import android.Manifest;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.location.Location;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.support.v4.content.ContextCompat;
import android.view.View;
import android.widget.*;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.*;
import com.google.android.gms.maps.*;
import com.google.android.gms.maps.model.*;

import java.util.ArrayList;
import java.util.List;

public class MapsActivity extends FragmentActivity
    implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener {

    private final LatLng MainHousing = new LatLng(49.83511, 24.01446);
    private final LatLng FirstHousing = new LatLng(49.83533, 24.01004);
    private final LatLng FifthHousing = new LatLng(49.835, 24.00824);
    private static final int REQUEST_LOCATION = 1;

    GoogleMap googleMap;
    LatLng myPosition;
    Spinner spinner;
    PolylineOptions pOptions;
    Marker currLocationMarker;
    SupportMapFragment mFragment;
    LocationRequest mLocationRequest;
    GoogleApiClient mGoogleApiClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        List<String> list = new ArrayList<>();
        list.add("Головний корпус");
        list.add("I корпус");
        list.add("V корпус");

        spinner = (Spinner) findViewById(R.id.spinner);
        pOptions = new PolylineOptions();

        ArrayAdapter<String> dataAdapter = new ArrayAdapter<>(this,
            android.R.layout.simple_spinner_item, list);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(dataAdapter);

        mFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        mFragment.getMapAsync(this);

    }


    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                       int[] grantResults) {
        switch (requestCode) {
            case REQUEST_LOCATION:
                if (grantResults.length > 0 &&
                    grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Permission Granted
                    Toast.makeText(SOMapsActivity.this, "LOCATION Accepted", Toast.LENGTH_SHORT)
                        .show();
                } else {
                // Permission Denied
                    Toast.makeText(SOMapsActivity.this, "LOCATION Denied", Toast.LENGTH_SHORT)
                        .show();
                }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        this.googleMap = googleMap;
        buildGoogleApiClient();
        mGoogleApiClient.connect();
    }

    protected synchronized void buildGoogleApiClient() {
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
    }


    @Override
    public void onConnected(@Nullable Bundle bundle) {

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ||
            ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
            ) {

            ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION},
                REQUEST_LOCATION);
        }

        Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
            mGoogleApiClient);
        if (mLastLocation != null) {

            myPosition = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
            MarkerOptions markerOptions = new MarkerOptions();
            markerOptions.position(myPosition);
            markerOptions.title("Current Position");
            markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA));
            currLocationMarker = googleMap.addMarker(markerOptions);
        }

        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(5000); //5 seconds
        mLocationRequest.setFastestInterval(3000); //3 seconds
        mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
    //mLocationRequest.setSmallestDisplacement(0.1F); //1/10 meter

        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);

        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                switch (spinner.getSelectedItemPosition()) {
                    case 0:
                        pOptions.add(myPosition).add(MainHousing).width(5).color(Color.BLUE).geodesic(true);
                        googleMap.addPolyline(pOptions);
                        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(MainHousing, 17));
                        break;
                    case 1:
                        pOptions.add(myPosition).add(FirstHousing).width(5).color(Color.BLUE).geodesic(true);
                        googleMap.addPolyline(pOptions);
                        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(FirstHousing, 17));
                        break;
                    case 2:
                        pOptions.add(myPosition).add(FifthHousing).width(5).color(Color.BLUE).geodesic(true);
                        googleMap.addPolyline(pOptions);
                            googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(FifthHousing, 17));
                        break;
                    }
                }

                @Override
                public void onNothingSelected(AdapterView<?> parent) {
                }
            });
        }
//......
}

附言此代码有效,但还可以改进,因此请确保花一些时间对其进行分析并根据您自己的目的进行修改。

P.p.s.在此示例中,多边形线未被删除,因此您也可以编写一些代码来删除它们。

干杯。

关于java - 我的简单程序显示了我的位置,但没有显示在微调器中选择的位置的多段线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40347617/

相关文章:

Android SDK工具和ADT版本不匹配

android - 使用 Android 的 Algolia 和 Cloud Firestore?

AndroidManifest 包名称与 Android 中的风格冲突

android - java.lang.IllegalStateException : Not on the main thread Google Maps 错误

java - 忽略流操作中的异常

Java 接口(interface)方法论 : Should every class implement an interface?

Java:有人知道检测互联网连接质量的库吗?

Java 反射 : how to get field value from an object, 不知道它的类

android - 不可转换类型;无法转换 android.app.fragment

jquery - 如何在 Bootstrap jQuery Tab 中重新加载 Google Map