获取棉花糖中的当前位置 0,其中 23 API 以下使用融合位置给出准确的当前位置

Posted

技术标签:

【中文标题】获取棉花糖中的当前位置 0,其中 23 API 以下使用融合位置给出准确的当前位置【英文标题】:Get Current Location 0 in marshmallow where below 23 API its give exact current Location using fused Location 【发布时间】:2016-03-22 04:43:51 【问题描述】:

我在 23 台以下设备中获得了当前位置,但在 23 台模拟器设备中获得了 (0.0,0.0) 纬度和经度。

编辑 目前我正在使用 Fused Location Provider 获取当前位置

public class ContactUsFragment extends Fragment implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener 
 @Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    Log.i("TAG", "OnCreate Called");
    locationManager = (LocationManager) getActivity()
            .getSystemService(Context.LOCATION_SERVICE);
    buildGoogleApiClient();



@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         final Bundle savedInstanceState) 
    // Inflate the layout for this fragment
    view = inflater.inflate(R.layout.fragment_contact_us, container, false);

    Log.i("TAG", "OnCreateView Called");
    setComponants(view);  // **** Method For Set Componants Of Layout

这是点击它的地图图像我想获取当前位置并将其传递给设备的本机谷歌地图应用程序以导航到目标位置

 mapImage.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            Log.i("TAG", "On ImageView Click");


            if (Build.VERSION.SDK_INT >= 23) 

                if (checkPermission(Manifest.permission.ACCESS_FINE_LOCATION, getActivity().getApplicationContext(), getActivity())) 

                    if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) 
                        navigateToGoogleMap();
                     else 
                        showSettingsAlert();
                    
                 else 
                    requestPermission(Manifest.permission.ACCESS_FINE_LOCATION, PERMISSION_REQUEST_CODE, getActivity().getApplicationContext(), getActivity());
                
             else 

                if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) 
                    navigateToGoogleMap();
                 else 
                    showSettingsAlert();
                

            


        


    );
    return view;

下面是获取当前位置的代码

private synchronized void buildGoogleApiClient() 
    Log.i("TAG", "Building GoogleApiClient");
    mGoogleApiClient = new GoogleApiClient.Builder(getActivity().getApplicationContext())
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();
    createLocationRequest();


private void createLocationRequest() 
    mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(UPDATE_INTERVAL);
    mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(mLocationRequest);
    //**************************
    builder.setAlwaysShow(true); //this is the key ingredient
    //**************************


@Override
public void onConnected(Bundle bundle) 

    Location mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
    // Note that this can be NULL if last location isn't already known.
    if (mCurrentLocation != null) 
        // Print current location if not null
        Log.d("DEBUG", "current location: " + mCurrentLocation.toString());
        currentlatitude = mCurrentLocation.getLatitude();
        currentlongitude = mCurrentLocation.getLongitude();
    
    // Begin polling for new location updates.
    startLocationUpdates();


private void startLocationUpdates() 

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


private void stopLocationUpdates() 
    LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);


@Override
public void onConnectionSuspended(int i) 
    if (i == CAUSE_SERVICE_DISCONNECTED) 
        Toast.makeText(getActivity().getApplicationContext(), "Disconnected. Please re-connect.", Toast.LENGTH_SHORT).show();
     else if (i == CAUSE_NETWORK_LOST) 
        Toast.makeText(getActivity().getApplicationContext(), "Network lost. Please re-connect.", Toast.LENGTH_SHORT).show();
    
    mGoogleApiClient.connect();


@Override
public void onLocationChanged(Location location) 
    String msg = "Updated Location: " +
            Double.toString(location.getLatitude()) + "," +
            Double.toString(location.getLongitude());
    Toast.makeText(getActivity().getApplicationContext(), msg, Toast.LENGTH_SHORT).show();

    currentlatitude = location.getLatitude();
    currentlongitude = location.getLongitude();


@Override
public void onConnectionFailed(ConnectionResult connectionResult) 


*当我在以下 API23 设备中使用时,此代码工作正常,但当我尝试在棉花糖设备上时,它给出当前位置 0.0,0.0 *

下面是我的 Manifest 文件

    <uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

<!-- Required to show current location -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION"/>

<uses-library android:name="com.google.android.maps" />

