1. Download our Official Android App: Forums for Android!

Runtime Location permission getting turned off at some point while accessing GPS location in android

Discussion in 'Android Development' started by harishdsm, Oct 10, 2017.

  1. harishdsm

    harishdsm Lurker
    Thread Starter
    Rank:
    None
    Points:
    5
    Posts:
    2
    Joined:
    Oct 10, 2017

    Oct 10, 2017
    2
    0
    5
    I am working on an android application that is used for tracking mobiles.
    I have used location listener to get the latitude & longitude values from the GPS at a time interval of 10 secs.
    In case of internet connectivity,the values(lat,longi) are directly sent to my server and if there is internet failure values are stored in phone's local database and then sent to the server.
    The app was working fine while tested internally and right now the problem found is :
    Run-time Location permission which the app asks at the start up()is getting turned off automatically at some point during the real tracking due to some unknown reason.
    I went several trips(outside) for tracking purpose,the same app is working fine and at times it is not working in the same route.
    I have deeply monitored and found that run-time location permission is getting off(by creating a log) ,so the listener is not able to get the location updates thereby app gets hanged and tracking stops.
    Please help me with this so that i can find a solution.
     

    Advertisement

  2. Hardik Parsania

    Rank:
    None
    Points:
    5
    Posts:
    1
    Joined:
    Mar 13, 2018

    Mar 13, 2018
    1
    0
    5
    Male
    I had same problem.
    Then I used below code to get runtime permissions in splash screen.
    Problem was solved after that.

    Original tutorial is present at

    Android Runtime Permissions Tutorial

    import android.Manifest;
    import android.app.AlertDialog;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.net.Uri;
    import android.os.Handler;
    import android.support.v4.app.ActivityCompat;
    import android.support.v4.content.ContextCompat;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;

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

    public class MainActivity extends AppCompatActivity {

    public static final int REQUEST_ID_MULTIPLE_PERMISSIONS = 1;
    private static int SPLASH_TIME_OUT = 2000;
    private String TAG = "tag";

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

    if(checkAndRequestPermissions()) {
    // carry on the normal flow, as the case of permissions granted.
    new Handler().postDelayed(new Runnable() {
    @override
    public void run() {
    // This method will be executed once the timer is over
    // Start your app main activity

    Intent i = new Intent(MainActivity.this, WelcomeActivity.class);
    startActivity(i);

    // close this activity
    finish();
    }
    }, SPLASH_TIME_OUT);
    }
    }

    private boolean checkAndRequestPermissions() {
    int camerapermission = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
    int writepermission = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    int permissionLocation = ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION);
    int permissionRecordAudio = ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO);


    List<String> listPermissionsNeeded = new ArrayList<>();

    if (camerapermission != PackageManager.PERMISSION_GRANTED) {
    listPermissionsNeeded.add(Manifest.permission.CAMERA);
    }
    if (writepermission != PackageManager.PERMISSION_GRANTED) {
    listPermissionsNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
    }
    if (permissionLocation != PackageManager.PERMISSION_GRANTED) {
    listPermissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION);
    }
    if (permissionRecordAudio != PackageManager.PERMISSION_GRANTED) {
    listPermissionsNeeded.add(Manifest.permission.RECORD_AUDIO);
    }
    if (!listPermissionsNeeded.isEmpty()) {
    ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS);
    return false;
    }
    return true;
    }
    @override
    public void onRequestPermissionsResult(int requestCode,
    String permissions[], int[] grantResults) {
    Log.d(TAG, "Permission callback called-------");
    switch (requestCode) {
    case REQUEST_ID_MULTIPLE_PERMISSIONS: {

    Map<String, Integer> perms = new HashMap<>();
    // Initialize the map with both permissions
    perms.put(Manifest.permission.CAMERA, PackageManager.PERMISSION_GRANTED);
    perms.put(Manifest.permission.WRITE_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED);
    perms.put(Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.PERMISSION_GRANTED);
    perms.put(Manifest.permission.RECORD_AUDIO, PackageManager.PERMISSION_GRANTED);
    // Fill with actual results from user
    if (grantResults.length > 0) {
    for (int i = 0; i < permissions.length; i++)
    perms.put(permissions, grantResults);
    // Check for both permissions
    if (perms.get(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED
    && perms.get(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
    && perms.get(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
    && perms.get(Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED) {
    Log.d(TAG, "sms & location services permission granted");
    // process the normal flow
    Intent i = new Intent(MainActivity.this, WelcomeActivity.class);
    startActivity(i);
    finish();
    //else any one or both the permissions are not granted
    } else {
    Log.d(TAG, "Some permissions are not granted ask again ");
    //permission is denied (this is the first time, when "never ask again" is not checked) so ask again explaining the usage of permission
    // // shouldShowRequestPermissionRationale will return true
    //show the dialog or snackbar saying its necessary and try again otherwise proceed with setup.
    if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)
    || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
    || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)
    || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO)) {
    showDialogOK("Service Permissions are required for this app",
    new DialogInterface.OnClickListener() {
    @override
    public void onClick(DialogInterface dialog, int which) {
    switch (which) {
    case DialogInterface.BUTTON_POSITIVE:
    checkAndRequestPermissions();
    break;
    case DialogInterface.BUTTON_NEGATIVE:
    // proceed with logic by disabling the related features or quit the app.
    finish();
    break;
    }
    }
    });
    }
    //permission is denied (and never ask again is checked)
    //shouldShowRequestPermissionRationale will return false
    else {
    explain("You need to give some mandatory permissions to continue. Do you want to go to app settings?");
    // //proceed with logic by disabling the related features or quit the app.
    }
    }
    }
    }
    }

    }

    private void showDialogOK(String message, DialogInterface.OnClickListener okListener) {
    new AlertDialog.Builder(this)
    .setMessage(message)
    .setPositiveButton("OK", okListener)
    .setNegativeButton("Cancel", okListener)
    .create()
    .show();
    }
    private void explain(String msg){
    final android.support.v7.app.AlertDialog.Builder dialog = new android.support.v7.app.AlertDialog.Builder(this);
    dialog.setMessage(msg)
    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
    @override
    public void onClick(DialogInterface paramDialogInterface, int paramInt) {
    // permissionsclass.requestPermission(type,code);
    startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:com.exampledemo.parsaniahardik.marshmallowpermission")));
    }
    })
    .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
    @override
    public void onClick(DialogInterface paramDialogInterface, int paramInt) {
    finish();
    }
    });
    dialog.show();
    }
    }
     

Share This Page

Loading...