Как узнать местоположение из системы Android Automotive без сервисов Google Play - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь разработать приложение для Android Automotive Как вы знаете, мы не можем использовать Службы Google Play для приложений Android Auto, поэтому я ищу решение, чтобы получить последнюю позицию. Объект Location.

1 Ответ

0 голосов
/ 19 апреля 2019

Вам необходимо добавить разрешение к вашему manifest файлу

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

, затем вы можете создать свой собственный класс LocationUtil, как показано ниже;

public class LocationUtil {

    private final LocationListener locationListener;

    private Context mContext;

    private Location currentLocation;

    private  LocationManager mLocationManager;

    private static LocationUtil INSTANCE;

    public LocationUtil(Context context, final LocationListener listener) {
        mContext = context;
        mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        locationListener = listener;
    }

    public synchronized static LocationUtil getInstance(Context context, final LocationListener listener) {
        if (INSTANCE == null) {
            INSTANCE = new LocationUtil(context, listener);
        }
        return INSTANCE;
    }

    public void startLocationUpdate() {
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_COARSE);
        criteria.setAltitudeRequired(false);
        criteria.setSpeedRequired(false);
        criteria.setPowerRequirement(Criteria.POWER_MEDIUM);
        criteria.setCostAllowed(false);

        String provider = mLocationManager.getBestProvider(criteria, true);

        if (provider == null) {
            List<String> providers = mLocationManager.getAllProviders();
            for (String temp : providers) {
                if (mLocationManager.isProviderEnabled(temp)) {
                    provider = temp;
                }
            }
        }
        long distanceChage = 20;
        long updateTime = 1000 * 50;
        if (provider != null && Build.VERSION.SDK_INT >= 23
                && ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED
                && ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            mLocationManager.requestLocationUpdates(provider, updateTime, distanceChage, locationListener);
            currentLocation = mLocationManager.getLastKnownLocation(provider);
        } else if (provider != null && Build.VERSION.SDK_INT < 23) {
            mLocationManager.requestLocationUpdates(provider, updateTime, distanceChage, locationListener);
            currentLocation = mLocationManager.getLastKnownLocation(provider);
        }
    }


    public void stopLocationUpdate() {
        if (mLocationManager != null) {
            if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION)
                    == PackageManager.PERMISSION_GRANTED
                    && ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION)
                    == PackageManager.PERMISSION_GRANTED) {
                mLocationManager.removeUpdates(locationListener);
            }
        }
    }

    public Location getLocation() {
        return currentLocation;
    }

}

, затем вы можете создатьэкземпляр этого класса, где вы хотите инициировать.

LocationUtil manager = LocationUtil.getInstance(context, YourActivity.class);
manager.startLocationUpdate();

 @Override
    public void onLocationChanged(final Location location) {
        //Do your work here
    }

    @Override
    public void onStatusChanged(final String provider, final int status, final Bundle extras) {

    }

    @Override
    public void onProviderEnabled(final String provider) {

    }

    @Override
    public void onProviderDisabled(final String provider) {

    }
...