<!-- Required OpenGL ES 2.0. for Maps V2 -->
<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".SplashActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:theme="@style/Theme.AppCompat.NoActionBar" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".HomeMainActivity"
        android:label="@string/app_name"
        android:windowSoftInputMode="adjustPan"
        android:screenOrientation="portrait"
        >
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>

        <meta-data
            android:name="android.app.searchable"
            android:resource="@layout/searchable" />
    </activity>
    <activity
        android:name=".HomeActivity"
        android:screenOrientation="portrait" />
    <activity
        android:name=".DoctorsDetailsActivity"
        android:screenOrientation="portrait" />
    <activity android:name=".ServiceActivity" />

    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />

【问题讨论】:

您的问题到底是什么?你的代码是什么样的,到目前为止你尝试了什么?请阅读how to ask a question 上的基础知识并更新您的。由于不清楚您的要求,我现在投票结束。 @VishalHalani 你试过我在下面的回答中写的吗?? @Abhishek 我试过了,但它仍然给 0 latLng。 @VishalHalani 发布带有代码的清单文件 @Abhishek 我已经发布了我的清单文件代码。 【参考方案1】:

使用下面的代码。希望这是有用的。

确保您只在真实设备上运行此代码。

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_
    android:layout_>

    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_
        android:layout_
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"/>

</LinearLayout>

MainActivity.java

import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationManager;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
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.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener, LocationListener

    GoogleMap mGoogleMap;
    SupportMapFragment mapFrag;
    LocationRequest mLocationRequest;
    GoogleApiClient mGoogleApiClient;
    Location mLastLocation;
    Marker mCurrLocationMarker;
    LocationManager locationManager;

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

        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
        
            checkLocationPermission();
        
        else
        
            if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
            
                showGPSDisabledAlertToUser();
            
        

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

    private void showGPSDisabledAlertToUser()
    
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
        alertDialogBuilder.setMessage("GPS is disabled in your device. Would you like to enable it?")
                .setCancelable(false)
                .setPositiveButton("Settings", new DialogInterface.OnClickListener()
                
                    public void onClick(DialogInterface dialog, int id)
                    
                        Intent callGPSSettingIntent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                        startActivity(callGPSSettingIntent);

                        mapFrag.getMapAsync(MainActivity.this);
                    
                );
        alertDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener()
        
            public void onClick(DialogInterface dialog, int id)
            
                dialog.cancel();
            
        );
        AlertDialog alert = alertDialogBuilder.create();
        alert.show();
    

    @Override
    public void onPause()
    
        super.onPause();

        //stop location updates when Activity is no longer active
        if (mGoogleApiClient != null)
        
            LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
        
    

    @Override
    public void onMapReady(GoogleMap googleMap)
    
        mGoogleMap=googleMap;
        mGoogleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);

        //Initialize Google Play Services
        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
        
            if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
            
                buildGoogleApiClient();
                mGoogleMap.setMyLocationEnabled(true);
            
        
        else
        
            buildGoogleApiClient();
            mGoogleMap.setMyLocationEnabled(true);
        
    

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

    @Override
    public void onConnected(Bundle bundle)
    
        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(1000);
        mLocationRequest.setFastestInterval(1000);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

        if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
        
            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
        
    

    @Override
    public void onConnectionSuspended(int i) 

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) 

    @Override
    public void onLocationChanged(Location location)
    
        mLastLocation = location;
        if (mCurrLocationMarker != null)
        
            mCurrLocationMarker.remove();
        

        //Place current location marker
        LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
        MarkerOptions markerOptions = new MarkerOptions();
        markerOptions.position(latLng);
        markerOptions.title("Current Position");
        markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA));
        mCurrLocationMarker = mGoogleMap.addMarker(markerOptions);

        //move map camera
        mGoogleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
        mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(11));

        //stop location updates
        if (mGoogleApiClient != null)
        
            LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
        
    

    public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99;

    public boolean checkLocationPermission()
    
        if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)
        
            // Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.ACCESS_FINE_LOCATION))
            
                // Show an expanation to the user *asynchronously* -- don't block
                // this thread waiting for the user's response! After the user
                // sees the explanation, try again to request the permission.

                //Prompt the user once explanation has been shown
                ActivityCompat.requestPermissions(this, new String[]android.Manifest.permission.ACCESS_FINE_LOCATION,
                        MY_PERMISSIONS_REQUEST_LOCATION);
            
            else
            
                // No explanation needed, we can request the permission.
                ActivityCompat.requestPermissions(this, new String[]android.Manifest.permission.ACCESS_FINE_LOCATION,
                        MY_PERMISSIONS_REQUEST_LOCATION);
            
            return false;
        
        else
        
            if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
            
                showGPSDisabledAlertToUser();
            

            return true;
        
    

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)
    
        switch (requestCode)
        
            case MY_PERMISSIONS_REQUEST_LOCATION:
            
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
                
                    // permission was granted, yay! Do the
                    // contacts-related task you need to do.
                    if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
                    

                        if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
                        
                            showGPSDisabledAlertToUser();
                        

                        if (mGoogleApiClient == null)
                        
                            buildGoogleApiClient();
                        
                        mGoogleMap.setMyLocationEnabled(true);
                    
                
                else
                
                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                    Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show();
                
                return;
            
            // other 'case' lines to check for other
            // permissions this app might request
        
    

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.sneha.mymapdemo">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="YOUR API KEY"/>

    </application>

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

