使用Facebook登录而不使用登录按钮Android
大家好,我在这里创建没有登录按钮的facebook登录。它可以正常工作,但在关闭facbook webkit登录表单时,它会再次打开弹出窗口,以获得持续的请求权限。给我一个解决办法使用Facebook登录而不使用登录按钮Android,android,facebook-graph-api,facebook-login,Android,Facebook Graph Api,Facebook Login,大家好,我在这里创建没有登录按钮的facebook登录。它可以正常工作,但在关闭facbook webkit登录表单时,它会再次打开弹出窗口,以获得持续的请求权限。给我一个解决办法 private void FacebookLogin() { // TODO Auto-generated method stub final Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermi
private void FacebookLogin() {
// TODO Auto-generated method stub
final Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(
this, Arrays.asList("email"));
Session openActiveSession = Session.openActiveSession(this, true,
new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state,
Exception exception) {
if (session.isOpened()) {
session.requestNewReadPermissions(newPermissionsRequest);
Request getMe = Request.newMeRequest(session,
new GraphUserCallback() {
@Override
public void onCompleted(GraphUser user,
Response response) {
if (user != null) {
org.json.JSONObject graphResponse = response
.getGraphObject()
.getInnerJSONObject();
String email = graphResponse
.optString("email");
String id = graphResponse
.optString("id");
}
}
});
getMe.executeAsync();
} else {
if (!session.isOpened())
Log.d("FACEBOOK", "!session.isOpened()");
else
Log.d("FACEBOOK", "isFetching");
}
}
});
}
@Override
protected void onActivityResult(int arg0, int arg1, Intent arg2) {
// TODO Auto-generated method stub
super.onActivityResult(arg0, arg1, arg2);
Session.getActiveSession().onActivityResult(this, arg0, arg1, arg2);
}
试试这个
public class LoginFragment extends Fragment{
boolean isFetching = false;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.login_fragment, null);
Button button = (Button) view.findViewById(R.id.login_button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
performFacebookLogin();
}
});
return view;
}
private void performFacebookLogin()
{
Log.d("FACEBOOK", "performFacebookLogin");
final Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(getActivity(), Arrays.asList("email"));
Session openActiveSession = Session.openActiveSession(getActivity(), true, new Session.StatusCallback()
{
@Override
public void call(Session session, SessionState state, Exception exception)
{
Log.d("FACEBOOK", "call");
if (session.isOpened() && !isFetching)
{
Log.d("FACEBOOK", "if (session.isOpened() && !isFetching)");
isFetching = true;
session.requestNewReadPermissions(newPermissionsRequest);
Request getMe = Request.newMeRequest(session, new GraphUserCallback()
{
@Override
public void onCompleted(GraphUser user, Response response)
{
Log.d("FACEBOOK", "onCompleted");
if (user != null)
{
Log.d("FACEBOOK", "user != null");
org.json.JSONObject graphResponse = response.getGraphObject().getInnerJSONObject();
String email = graphResponse.optString("email");
String id = graphResponse.optString("id");
String facebookName = user.getUsername();
if (email == null || email.length() < 0)
{
Toast.makeText(getActivity(),
"An email address is required for your account, we could not find an email associated with this Facebook account. Please associate a email with this account or login the oldskool way.", Toast.LENGTH_LONG).show();
return;
}
}
}
});
getMe.executeAsync();
}
else
{
if (!session.isOpened())
Log.d("FACEBOOK", "!session.isOpened()");
else
Log.d("FACEBOOK", "isFetching");
}
}
});
}
}
公共类LoginFragment扩展了片段{
布尔值isFetching=false;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.login\u片段,空);
Button Button=(Button)view.findViewById(R.id.login\u按钮);
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
performFacebookLogin();
}
});
返回视图;
}
私有void performFacebookLogin()
{
Log.d(“FACEBOOK”、“performFacebookLogin”);
final Session.newpermissions请求newpermissions请求=新会话.newpermissions请求(getActivity(),Arrays.asList(“电子邮件”);
Session openActiveSession=Session.openActiveSession(getActivity(),true,new Session.StatusCallback())
{
@凌驾
公共无效调用(会话、会话状态、异常)
{
Log.d(“脸谱网”、“电话”);
if(session.isOpened()&&!isFetching)
{
Log.d(“FACEBOOK”、“if(session.isOpened()&&&!isFetching)”;
isFetching=true;
session.requestNewReadPermissions(newPermissionsRequest);
Request getMe=Request.newMeRequest(会话,new GraphUserCallback()
{
@凌驾
未完成公共无效(GraphUser用户,响应)
{
Log.d(“FACEBOOK”、“未完成”);
如果(用户!=null)
{
Log.d(“FACEBOOK”,“用户!=null”);
org.json.JSONObject graphResponse=response.getGraphObject().getInnerJSONObject();
字符串email=graphResponse.optString(“电子邮件”);
字符串id=graphResponse.optString(“id”);
字符串facebookName=user.getUsername();
如果(email==null | | email.length()<0)
{
Toast.makeText(getActivity(),
“您的帐户需要电子邮件地址,我们找不到与此Facebook帐户关联的电子邮件。请将电子邮件与此帐户关联或以oldskool方式登录。”,Toast.LENGTH_LONG)。show();
回来
}
}
}
});
getMe.executeAsync();
}
其他的
{
如果(!session.isOpened())
Log.d(“FACEBOOK”、“!session.isopend()”;
其他的
Log.d(“FACEBOOK”、“iFetching”);
}
}
});
}
}
现在在片段布局中添加一个按钮
<Button
android:id="@+id/login_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Login With Facebook" />
它对我有效,只有在弹出请求权限后,请尝试它并让我知道我找到了两种方法
第一个-将facebook按钮添加到XML中并隐藏(set visability=GONE)。初始化此按钮并在自定义事件上调用facebookButton.performClick()
第二种方法-使用这部分代码:
callbackManager = CallbackManager.Factory.create();
List<String> permission = new ArrayList<String>();
permission.add("email");
LoginManager loginManager = LoginManager.getInstance();
loginManager.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
if (facebookDialog.isShowing()) {
loadingProgressBar.setVisibility(View.VISIBLE);
singViaFacebook.setText(R.string.dialog_facebook_loggin);
}
loadProfile();
}
@Override
public void onCancel() {
lockLoginButton(true);
startTimer();
}
@Override
public void onError(FacebookException exception) {
lockLoginButton(true);
startTimer();
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
使用Facebook SDK[4,5)首先声明回调管理器,如 私人CallbackManager CallbackManager 专用AccessToken AccessToken 将此代码放入OnCreate():: 然后覆盖
@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CallbackManagerImpl.RequestCodeOffset.Login.toRequestCode()) {
callbackManager.onActivityResult(requestCode, resultCode, data);
}
}
然后使用此函数获取用户配置文件
private void getFacebookUserProfile(AccessToken accessToken) {
GraphRequest request = GraphRequest.newMeRequest(accessToken, new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
try {
authenticateUser(object);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id, name, first_name,last_name, email");
request.setParameters(parameters);
request.executeAsync();
}
希望它对您有用您的意思是,每当对话框关闭时,它都会再次打开?发布整个片段代码检查此选项是,它会打开“已注册”弹出窗口。如果我们关闭它,它将打开一个不带Facebook登录按钮的我想使用的可能的副本
btnFacebook.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
accessToken = AccessToken.getCurrentAccessToken();
if (accessToken != null) {
getFacebookUserProfile(accessToken);
} else {
LoginManager.getInstance().logInWithReadPermissions(StartUpActivity.this, Arrays.asList("public_profile", "email"));
}
}
});
@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CallbackManagerImpl.RequestCodeOffset.Login.toRequestCode()) {
callbackManager.onActivityResult(requestCode, resultCode, data);
}
}
private void getFacebookUserProfile(AccessToken accessToken) {
GraphRequest request = GraphRequest.newMeRequest(accessToken, new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
try {
authenticateUser(object);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id, name, first_name,last_name, email");
request.setParameters(parameters);
request.executeAsync();
}