简体   繁体   English

无法使用android maps活动和Fused Location API获取我的当前位置

[英]Cannot get my current location using android maps activity and Fused Location API

I am trying to get my current location using GoogleApiClient and LocationListner. 我正在尝试使用GoogleApiClient和LocationListner获取当前位置。 Below is my code which I got from Here . 以下是我从这里获得的代码。 But the problem is when I start this app in mobile. 但是问题是当我在手机上启动此应用程序时。 It is not giving me my current location. 它没有给我我当前的位置。 I also have checked in debug mode. 我还检查了调试模式。 Latitude and Longitude are not updating in variables. 纬度和经度不会在变量中更新。 Please check this code and guide me where i am doing wrong or any other logical error. 请检查此代码,并指导我在哪里做错了或任何其他逻辑错误。 In tutorial developer make a boolean type function named checkLocationPermission() . 在教程开发人员中,创建一个名为checkLocationPermission()的布尔类型函数。 But this function never used in application. 但是此功能从未在应用程序中使用过。 Where should I call that function. 我应该在哪里调用该函数。

Thanks in advance 提前致谢

Here are my coding files AndroidManifest.xml 这是我的编码文件AndroidManifest.xml

`<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.sufian.androidmaps">
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_maps_key" />
        <activity
            android:name=".MapsActivity"
            android:label="@string/title_activity_maps">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>`

and My MapsActivity.java File is below ` 并且我的MapsActivity.java文件位于`

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

    private GoogleMap mMap;
    GoogleApiClient mGoogleApiClient;
    LocationRequest mLocationRequest;
    Location mLastLocation;
    Marker mCurrLocationMarker;

    @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;
        //mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);

        //initialize google play services
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
            if (ContextCompat.checkSelfPermission(this,
                    Manifest.permission.ACCESS_FINE_LOCATION)
                    == PackageManager.PERMISSION_GRANTED) {
                buildGoogleApiClient();
                mMap.setMyLocationEnabled(true);
            }
        }
        else {
            buildGoogleApiClient();
            mMap.setMyLocationEnabled(true);
        }
    }

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

    @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 = mMap.addMarker(markerOptions);

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

        //stop location updates
        if (mGoogleApiClient != null) {
            LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, (com.google.android.gms.location.LocationListener) this);
        }

    }

    @Override
    public void onStatusChanged(String s, int i, Bundle bundle) {

    }

    @Override
    public void onProviderEnabled(String s) {

    }

    @Override
    public void onProviderDisabled(String s) {

    }

    public static final int MY_PERMISSIONS_REQUEST_LOCATION = 100;
    public boolean checkLocationPermission(){
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {

            // Asking user if explanation is needed
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.ACCESS_FINE_LOCATION)) {

                //Prompt the user once explanation has been shown
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                        MY_PERMISSIONS_REQUEST_LOCATION);


            } else {
                // No explanation needed, we can request the permission.
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                        MY_PERMISSIONS_REQUEST_LOCATION);
            }
            return false;
        } else {
            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.
                    if (ContextCompat.checkSelfPermission(this,
                            Manifest.permission.ACCESS_FINE_LOCATION)
                            == PackageManager.PERMISSION_GRANTED) {

                        if (mGoogleApiClient == null) {
                            buildGoogleApiClient();
                        }
                        mMap.setMyLocationEnabled(true);
                    }
                } else {
                    //toast here
                }
                return;
            }
        }
    }
    @Override
    public void onConnected(@Nullable Bundle bundle) {
    mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(1000);
    mLocationRequest.setFastestInterval(1000);     
    mLocationRequest.setPriority
    (LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

        if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.ACCESS_FINE_LOCATION)
            == PackageManager.PERMISSION_GRANTED) { 
            LocationServices.FusedLocationApi
            .requestLocationUpdates(mGoogleApiClient,
            mLocationRequest,
            (com.google.android.gms.location.
            LocationListener) this);
        }
    }
    @Override
    public void onConnectionSuspended(int i){
    }

The reason your not receiving update locations is because you check if you have location permissions which you don't have before building the Google ApiClient which triggers the location updates. 无法接收更新位置的原因是,在构建触发位置更新的Google ApiClient之前,请检查您是否具有不具有的位置权限。

From Android 6 and higher these aren't granted automatically. 从Android 6及更高版本开始,不会自动授予这些权限。 But if you call checkLocationPermission() in OnCreate it should prompt the user to grant the permission as soon as you launch the activity 但是,如果您在OnCreate调用checkLocationPermission() ,则应在启动活动后提示用户授予权限。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 使用Android Studio上的Maps API获取当前位置 - Get a current location with maps api on android studio 使用 fused Location Provider 获取当前位置 - Get current location with fused Location Provider 在非活动java类中使用适用于Android的Fused Location提供程序,并在主Activity类中获取经度和纬度 - Using Fused Location provider for android in a non activity java class and get longitude and latitude in main Activity class Android请求权限融合位置API返回TODO无法解析 - Android request permission Fused Location API return TODO cannot resolve 如何在Android Google Maps API V2中获取当前位置? - How to get current location in android google maps api V2? 使用 Google 地图 API 时没有显示“我的当前位置”按钮 - No 'My Current Location' button showing when using Google Maps API 如何使用谷歌地图 API 在 android 工作室找到我当前的位置? - How to find my current location in android studio using Google Maps API? 使用 Fused Location API 和应用程序意外崩溃 - Using Fused Location API and App Crashing Unexpectedly 融合位置API-在后台平衡,但有时会获取GPS位置 - Fused Location API - Balanced in background but sometimes get GPS location Android - 融合位置:如何获得新鲜的位置 - Android - Fused Location: How to get force fresh location
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM