获取用户电子邮件Firebase身份验证

时间:2018-11-29 10:02:18

标签: android firebase-authentication android-permissions user-permissions shopify-app

我正在尝试做这样的事情

shopify screenshot 我在shopify应用程序和discord应用程序等一些应用程序中发现了此弹出对话框,一旦打开注册或登录页面对话框,就会弹出所有可能的电子邮件。

现在我的问题是如何在不要求用户获得联系许可的情况下实现类似目的。

我当前的代码是:

private void addAdapterToViews() {
    Account[] accounts = AccountManager.get(getActivity()).getAccounts();
    Set<String> emailSet = new HashSet<String>();
    for (Account account : accounts) {
        if (EMAIL_PATTERN.matcher(account.name).matches()) {
            emailSet.add(account.name);
        }
    }
    binding.autoemail.setAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_dropdown_item_1line, new ArrayList<String>(emailSet)));
}

private boolean mayRequestContacts() {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        return true;
    }
    if (getActivity().checkSelfPermission(READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
        return true;
    }
    if (shouldShowRequestPermissionRationale(READ_CONTACTS)) {
        requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
        Snackbar.make(binding.autoemail, R.string.permission_rationale, Snackbar.LENGTH_INDEFINITE)
                .setAction(android.R.string.ok, new View.OnClickListener() {
                    @Override
                    @TargetApi(Build.VERSION_CODES.M)
                    public void onClick(View v) {
                        requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
                    }
                });
    } else {
        requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
    }
    return false;
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {
    if (requestCode == REQUEST_READ_CONTACTS) {
        if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            addAdapterToViews();
        }
    }
}

如果用户尝试在权限得到许可的情况下尝试在电子邮件edittext中键入任何字母,则此代码对我来说很好用。

4 个答案:

答案 0 :(得分:2)

也许这不是您想要的,但是我真的建议您看一下Authentication with Firebase和帮助程序库FirebaseUI。他们已经实现了所有样板,并且配置,定制和设置非常容易。

答案 1 :(得分:2)

凭据API,用于检索登录提示,例如用户名和电子邮件地址。

在Android 6.0(棉花糖)及更高版本上,您的应用无需请求任何设备或运行时权限即可使用凭据API检索登录提示

HintRequest hintRequest = new HintRequest.Builder()
        .setHintPickerConfig(new CredentialPickerConfig.Builder()
                .setShowCancelButton(true)
                .build())
        .setEmailAddressIdentifierSupported(true)
        .setAccountTypes(IdentityProviders.GOOGLE)
        .build();

PendingIntent intent = mCredentialsClient.getHintPickerIntent(hintRequest);
try {
    startIntentSenderForResult(intent.getIntentSender(), RC_HINT, null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
    Log.e(TAG, "Could not start hint picker Intent", e);
}

HintRequest Builder Google Documentation

答案 2 :(得分:0)

没有运行时权限将无法获得访问用户的机密信息(例如,电子邮件id)。

答案 3 :(得分:0)

到目前为止,我发现的是使用Google服务在未经任何许可的情况下使用以下代码获取所有用户电子邮件:

private static final int RC_SIGN_IN = 100;

OnCreate()或按钮内部单击:

AuthUI.SignInIntentBuilder builder = AuthUI.getInstance().createSignInIntentBuilder();

if (getSelectedTosUrl() != null && getSelectedPrivacyPolicyUrl() != null) {
    builder.setTosAndPrivacyPolicyUrls(getSelectedTosUrl(), getSelectedPrivacyPolicyUrl());
}
builder.build();
startActivityForResult(builder.build(), RC_SIGN_IN);

并获得结果

 @Nullable
    private String getSelectedPrivacyPolicyUrl() {

        return null;
    }

    @Nullable
    private String getSelectedTosUrl() {

        return null;
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == RC_SIGN_IN) {
            handleSignInResponse(resultCode, data);
        }
    }

    private void handleSignInResponse(int resultCode, @Nullable Intent data) {
        IdpResponse response = IdpResponse.fromResultIntent(data);

        // Successfully signed in
        if (resultCode == RESULT_OK) {
//            startSignedInActivity(response);
//            finish();
            Log.e(TAG, String.valueOf(response));

        } else {
            // Sign in failed
            if (response == null) {
                // User pressed back button
//                showSnackbar(R.string.sign_in_cancelled);
                Log.e(TAG, "Sign-in error: failed");

                return;
            }

            if (response.getError().getErrorCode() == ErrorCodes.NO_NETWORK) {
//                showSnackbar(R.string.no_internet_connection);
                Log.e(TAG, "Sign-in error: no net");
                return;
            }

//            showSnackbar(R.string.unknown_error);
            Log.e(TAG, "Sign-in error: ", response.getError());
        }
    }

但是我的问题是用户电子邮件对话框以预先创建的登录活动打开,但是我想使用自己的电子邮件对话框。 有小费吗 ?这是来源google library