我正在使用“数字”,允许用户使用他们的电话号码登录。它由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);
}
});
}
答案 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可以提供用于处理运行时权限逻辑的钩子。