代码之家  ›  专栏  ›  技术社区  ›  Hossam Hassan

获取用户电子邮件firebase auth

  •  2
  • Hossam Hassan  · 技术社区  · 6 年前

    我想做这样的事

    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 回复  |  直到 6 年前
        1
  •  2
  •   Sachin Kasaraddi    6 年前

    用于检索登录提示(如用户名和电子邮件地址)的凭据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
  •  2
  •   dglozano    6 年前

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

        3
  •  0
  •   Mayur Dabhi    6 年前

    在没有运行时权限的情况下,无法访问用户机密信息(如电子邮件ID)。

        4
  •  0
  •   Hossam Hassan    6 年前

    到目前为止,我发现使用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