</manifest>

【讨论】:

【参考方案2】:

经过一些调试和搜索,我得到了确切的问题

GoogleAPIclient onConnected() 没有被调用,所以它调用了 onConnectionFailed() 方法

在那个方法中我发现错误代码是 2 这意味着需要播放服务更新

所以我在 gradle 文件中更改了与 Device Playservice 版本相同的播放服务,所以我得到了当前位置

我在这里发布一些代码:

private synchronized void buildGoogleApiClient() 
 Log.i("TAG", "Building GoogleApiClient");
    mGoogleApiClient = new GoogleApiClient.Builder(getActivity().getApplicationContext())
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();
    createLocationRequest();

private void createLocationRequest() 
    Log.i("TAG", "CreateLocationRequest");
    mLocationRequest = new LocationRequest();
    long UPDATE_INTERVAL = 10 * 1000;
    mLocationRequest.setInterval(UPDATE_INTERVAL);
    long FASTEST_INTERVAL = 10000;
    mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(mLocationRequest);
    //**************************
    builder.setAlwaysShow(true); //this is the key ingredient
    //**************************



private void startLocationUpdates() 

    Log.i("TAG", "StartLocationUpdates");

    if (Build.VERSION.SDK_INT >= 23) 
        if (ContextCompat.checkSelfPermission(getActivity().getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(getActivity().getApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) 
            // TODO: Consider calling
            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,
                    mLocationRequest, this);

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



private void stopLocationUpdates() 
    Log.i("TAG", "StopLocationUpdates");
    LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);


 @Override
public void onConnectionSuspended(int i) 
    Log.i("TAG", "onConnectionSuspended");
    if (i == CAUSE_SERVICE_DISCONNECTED) 
        Toast.makeText(getActivity().getApplicationContext(), "Disconnected. Please re-connect.", Toast.LENGTH_SHORT).show();
     else if (i == CAUSE_NETWORK_LOST) 
        Toast.makeText(getActivity().getApplicationContext(), "Network lost. Please re-connect.", Toast.LENGTH_SHORT).show();
    
    mGoogleApiClient.connect();


@Override
public void onLocationChanged(Location location) 
    Log.i("TAG", "OnLocationChanged");
    Log.i("TAG", "Current Location==>" + location);
    currentlatitude = location.getLatitude();
    currentlongitude = location.getLongitude();



    @Override
public void onConnectionFailed(ConnectionResult connectionResult) 
if (connectionResult.hasResolution()) 
        try 
            // Start an Activity that tries to resolve the error
            connectionResult.startResolutionForResult(getActivity(), connectionResult.RESOLUTION_REQUIRED);
         catch (IntentSender.SendIntentException e) 
            e.printStackTrace();
        
     else 
        Log.e("TAG", "Location services connection failed with code==>" + connectionResult.getErrorCode());
        Log.e("TAG", "Location services connection failed Because of==> " + connectionResult.getErrorMessage());
    



@Override
public void onDestroy() 
    super.onDestroy();
    if (mGoogleApiClient != null)
        mGoogleApiClient.disconnect();

@Override
public void onConnected(Bundle bundle) 
    Location mCurrentLocation;

    Log.i("TAG", "OnConnected");
    if (Build.VERSION.SDK_INT >= 23) 
        if (ContextCompat.checkSelfPermission(getActivity().getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(getActivity().getApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) 
            // TODO: Consider calling
            mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);

            // Note that this can be NULL if last location isn't already known.
            if (mCurrentLocation != null) 
                // Print current location if not null
                Log.d("DEBUG", "current location: " + mCurrentLocation.toString());
                currentlatitude = mCurrentLocation.getLatitude();
                currentlongitude = mCurrentLocation.getLongitude();
             else 
                startLocationUpdates();
            


        
     else 
        mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);

        // Note that this can be NULL if last location isn't already known.
        if (mCurrentLocation != null) 
            // Print current location if not null
            Log.d("DEBUG", "current location: " + mCurrentLocation.toString());
            currentlatitude = mCurrentLocation.getLatitude();
            currentlongitude = mCurrentLocation.getLongitude();
        
        // Begin polling for new location updates.
        startLocationUpdates();
    

