我用谷歌搜索了近半天,我找不到任何可以解决这个问题的例子。情况就是这样。用户在首次登录时会看到电子邮件请求并拒绝它。下次登录时,它会显示“您已经授权”它不会再次询问电子邮件请求,因为它被拒绝了。 我不希望用户转到设置并进行更改。有没有办法再次提出这个许可? 请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不会被审核但我只是想要不需要任何额外审核的电子邮件信息。能否有人帮助我
答案 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();