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

时间:2015-04-10 22:43:18

标签: facebook email login sdk permissions

我用谷歌搜索了近半天,我找不到任何可以解决这个问题的例子。情况就是这样。用户在首次登录时会看到电子邮件请求并拒绝它。下次登录时,它会显示“您已经授权”它不会再次询问电子邮件请求,因为它被拒绝了。 我不希望用户转到设置并进行更改。有没有办法再次提出这个许可? 请helppp

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)当我更改私有静态最终字符串PERMISSION =“email”;它会问我,即使我现在不说是允许的。

但是,当我更改为我的应用程序ID时,它不再问了。它只是问了一次,就是这样。

我的应用ID不会被审核但我只是想要不需要任何额外审核的电子邮件信息。能否有人帮助我

2 个答案:

答案 0 :(得分:3)

针对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();
}

答案 1 :(得分:0)

似乎我找到了一个解决方案,即使它花了我钱,我将与所有人分享。

您必须在登录时检查权限,然后如果您发现此人不允许电子邮件,您必须撤消所有权限。在以前的那些他们也喜欢那样 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();