Android FusedLocationApi Location Service Not Working Properly using Runtime Permission API 23

1.7k views Asked by At

Can anybody help me to solve problem:

onConnected() method why my

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

code not executing; and retrun from checkSelfPermission()

what can i do to work FusedLocationApi properly in this code

my code is below

public class JMSCLocationService extends Service implements GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener,
        LocationListener {
    private final String TAG = "MyAwesomeApp";
    private GoogleApiClient mGoogleApiClient;
    private LocationRequest mLocationRequest;
    // Check Permissions Now
    private static final int REQUEST_LOCATION = 2;
    //private final double radiusInMeters = 1609.34;
    private final double radiusInMeters = 16.34;
    LatLng firstLatLong;
    Location fLoc;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "GoogleApiClient connection has STARTED");
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();

        firstLatLong = new LatLng(0, 0);
        Log.i(TAG, "GoogleApiClient connection has STARTED");
    }

    @Override
    public void onDestroy() {
        // disconnect the client.
        if (mGoogleApiClient != null && mGoogleApiClient.isConnected())
            mGoogleApiClient.disconnect();
        super.onDestroy();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // Connect the client.
        if (mGoogleApiClient != null && !mGoogleApiClient.isConnected()) {
            mGoogleApiClient.connect();
            Log.i(TAG, "GoogleApiClient mGoogleApiClient.connect();");
        }


        if (mGoogleApiClient.isConnected()) {
            Log.i(TAG, "GoogleApiClient mGoogleApiClient.isConnected();");
        }
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {
        mLocationRequest = LocationRequest.create();
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        mLocationRequest.setInterval(1000); // Update location every second

        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // 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 ActivityCompat#requestPermissions for more details.
            //return;
        }
        LocationServices.FusedLocationApi.requestLocationUpdates(
                mGoogleApiClient, mLocationRequest, this);
    }

    @Override
    public void onConnectionSuspended(int i) {
        Log.i(TAG, "GoogleApiClient connection has been suspend");
    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        Log.i(TAG, "GoogleApiClient connection has failed");

    }

    @Override
    public void onLocationChanged(Location mCurrentLocation) {
        Log.i(TAG, "GoogleApiClient Location received: " + mCurrentLocation.toString());
        //test outside
        double mLatitude = mCurrentLocation.getLatitude();
        double mLongitude = mCurrentLocation.getLongitude();
        if(firstLatLong.latitude == 0.0 && firstLatLong.longitude == 0.0){
            firstLatLong = new LatLng(mLatitude,mLongitude);
            fLoc=new Location(mCurrentLocation);
        }
        float[] results = new float[1];
        Location.distanceBetween(firstLatLong.latitude, firstLatLong.longitude,
                mLatitude, mLongitude, results);

        float distanceInMeters = fLoc.distanceTo(mCurrentLocation);
        try{
            if( distanceInMeters > radiusInMeters ){
                Toast.makeText(getBaseContext(), "Outside, distance from center", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(getBaseContext(), "Inside, distance from center", Toast.LENGTH_LONG).show();
            }
        }catch (Exception ex){
            ex.printStackTrace();
        }
    }


}
2

There are 2 answers

4
Monish Kamble On

You have to request the permissions. You are just checking whether your app has the permission.

You are ignoring the result of checkSelfPermission() in your code.

Read the comments, they are self explanatory.

if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // Consider calling
            //    ActivityCompat#requestPermissions
            // 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 ActivityCompat#requestPermissions for more details.
            //return;
        } else {
        LocationServices.FusedLocationApi.requestLocationUpdates(
                mGoogleApiClient, mLocationRequest, this);
}

Read about requesting runtime permissions from :

  1. https://developer.android.com/training/permissions/requesting.html#perm-request
  2. http://www.truiton.com/2016/04/obtaining-runtime-permissions-android-marshmallow-6-0/

Edit 1

I think by ...but at compile time in service it's gives error for must use selfcheck permission you mean the Lint warnings.

You can suppress them by adding @SuppressWarnings("MissingPermission") on top of the method in which you are calling requestLocationUpdates().

But make sure you have are calling requestLocationUpdates() iff you have the permission for it (Mind the if..else block).

5
Divyesh Patel On

USE:

if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
            REQUEST_ID);
    }else{
        LocationServices.FusedLocationApi.requestLocationUpdates(
            mGoogleApiClient, mLocationRequest, this);
}

AND:

 @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case REQUEST_ID: {
                for( int i = 0; i < permissions.length; i++ ) {
                    if( grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                        Log.d("Permissions", "Permission Granted: " + permissions[i]);
                    } else if( grantResults[i] == PackageManager.PERMISSION_DENIED ) {
                        Log.d( "Permissions", "Permission Denied: " + permissions[i] );
                    }
                }
            }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }