Search code examples
androidandroid-studiogpslocationruntime-permissions

Runtime Permissions code is not working for Fine location? android runtime location permissions


I am trying to ask for permission from user but getting the black screen only and also lacking the app. Is their any wayout to update the same so I can get the permission from user.

MainActivity.this

public class MainActivity extends AppCompatActivity {

private BottomNavigationView mBottomNavigationView;
private ActionBar toolbar;
public static final int PERMISSION_FOR_INTERNET = 200;

DatabaseHelperClass dbClass;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    toolbar = getSupportActionBar();
    toolbar.hide();
    checkforPermissions();
    CheckFirstTimeLoad();
    mBottomNavigationView = (BottomNavigationView) findViewById(R.id.bottomNavigationView);
    mBottomNavigationView.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
    CallFragment(new HomeFragment());
}


public void checkforPermissions(){
    String[] permission = {Manifest.permission.INTERNET,
            Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION};

    if (ContextCompat.checkSelfPermission(this.getApplicationContext(),
            permission[0]) == PackageManager.PERMISSION_GRANTED
            && ContextCompat.checkSelfPermission(this.getApplicationContext(),
            permission[1]) == PackageManager.PERMISSION_GRANTED
            && ContextCompat.checkSelfPermission(this.getApplicationContext(),
            permission[2]) == PackageManager.PERMISSION_GRANTED){
    } else {
        checkforPermissions();
    }
}

Please check the Manifest File. However, I added the permission code. AndroidManifest.xml

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

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher_main"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_main_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity"></activity>
    <activity android:name=".WelcomeActivity">
        <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="AIzaSyDZOy6D7hVvtqu6iZy3hP395vZLSYbW1HI"/>
</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" />


Solution

  • First of all this

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

    is a normal permission, you do not need to ask it at runtime just declare it in manifest , it will be granted automatically

    Now here is the example code to ask location permissions

    Step 1:-

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

    Step 2:-

    in onCreate() do this

    public static final int REQUEST_ID_MULTIPLE_PERMISSIONS = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    // rest of the code here
        checkAndroidVersion();
    }
    

    Step 3:-

    this method checkAndroidVersion();

    public void checkAndroidVersion() {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (checkAndRequestPermissions()) {
                  // do your work here
                } else
                {
                }
    
            } else {
    
                // do your work here
            }
    
        }
    

    Step 4:-

    this method

    checkAndRequestPermissions()

    public boolean checkAndRequestPermissions() {
    
            int location = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION);
            List<String> listPermissionsNeeded = new ArrayList<>();
    
            if (location != PackageManager.PERMISSION_GRANTED) {
                listPermissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION);
            }
            if (!listPermissionsNeeded.isEmpty()) {
                ActivityCompat.requestPermissions(MainActivity.this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS);
                return false;
            }
            return true;
        }
    

    Step 5:-

    Handle onRequestPermission() method

    @Override
        public void onRequestPermissionsResult(int requestCode,
                                               String permissions[], int[] grantResults) {
            Log.d("in main on request", "Permission callback called-------");
            switch (requestCode) {
                case REQUEST_ID_MULTIPLE_PERMISSIONS: {
                    Map<String, Integer> perms = new HashMap<>();
    
                    perms.put(Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.PERMISSION_GRANTED);
                    // Fill with actual results from user
                    if (grantResults.length > 0) {
                        for (int i = 0; i < permissions.length; i++)
                            perms.put(permissions[i], grantResults[i]);
                        // Check for both permissions
                        if (perms.get(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                            Log.d("in main on request", "location services permission granted");
                            // do your work here
                        } else {
                            Log.d("in fragment on request", "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(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)) {
                                showDialogOK("Location services  services 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.
                                                        break;
                                                }
                                            }
                                        });
                            }
                            //permission is denied (and never ask again is  checked)
                            //shouldShowRequestPermissionRationale will return false
                            else {
                                Toast.makeText(MainActivity.this, "Go to settings and enable permissions", Toast.LENGTH_LONG)
                                        .show();
                                //                            //proceed with logic by disabling the related features or quit the app.
                            }
                        }
                    }
                }
            }
    
        }
    
    
    
     public void showDialogOK(String message, DialogInterface.OnClickListener okListener) {
            new AlertDialog.Builder(MainActivity.this)
                    .setMessage(message)
                    .setPositiveButton("OK", okListener)
                    .setNegativeButton("Cancel", okListener)
                    .create()
                    .show();
        }