更多参考官方文档https://developers.google.com/android/guides/setup

【讨论】:

您好!你能告诉我天气吗,如果我们没有互联网连接,这将起作用.. ??【参考方案3】:

在您的 androidmanifest.xml

中添加这些权限

然后进入设置----->应用----->你的应用--->授予位置权限

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

您还可以添加运行时权限。 http://developer.android.com/intl/es/training/permissions/requesting.html

GPSTacker.java

import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location; 
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
import android.util.Log;
import java.security.Provider;

public class GPSTracker extends Activity implements LocationListener 
private final Context mContext;
// flag for GPS status
boolean isGPSEnabled = false;
// flag for network status
boolean isNetworkEnabled = false;
// flag for GPS status
boolean canGetLocation = false;
Location location; // location
double latitude; // latitude
double longitude; // longitude
// The minimum distance to change Updates in meters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
// The minimum time between updates in milliseconds
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute
// Declaring a Location Manager
protected LocationManager locationManager;

public GPSTracker(Context context) 
    this.mContext = context;
    getLocation();


public Location getLocation() 
    try 
        locationManager = (LocationManager) mContext
                .getSystemService(LOCATION_SERVICE);

        // getting GPS status
        isGPSEnabled = locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);
        // getting network status
        isNetworkEnabled = locationManager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        if (!isGPSEnabled && !isNetworkEnabled) 
            // no network provider is enabled
         else 
            this.canGetLocation = true;
            if (isNetworkEnabled) 
                locationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER,
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                Log.d("Network", "Network");
                if (locationManager != null) 
                    location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    if (location != null) 
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                    
                
            
            // if GPS Enabled get lat/long using GPS Services
            if (isGPSEnabled) 
                if (location == null) 
                    locationManager.requestLocationUpdates(
                            LocationManager.GPS_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("GPS Enabled", "GPS Enabled");
                    if (locationManager != null) 
                        location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        if (location != null) 
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        
                    
                
            
        
     catch (Exception e) 
        e.printStackTrace();
    
    return location;


/**
 * Stop using GPS listener
 * Calling this function will stop using GPS in your app
 */
@TargetApi(Build.VERSION_CODES.M)
public void stopUsingGPS() 
    if (locationManager != null) 
        if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
              // TODO: Consider calling
            //    public void requestPermissions(@NonNull String[] permissions, int requestCode)
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for Activity#requestPermissions for more details.
            return;
        
        locationManager.removeUpdates(GPSTracker.this);
    


/**
 * Function to get latitude
 */
public double getLatitude() 
    if (location != null) 
        latitude = location.getLatitude();
    
    // return latitude
    return latitude;


/**
 * Function to get longitude
 */
public double getLongitude() 
    if (location != null) 
        longitude = location.getLongitude();
    
    // return longitude
    return longitude;


/**
 * Function to check GPS/wifi enabled
 *
 * @return boolean
 */
public boolean canGetLocation() 
    return this.canGetLocation;


/**
 * Function to show settings alert dialog
 * On pressing Settings button will lauch Settings Options
 */
public void showSettingsAlert() 
    AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
    // Setting Dialog Title
    alertDialog.setTitle("GPS is settings");
    // Setting Dialog Message
    alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");
    // On pressing Settings button
    alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() 
        public void onClick(DialogInterface dialog, int which) 
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            mContext.startActivity(intent);
        
    );
    // on pressing cancel button
    alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() 
        public void onClick(DialogInterface dialog, int which) 
            dialog.cancel();
        
    );
    // Showing Alert Message
    alertDialog.show();


@Override
public void onLocationChanged(Location currentLocation) 
// TODO Auto-generated method stub
    this.location = currentLocation;
    getLatitude();
    getLongitude();



@Override
public void onProviderDisabled(String provider) 
// TODO Auto-generated method stub


@Override
public void onProviderEnabled(String provider) 
// TODO Auto-generated method stub



