Android:检查权限不起作用

时间:2016-09-05 12:09:42

标签: java android android-permissions

我正在开发一个Android项目,我正在尝试集成权限检查机制来读取和写入this库的联系人。虽然我已经完成了库中显示的步骤和正确的注释,但我收到了一个错误。我做错了什么?

代码:

@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 
}

更新

错误日志:

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) 

更新了代码

 @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);
    }

2 个答案:

答案 0 :(得分:0)

在清单

中添加此权限
 <uses-permission android:name="android.permission.READ_CONTACTS" />
 <uses-permission android:name="android.permission.WRITE_CONTACTS" />

答案 1 :(得分:0)

我想问题是你明确地调用了initView()。你需要打电话给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);
}