We are Borg
We are Borg

Reputation: 5313

Android : Checking permissions not working

I am working on an Android project in which I am trying to integrate permission check mechanism for reading and writing contacts with this library. ALthough I have done the steps which are shown in library and the annotations properly, I am getting an error. What am I doing wrong?

Code :

@RuntimePermissions
public class SwapContacts extends Activity implements SearchView.OnQueryTextListener {

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

    @OnShowRationale({Manifest.permission.READ_CONTACTS,Manifest.permission.WRITE_CONTACTS})
    void showRationaleForCamera(PermissionRequest request) {
        showRationaleDialog(R.string.permission_contacts_rationale, request);
    }

    private void showRationaleDialog(@StringRes int messageResId, final PermissionRequest request) {
        new AlertDialog.Builder(this)
                .setPositiveButton(R.string.button_allow, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(@NonNull DialogInterface dialog, int which) {
                        request.proceed();
                    }
                })
                .setNegativeButton(R.string.button_deny, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(@NonNull DialogInterface dialog, int which) {
                        request.cancel();
                    }
                })
                .setCancelable(false)
                .setMessage(messageResId)
                .show();
    }

    @OnPermissionDenied({Manifest.permission.READ_CONTACTS,Manifest.permission.WRITE_CONTACTS})
    void showDeniedForCamera() {
        Toast.makeText(this,"Permission denied", Toast.LENGTH_LONG).show();
    }

 @NeedsPermission({Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS})
     void initView() {
// Contacts code 
}

Update

Error log :

7:33:25.112 1364-1364/com.digital.development.myapp E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.digital.development.myapp, PID: 1364
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.digital.development.myapp/com.digital.development.myapp.Activity.SwapContacts}: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{b5f7da5 1364:com.digital.development.myapp/u0a162} (pid=1364, uid=10162) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
        at android.app.ActivityThread.-wrap11(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
        Caused by: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{b5f7da5 1364:com.digital.development.myapp/u0a162} (pid=1364, uid=10162) 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:3550)
        at android.app.ActivityThread.acquireProvider(ActivityThread.java:4778)
        at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2018)
        at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1468)
        at android.content.ContentResolver.query(ContentResolver.java:475)
        at android.content.ContentResolver.query(ContentResolver.java:434)
        at com.digital.development.myapp.Activity.SwapContacts.initView(SwapContacts.java:123)
        at com.digital.development.myapp.Activity.SwapContacts.onCreate(SwapContacts.java:70)
        at android.app.Activity.performCreate(Activity.java:6237)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
        at android.app.ActivityThread.-wrap11(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:148) 
        at android.app.ActivityThread.main(ActivityThread.java:5417) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Updated code

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.swap_contacts);
        SwapContactsPermissionsDispatcher.initViewWithCheck(this);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        // NOTE: delegate the permission handling to generated method
        SwapContactsPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
    }

Upvotes: 0

Views: 417

Answers (2)

j2ko
j2ko

Reputation: 2539

I guess the problem is that you are calling initView() explicitly. You need to call something like SwapContactsPermissionsDispatcher.initViewWithCheck(this)

Also should be added:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    // NOTE: delegate the permission handling to generated method
    SwapContactsPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}

Upvotes: 0

Nas
Nas

Reputation: 2198

Add this permission in manifest

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

Upvotes: 1

Related Questions