@Override
public void onStatusChanged(String provider, int status, Bundle extras) 
// TODO Auto-generated method stub


DirectionsJSONParser.java

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

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.google.android.gms.maps.model.LatLng;

public class DirectionsJSONParser 

/** Receives a JSONObject and returns a list of lists containing latitude and longitude */
public List<List<HashMap<String,String>>> parse(JSONObject jObject)

    List<List<HashMap<String, String>>> routes = new ArrayList<List<HashMap<String,String>>>() ;
    JSONArray jRoutes = null;
    JSONArray jLegs = null;
    JSONArray jSteps = null;

    try 

        jRoutes = jObject.getJSONArray("routes");

        /** Traversing all routes */
        for(int i=0;i<jRoutes.length();i++)
            jLegs = ( (JSONObject)jRoutes.get(i)).getJSONArray("legs");
            List path = new ArrayList<HashMap<String, String>>();

            /** Traversing all legs */
            for(int j=0;j<jLegs.length();j++)
                jSteps = ( (JSONObject)jLegs.get(j)).getJSONArray("steps");

                /** Traversing all steps */
                for(int k=0;k<jSteps.length();k++)
                    String polyline = "";
                    polyline = (String)((JSONObject)((JSONObject)jSteps.get(k)).get("polyline")).get("points");
                    List<LatLng> list = decodePoly(polyline);

                    /** Traversing all points */
                    for(int l=0;l<list.size();l++)
                        HashMap<String, String> hm = new HashMap<String, String>();
                        hm.put("lat", Double.toString(((LatLng)list.get(l)).latitude) );
                        hm.put("lng", Double.toString(((LatLng)list.get(l)).longitude) );
                        path.add(hm);
                    
                
                routes.add(path);
            
        

     catch (JSONException e) 
        e.printStackTrace();
    catch (Exception e)
    

    return routes;

/**
 * Method to decode polyline points
 * Courtesy : http://jeffreysambells.com/2010/05/27/decoding-polylines-from-google-maps-direction-api-with-java
 * */
private List<LatLng> decodePoly(String encoded) 

    List<LatLng> poly = new ArrayList<LatLng>();
    int index = 0, len = encoded.length();
    int lat = 0, lng = 0;

    while (index < len) 
        int b, shift = 0, result = 0;
        do 
            b = encoded.charAt(index++) - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
         while (b >= 0x20);
        int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
        lat += dlat;

        shift = 0;
        result = 0;
        do 
            b = encoded.charAt(index++) - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
         while (b >= 0x20);
        int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
        lng += dlng;

        LatLng p = new LatLng((((double) lat / 1E5)),
                (((double) lng / 1E5)));
        poly.add(p);
    

    return poly;


现在你想在 Activity 中设置你的位置添加这个

 // create class object
    gps = new GPSTracker(ImageUpload.this);
    // check if GPS enabled
    if (gps.canGetLocation()) 
        double latitude = gps.getLatitude();
        double longitude = gps.getLongitude();

        tv.setText("Latitude:" + latitude + ", Longitude:" + longitude);

     else 
        // can't get location
        // GPS or Network is not enabled
        // Ask user to enable GPS/network in settings
        gps.showSettingsAlert();
    

【讨论】:

android.permission.ACCESS_FINE_LOCATION 这个权限不够啊?为什么要给两个权限? 我无法解决这个问题??你是怎么解决这些问题的??【参考方案4】:

这也许对你有所帮助。

我发现网络提供商在您禁用 GPS 时无法在某些 Android 设备中运行,因为如果未启用 GPS,它们会阻止访问位置数据。

我在很多设备上都试过了 1. 联想k6 note (screen shot1, screen shot2) 2.小​​米米9tscreen shot1 3. 谷歌 Pixel 1 和 Pixel 2

所以有些设备需要启用 GPS 才能从 LocationManager.NETWORK_PROVIDER 访问位置,如果不启用 GPS,您将无法获取位置数据

【讨论】:

以上是关于获取棉花糖中的当前位置 0,其中 23 API 以下使用融合位置给出准确的当前位置的主要内容,如果未能解决你的问题,请参考以下文章

在棉花糖中获取前台应用程序的 packageName 延迟 3 秒

Android Studio getSlotFromBufferLocked:棉花糖中的未知缓冲区错误

在棉花糖中获取蓝牙本地mac地址

棉花糖中的手电筒控制

检测棉花糖中的吐司

清除棉花糖中所有应用程序的缓存?