我需要获取活动才能请求权限

时间:2016-08-16 17:04:20

标签: android android-permissions

我正在使用“数字”,允许用户使用他们的电话号码登录。它由Twitter提供。无论如何,由于我正在为API级别23开发,我需要请求允许从用户读取联系人。我正在覆盖它提供给我的onClick()方法,以便在运行时请求权限。但是,我不知道如何为构造函数传递Activity

这是我实例化的类:

public class DigitsRegisterButton extends DigitsAuthButton {

    final int loginPerm = 2;
    LoginActivity activity;

    public DigitsRegisterButton(Context c) {
        super(c);
        init();
    }
    public DigitsRegisterButton(Context c, AttributeSet attrs) {
        super(c, attrs);
        init();
    }

    public DigitsRegisterButton(Context c, AttributeSet attrs, int defStyle) {
        super(c, attrs, defStyle);
        init();
    }

    @Override
    public void onClick(View v) {
        int loginPermissionCheck = ContextCompat.checkSelfPermission(getContext(), Manifest.permission.CAMERA);
        if (loginPermissionCheck != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(/* Need Activity Here */, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, loginPerm);
        }
        super.onClick(v);
    }
}
onClick()中被覆盖的

DigitsAuthButton

@Override
    public void onClick(View v) {
        final DigitsAuthConfig digitsAuthConfig = digitsAuthConfigBuilder.build();
        getDigitsClient().startSignUp(digitsAuthConfig);

        if (onClickListener != null) {
            onClickListener.onClick(v);
        }
    }

活动类:

public class LoginActivity extends AppCompatActivity implements LocationListener {

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

        DigitsRegisterButton digitsButton = (DigitsRegisterButton) findViewById(R.id.account_auth_button);
        digitsButton.setCallback(new AuthCallback() {

            @Override
            public void success(DigitsSession session, String phoneNumber) {
                // TODO: associate the session userID with your user model
                //username phone number, password is auth session
                Toast.makeText(getApplicationContext(), "Authentication successful for " + phoneNumber, Toast.LENGTH_LONG).show();
                //new Login(getParentFragment(), )
            }

            @Override
            public void failure(DigitsException exception) {
                Log.d("Digits", "Sign in with Digits failure", exception);
            }
        });
    }

1 个答案:

答案 0 :(得分:0)

我建议在启用按钮之前请求权限。毕竟,requestPermissions()是异步的,我会假设你在调用super.onClick()时会崩溃。如果您没有权限(在requestPermissions()中调用onCreate()),请将该按钮停用,如果您现在有权限,则在onRequestPermissionsResult()启用该按钮。

恕我直言,请求权限是GUI体系结构中的控制器/演示者事物,而不是视图事物。

根据您的评论进行澄清......

您可以致电getContext()并将其转换为Activity,就像您的情况一样,实际上 Activity

但是,您的onClick()逻辑已被破坏。如果您没有权限,则无法链接到super.onClick(),就像您在提问时一样。毕竟,请求权限的背后一点是因为不能只使用现有的按钮点击逻辑,否则您将崩溃。而且,正如我之前提到的,requestPermissions()是异步的,因此在requestPermissions()返回时您将无法获得权限。

您的onClick()需要看起来更像这样:

@Override
public void onClick(View v) {
    int loginPermissionCheck = ContextCompat.checkSelfPermission(getContext(), Manifest.permission.CAMERA);
    if (loginPermissionCheck != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions((Activity)getContext(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, loginPerm);
    }
    else {
        super.onClick(v);
    }
}

这看起来不太好,因为该按钮无法正确响应点击事件。

我对Fabric不太了解,但希望他们提供一些方法来进行此身份验证,而不是使用此按钮,您可以更好地控制权限过程。更好的是,Fabric可以提供用于处理运行时权限逻辑的钩子。