Android Facebook 登录 - 如何在被拒绝时重新请求电子邮件权限

Android Facebook login - How to rerequest Email permission when rejected

我google了将近半天,没有找到任何可以解决这个问题的例子。情况是这样的。第一次登录的用户看到电子邮件请求并拒绝它。下次他登录时,它会说 "you have already authorized" 它不再要求电子邮件请求,因为它被拒绝了。 我不希望用户转到设置并更改它。有没有办法再次请求此权限? 请帮忙

private UiLifecycleHelper uihelper;  
Session mCurrentSession;
void showMsg(String string)
   {
       Toast.makeText(getApplicationContext(), string, Toast.LENGTH_SHORT).show();
   }


 /*  private Session.StatusCallback callback =new Session.StatusCallback() 
     {

        @Override
        public void call(Session session, SessionState state, Exception exception) 
        {

            onSessionStateChange(session,state,exception);
        }
    };*/


     void onSessionStateChange(Session session, SessionState state, Exception exception) 
     {
        if (state.isOpened()) 
        {
            Log.i("facebook", "Logged in...");
            Request.newMeRequest(session, new Request.GraphUserCallback() 
            {

                @Override
                public void onCompleted(GraphUser user, Response response) 
                {

                    if(user!=null)
                    {
                      showMsg(user.getName());
                      showMsg(user.getProperty("email")+"");
                      showMsg(user.getProperty("gender")+"");
                      showMsg(user.getId()+"");
                    }
                    else
                    {
                        showMsg("its null");
                        showMsg(response.getError().getErrorMessage());
                    }
                }
            }).executeAsync();

        } 
        else if (state.isClosed()) 
        {
            Log.i("facebook", "Logged out...");
        }
    }


@Override
protected void onResume() {     
    super.onResume();
//  uihelper.onResume();
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
//uihelper.onSaveInstanceState(outState);
}

@Override
protected void onPause() {
    super.onPause();
//  uihelper.onPause();
}

@Override
protected void onDestroy() {
    super.onDestroy();
//  uihelper.onDestroy();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
//  super.onActivityResult(requestCode, resultCode, data);
//uihelper.onActivityResult(requestCode, resultCode, data);
  super.onActivityResult(requestCode, resultCode, data);
  Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);

  if (mCurrentSession.isOpened()) {
    Request.newMeRequest(mCurrentSession, new Request.GraphUserCallback() {

          // callback after Graph API response with user object
          @Override
          public void onCompleted(GraphUser user, Response response) {
              Log.w("myConsultant", user.getId() + " " + user.getName() + " " + user.getInnerJSONObject());
          }
        });
    }

}

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
     signInWithFacebook();
// uihelper =new UiLifecycleHelper(this,callback);  
// uihelper.onCreate(savedInstanceState);
/*  
    ArrayList<String> permission =new ArrayList<String>();
    permission.add("email");
    permission.add("public_profile");
    permission.add("user_friends");     

    LoginButton btn=(LoginButton)findViewById(R.id.fbbtn);
    btn.setPublishPermissions(permission); 

    try {
        PackageInfo info = getPackageManager().getPackageInfo(
                "com.something.examp", 
                PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
            }
    }
    catch (Exception e) 
    {
       e.printStackTrace();
    }

*/

}
/*public void onActivityResult(int requestCode, int resultCode, Intent data) {

    }*/
private void signInWithFacebook() {

    SessionTracker  mSessionTracker = new SessionTracker(getBaseContext(), new Session.StatusCallback() {

        @Override
        public void call(Session session, SessionState state, Exception exception) {
        }
    }, null, false);

    String applicationId = Utility.getMetadataApplicationId(getBaseContext());
    mCurrentSession = mSessionTracker.getSession();

    if (mCurrentSession == null || mCurrentSession.getState().isClosed()) {
        mSessionTracker.setSession(null);
        Session session = new Session.Builder(getBaseContext()).setApplicationId(applicationId).build();
        Session.setActiveSession(session);
        mCurrentSession = session;
    }

    if (!mCurrentSession.isOpened()) {
        Session.OpenRequest openRequest = null;
        openRequest = new Session.OpenRequest(LoginMain.this);

        if (openRequest != null) {
            openRequest.setDefaultAudience(SessionDefaultAudience.FRIENDS);
            openRequest.setPermissions(Arrays.asList( "email"));
            openRequest.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK);

            mCurrentSession.openForRead(openRequest);
        }
    }else {
        Request.newMeRequest(mCurrentSession, new Request.GraphUserCallback() {
              @Override
              public void onCompleted(GraphUser user, Response response) {
                  Log.w("myConsultant", user.getId() + " " + user.getName() + " " + user.getInnerJSONObject());
              }
            });
    }
}


更新 1:

在 HelloFacebookSample(它带有 sdk 3.8)中,当我更改 private static final String PERMISSION = "email";即使我说“现在不”,它也会询问我的许可。

但是,当我更改为我的应用程序 ID 时,它不再询问。它只询问一次,仅此而已。

我的应用程序 ID 未经过审核,但我只想要不需要任何额外审核的电子邮件信息。有人可以帮助我吗

似乎我找到了解决方案,尽管它花了我很多钱,但我会与所有人分享。

您必须检查您的登录权限,然后如果您发现此人不允许电子邮件,您必须撤销所有权限。在以前的他们也喜欢那样 How to revoke all Facebook permissions using Android SDK?

  Session session = Session.getActiveSession();
            new Request(session, "me/permissions", null, HttpMethod.DELETE,
                    new Request.Callback() {
                        public void onCompleted(Response response) {
                            Log.e("Complete", response.toString());
                            Toast.makeText(c.getApplicationContext(), "Erase Completely",
                                    Toast.LENGTH_LONG).show();
                          //  postStatusUpdate();
                        }
                    }).executeAsync();

更新为 SDK v4.1+

Set<String> permissions = AccessToken.getCurrentAccessToken().getPermissions();
if(permissions.contains("email")) {
    // Continue your stuff.
} else {
    GraphRequest request = new GraphRequest(
        AccessToken.getCurrentAccessToken(),
        "/me/permissions", null, HttpMethod.DELETE,
        new GraphRequest.Callback() {
            @Override
            public void onCompleted(GraphResponse graphResponse) {
               LoginManager.getInstance().logOut();
               Toast.makeText(context, "Email permission is needed. Please try again.", Toast.LENGTH_LONG).show();
            }
        }
    );
    request.executeAsync();
}