2

Method written for asking permissions. I am asking multiple permissions.

private void askForPermissions() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            int contactsPermission = checkSelfPermission(Manifest.permission.READ_CONTACTS);
            int extStoragePermission = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
            int cameraPermission = checkSelfPermission(Manifest.permission.CAMERA);
            int recordPermission = checkSelfPermission(Manifest.permission.RECORD_AUDIO);
            int internetPermission = checkSelfPermission(Manifest.permission.INTERNET);

            Log.e("Start_Permission1",""+(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M));
            Log.e("Start_Permission2",""+(contactsPermission != PackageManager.PERMISSION_GRANTED));
            Log.e("Start_Permission3",""+(extStoragePermission != PackageManager.PERMISSION_GRANTED));
            Log.e("Start_Permission4",""+(cameraPermission != PackageManager.PERMISSION_GRANTED));
            Log.e("Start_Permission5",""+(recordPermission != PackageManager.PERMISSION_GRANTED));
            Log.e("Start_Permission6",""+(internetPermission != PackageManager.PERMISSION_GRANTED));


            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && contactsPermission != PackageManager.PERMISSION_GRANTED && extStoragePermission != PackageManager.PERMISSION_GRANTED && cameraPermission != PackageManager.PERMISSION_GRANTED && recordPermission != PackageManager.PERMISSION_GRANTED) {
                Log.e("Start","here i am");
                requestPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE,
                        Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_CONTACTS}, REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);

            }
            Log.e("Start_permission","Asking done..");
}
In onCreate method:

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

    // First take all permissions
        askForPermissions();

        if (!checkNetworkAvailability()) {
            Toast.makeText(getApplicationContext(), "Sorry! You need Internet Connection", Toast.LENGTH_LONG).show();
            spinner.setVisibility(View.INVISIBLE);

        } else {

            if (populateUserData()) {
                spinner = (ProgressBar) findViewById(R.id.spinner);
                spinner.setVisibility(ProgressBar.VISIBLE);
                Log.e("Start_populateUSrData", "User data populated");

                fetchContacts();
    }

@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                           int[] grantResults) {
        switch (requestCode) {
            case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // Permission Granted
                    //insertDummyContact();
                } else {
                    // Permission Denied
                    Toast.makeText(Start.this, "WRITE_CONTACTS Denied", Toast.LENGTH_SHORT)
                            .show();
                }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

Logs:

12-24 16:53:26.251 1465-1465/com.moodoff E/Minikin: addFont failed to create font /system/fonts/NanumGothic.ttf
12-24 16:53:26.252 1465-1465/com.moodoff E/Minikin: addFont failed to create font /system/fonts/DroidSansFallback.ttf
12-24 16:53:26.252 1465-1465/com.moodoff E/Minikin: addFont failed to create font /system/fonts/MTLmr3m.ttf
12-24 16:53:26.434 1465-1465/com.moodoff E/MultiWindowProxy: getServiceInstance failed!
12-24 16:53:26.595 1465-1465/com.moodoff E/Start_Permission1: true
12-24 16:53:26.595 1465-1465/com.moodoff E/Start_Permission2: true
12-24 16:53:26.595 1465-1465/com.moodoff E/Start_Permission3: true
12-24 16:53:26.595 1465-1465/com.moodoff E/Start_Permission4: true
12-24 16:53:26.595 1465-1465/com.moodoff E/Start_Permission5: true
12-24 16:53:26.596 1465-1465/com.moodoff E/Start_Permission6: false
12-24 16:53:26.596 1465-1465/com.moodoff E/Start: here i am
12-24 16:53:26.618 1465-1465/com.moodoff E/Start_permission: Asking done..
12-24 16:53:26.876 1465-1572/com.moodoff E/AndroidRuntime: FATAL EXCEPTION: Thread-1132
                                                           Process: com.moodoff, PID: 1465
                                                           java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{292d428 1465:com.moodoff/u0a207} (pid=1465, uid=10207) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS
                                                               at android.os.Parcel.readException(Parcel.java:1599)
                                                               at android.os.Parcel.readException(Parcel.java:1552)
                                                               at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:3847)
                                                               at android.app.ActivityThread.acquireProvider(ActivityThread.java:5062)
                                                               at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2026)
                                                               at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1517)
                                                               at android.content.ContentResolver.query(ContentResolver.java:482)
                                                               at android.content.ContentResolver.query(ContentResolver.java:441)
                                                               at com.moodoff.ContactList.getContactNames(ContactList.java:135)
                                                               at com.moodoff.helper.DBHelper$1.run(DBHelper.java:73)
                                                               at java.lang.Thread.run(Thread.java:818)

Inspite of the fact that i added askForPermission in the beginning it is reading contacts and throwing up this permission denial error... without contacts read line the app is asking for permission properly and working fine. What can be done?

Santanu
  • 893
  • 3
  • 10
  • 24

2 Answers2

4

You do not have a minimal, complete, and verifiable example here. But, in onCreate(), if checkNetworkAvailability() returns true and populateUserData() returns true, you call fetchContacts(), despite the fact that you may not have the permission yet.

Like many things in Android, requestPermissions() is asynchronous. When your requestPermissions() call returns, the user has not been asked about those permissions, and you do not have them yet. If you are requesting a permission, you cannot perform initialization based upon that permission until onRequestPermissionsResult(), and then only if the user granted the permission.

CommonsWare
  • 986,068
  • 189
  • 2,389
  • 2,491
1

Had same issue ,resolved it by adding the same permissions in manifest,even those were runtime permissions

Kaleem Patel
  • 221
  • 2
  • 8