使用自定义按钮登录 FACEBOOK
FACEBOOK Login with Custom Button
我已经为 Facebook 登录实现了自定义按钮,一切都在发生,但我没有收到回电 onSuccess
或 onCancel
或 onError
以便我可以获得返回的结果。
我用的是脸书SDK
版本com.facebook.android:facebook-android-sdk:4.1.0
下面是代码供参考
public class OnBoardingActivity extends AppCompatActivity {
private final String TAG = OnBoardingActivity.class.getSimpleName();
private final int TIME_DELAY = 2000;
private CallbackManager mCallBackManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_onboarding);
FacebookSdk.sdkInitialize(getApplicationContext());
mCallBackManager = CallbackManager.Factory.create();
final RelativeLayout facebookSignUp = (RelativeLayout)findViewById(R.id.facebook_signupButton);
LoginManager.getInstance().registerCallback(mCallBackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Log.d(TAG, " Login successfull +++ ");
}
@Override
public void onCancel() {
Log.d(TAG, " Login got canceled ");
}
@Override
public void onError(FacebookException e) {
Log.d(TAG, " Error in the login with exception is = " + e);
}
});
facebookSignUp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LoginManager.getInstance().logInWithReadPermissions(OnBoardingActivity.this, Arrays.asList("public_profile", "user_friends", "email"));
}
});
}
以下是 Facebook 登录的片段
<application>
<!-- To use Facebook Login or Share below activity is declared -->
<activity android:name="com.facebook.FacebookActivity"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:label="@string/app_name" />
<provider android:authorities="com.facebook.app.FacebookContentProvider1234"
android:name="com.facebook.FacebookContentProvider"
android:exported="true" />
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id" />
</application>
已添加 XML 布局片段
<RelativeLayout
android:id="@+id/facebook_signupButton"
android:layout_width="match_parent"
android:layout_height="43dp"
android:layout_marginTop="10dp"
android:background="#3a569d">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginRight="15dip"
android:layout_toLeftOf="@+id/login_with_facebook"
android:scaleType="fitXY"
android:src="@drawable/icon_facbook_small" />
<TextView
android:id="@+id/login_with_facebook"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center"
android:text="Login with facebook"
android:textColor="@android:color/white" />
</RelativeLayout>
让你的代码看起来更聪明
您在设置布局之前首先初始化 Facebook SDK
FacebookSdk.sdkInitialize(getApplicationContext());
当使用点击按钮或在您的情况下布局调用方法执行整个功能时
facebookSignUp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Fblogin();
}
});
此处私有方法处理 Facebook 登录和回调
private void Fblogin()
{
callbackmanager = CallbackManager.Factory.create();
// Set permissions
LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("email","user_photos","public_profile"));
LoginManager.getInstance().registerCallback(callbackmanager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
System.out.println("Success");
GraphRequest.newMeRequest(
loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject json, GraphResponse response) {
if (response.getError() != null) {
// handle error
System.out.println("ERROR");
} else {
System.out.println("Success");
try {
String jsonresult = String.valueOf(json);
System.out.println("JSON Result"+jsonresult);
String str_email = json.getString("email");
String str_id = json.getString("id");
String str_firstname = json.getString("first_name");
String str_lastname = json.getString("last_name");
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}).executeAsync();
}
@Override
public void onCancel() {
Log.d(TAG_CANCEL,"On cancel");
}
@Override
public void onError(FacebookException error) {
Log.d(TAG_ERROR,error.toString());
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackmanager.onActivityResult(requestCode, resultCode, data);
}
我为您提供完整的代码来解析您的 json 文件
这里是 Kotlin 版本
1. 创建 callbackManager
作为您的 activity:
的对象
lateinit var callbackManager: CallbackManager
2。为 Facebook 按钮设置 setOnClickListener
:
facebookButton.setOnClickListener { loginWithFacebook() }
3. 实现 loginWithFacebook
如下:
private fun loginWithFacebook() {
callbackManager = CallbackManager.Factory.create()
LoginManager.getInstance().logInWithReadPermissions(this, setOf("email"))
LoginManager.getInstance().registerCallback(callbackManager, object : FacebookCallback<LoginResult> {
override fun onSuccess(result: LoginResult?) {
result?.let {
Log.d("facebook", it.accessToken.token)
}
}
override fun onCancel() {
Toast.makeText(this@YourActivity, "Facebook login cancelled", Toast.LENGTH_SHORT).show()
}
override fun onError(error: FacebookException?) {
Toast.makeText(this@YourActivity, "Facebook login failed: ${error.toString()}", Toast.LENGTH_SHORT).show()
}
})
}
4. 覆盖 onActivityResult
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
callbackManager.onActivityResult(requestCode, resultCode, data)
}
我已经为 Facebook 登录实现了自定义按钮,一切都在发生,但我没有收到回电 onSuccess
或 onCancel
或 onError
以便我可以获得返回的结果。
我用的是脸书SDK
版本com.facebook.android:facebook-android-sdk:4.1.0
下面是代码供参考
public class OnBoardingActivity extends AppCompatActivity {
private final String TAG = OnBoardingActivity.class.getSimpleName();
private final int TIME_DELAY = 2000;
private CallbackManager mCallBackManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_onboarding);
FacebookSdk.sdkInitialize(getApplicationContext());
mCallBackManager = CallbackManager.Factory.create();
final RelativeLayout facebookSignUp = (RelativeLayout)findViewById(R.id.facebook_signupButton);
LoginManager.getInstance().registerCallback(mCallBackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Log.d(TAG, " Login successfull +++ ");
}
@Override
public void onCancel() {
Log.d(TAG, " Login got canceled ");
}
@Override
public void onError(FacebookException e) {
Log.d(TAG, " Error in the login with exception is = " + e);
}
});
facebookSignUp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LoginManager.getInstance().logInWithReadPermissions(OnBoardingActivity.this, Arrays.asList("public_profile", "user_friends", "email"));
}
});
}
以下是 Facebook 登录的片段
<application>
<!-- To use Facebook Login or Share below activity is declared -->
<activity android:name="com.facebook.FacebookActivity"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:label="@string/app_name" />
<provider android:authorities="com.facebook.app.FacebookContentProvider1234"
android:name="com.facebook.FacebookContentProvider"
android:exported="true" />
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id" />
</application>
已添加 XML 布局片段
<RelativeLayout
android:id="@+id/facebook_signupButton"
android:layout_width="match_parent"
android:layout_height="43dp"
android:layout_marginTop="10dp"
android:background="#3a569d">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginRight="15dip"
android:layout_toLeftOf="@+id/login_with_facebook"
android:scaleType="fitXY"
android:src="@drawable/icon_facbook_small" />
<TextView
android:id="@+id/login_with_facebook"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center"
android:text="Login with facebook"
android:textColor="@android:color/white" />
</RelativeLayout>
让你的代码看起来更聪明 您在设置布局之前首先初始化 Facebook SDK
FacebookSdk.sdkInitialize(getApplicationContext());
当使用点击按钮或在您的情况下布局调用方法执行整个功能时
facebookSignUp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Fblogin();
}
});
此处私有方法处理 Facebook 登录和回调
private void Fblogin()
{
callbackmanager = CallbackManager.Factory.create();
// Set permissions
LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("email","user_photos","public_profile"));
LoginManager.getInstance().registerCallback(callbackmanager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
System.out.println("Success");
GraphRequest.newMeRequest(
loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject json, GraphResponse response) {
if (response.getError() != null) {
// handle error
System.out.println("ERROR");
} else {
System.out.println("Success");
try {
String jsonresult = String.valueOf(json);
System.out.println("JSON Result"+jsonresult);
String str_email = json.getString("email");
String str_id = json.getString("id");
String str_firstname = json.getString("first_name");
String str_lastname = json.getString("last_name");
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}).executeAsync();
}
@Override
public void onCancel() {
Log.d(TAG_CANCEL,"On cancel");
}
@Override
public void onError(FacebookException error) {
Log.d(TAG_ERROR,error.toString());
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackmanager.onActivityResult(requestCode, resultCode, data);
}
我为您提供完整的代码来解析您的 json 文件
这里是 Kotlin 版本
1. 创建 callbackManager
作为您的 activity:
lateinit var callbackManager: CallbackManager
2。为 Facebook 按钮设置 setOnClickListener
:
facebookButton.setOnClickListener { loginWithFacebook() }
3. 实现 loginWithFacebook
如下:
private fun loginWithFacebook() {
callbackManager = CallbackManager.Factory.create()
LoginManager.getInstance().logInWithReadPermissions(this, setOf("email"))
LoginManager.getInstance().registerCallback(callbackManager, object : FacebookCallback<LoginResult> {
override fun onSuccess(result: LoginResult?) {
result?.let {
Log.d("facebook", it.accessToken.token)
}
}
override fun onCancel() {
Toast.makeText(this@YourActivity, "Facebook login cancelled", Toast.LENGTH_SHORT).show()
}
override fun onError(error: FacebookException?) {
Toast.makeText(this@YourActivity, "Facebook login failed: ${error.toString()}", Toast.LENGTH_SHORT).show()
}
})
}
4. 覆盖 onActivityResult
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
callbackManager.onActivityResult(requestCode, resultCode, data)
}