【问题标题】:Get the user email firebase auth获取用户电子邮件 firebase 身份验证
【发布时间】:2019-05-01 08:37:14
【问题描述】:

我正在尝试做这样的事情

我在一些应用程序(例如 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 中键入任何字母(如果获得许可),此代码对我来说工作正常。

【问题讨论】:

  • 专注于完全授予权限而不显示权限对话框
  • 是否有办法在没有权限的情况下显示用户电子邮件,例如 shopify 应用

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


【解决方案1】:

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

在 Android 6.0 (Marshmallow) 及更高版本上,您的应用无需请求任何设备或运行时权限即可使用 Credentials 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】:

也许这不是你要找的,但我真的建议你看看Authentication with Firebase 和帮助库FirebaseUI。他们已经实现了所有样板文件,并且配置、自定义和设置非常容易。

【讨论】:

  • 现在我的后端服务器已经排序,但这在某些情况下很有用,谢谢
【解决方案3】:

如果没有运行时权限,则无法访问用户机密信息(如电子邮件 ID)。

【讨论】:

  • 如果您安装了 shopify POS,您将能够在不接受任何权限的情况下查看您的所有电子邮件,我刚刚检查了设置应用程序权限,并且没有任何内容
【解决方案4】:

到目前为止,我发现使用谷歌服务获取所有用户电子邮件,无需任何许可,代码如下:

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

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 2019-06-25
    • 2022-08-07
    • 2018-02-10
    • 2021-04-04
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    相关资源
    最近更新 更多