如果使用 FaceBook Lite,使用 Facebook 登录会使应用程序崩溃
Login with facebook crash the app if using FaceBook Lite
在我的应用程序中,我使用 facebook SDK 来执行登录和注册方法。
当我有一般的 Facebook 应用程序或在我的设备上使用普通的网络浏览器时没问题。
但是当我的设备上有 FaceBook Lite 而我没有通用的 FaceBook 应用程序时,当我尝试 login/sign 使用 facebook-sdk 应用程序没有任何关闭就关闭了 log/messages,所以我不知道为什么会出现这个问题。
我该如何解决这个问题? - 我可以跳过 FaceBook Lite 应用程序并改用浏览器吗?
更新:
Here is a video if I have normal facebook app, no problems.
Here is a video if I have the face book app lite on my device, which make it crash.
我的代码片段:
LoginManager.getInstance()
.logInWithReadPermissions(getActivity(), Arrays.asList("public_profile"));
LoginManager.getInstance()
.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(final LoginResult loginResult) {
Log.i("MainActivity", "@@@onSuccess");
GraphRequest request = GraphRequest
.newMeRequest(loginResult.getAccessToken(),
(object, response) -> {
Log.i("MainActivity",
"@@@response: " + response.toString());
try {
///
} catch (JSONException e) {
////
}
});
}
@Override
public void onCancel() {
Log.i("MainActivity", "@@@onCancel");
}
@Override
public void onError(FacebookException error) {
Log.i("MainActivity", "@@@onError: " + error.getMessage());
}
});
你知道 FB 的座右铭 - 快速行动,打破陈规。 SDK 与本机应用程序的集成是有时会中断的事情之一。
您可以强制Facebook SDK 使用网页登录:
LoginManager.getInstance().setLoginBehavior(LoginBehavior.WEB_ONLY)
下面的代码适用于 facebook。
如果它在 devide 中找不到任何 facebook 应用程序,它将打开 webView 并获取数据
在 onCreate() 或 onStart() 中调用以下方法:
private void facebookCallback() {
callbackManager = CallbackManager.Factory.create();
btnFacebook.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
progressDialog.setMessage("Connection Facebook...");
progressDialog.show();
String accessToken = loginResult.getAccessToken().getToken();
Log.i("accessToken", accessToken);
GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
Log.i("LoginActivity", response.toString());
try {
System.out.println("----------------------"+object.get("email").toString());
verifySocialAccount(object.get("email").toString());
} catch (JSONException e) {
LoginManager.getInstance().logOut();
progressDialog.dismiss();
Toast.makeText(LoginActivity.this,"Can not find email Address.",Toast.LENGTH_SHORT).show();
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id, first_name, last_name, email,gender, birthday, location"); // Parámetros que pedimos a facebook
request.setParameters(parameters);
request.executeAsync();
}
@Override
public void onCancel() {
System.out.println("-------onCancel");
}
@Override
public void onError(FacebookException error) {
System.out.println("---------onError");
Log.v("LoginActivity", error.getCause().toString());
}
});
}
Activity代码XML:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="10dp"
android:layout_weight="1"
android:layout_marginBottom="10dp"
android:orientation="horizontal"
android:weightSum="6">
<com.facebook.login.widget.LoginButton
xmlns:facebook="http://schemas.android.com/apk/res-auto"
android:id="@+id/btnFacebook"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/facebookBlue"
android:paddingTop="15dp"
android:paddingLeft="15dp"
facebook:com_facebook_login_text="SIGN IN WITH FACEBOOK"
android:paddingBottom="15dp"
android:textColor="@color/white"
android:textSize="15dp" />
</LinearLayout>
好吧,我在某些 LOLIPOP 设备中获得有线行为,甚至在打开 Facebook 本机应用程序之前关闭应用程序,在其他设备应用程序仅与 facebook lite 关闭,但是。
我在 activity 上使用 noHistory=true
属性,因此一旦由于调用 onStop()
.[=13= 而出现对话框,activity 就会从堆栈中删除]
<activity
android:name=".AuthActivity"
android:screenOrientation="portrait"
android:noHistory="true"
android:windowSoftInputMode="stateHidden" />
删除该属性后,现在可以正常使用了!
在我的应用程序中,我使用 facebook SDK 来执行登录和注册方法。
当我有一般的 Facebook 应用程序或在我的设备上使用普通的网络浏览器时没问题。
但是当我的设备上有 FaceBook Lite 而我没有通用的 FaceBook 应用程序时,当我尝试 login/sign 使用 facebook-sdk 应用程序没有任何关闭就关闭了 log/messages,所以我不知道为什么会出现这个问题。
我该如何解决这个问题? - 我可以跳过 FaceBook Lite 应用程序并改用浏览器吗?
更新:
Here is a video if I have normal facebook app, no problems.
Here is a video if I have the face book app lite on my device, which make it crash.
我的代码片段:
LoginManager.getInstance()
.logInWithReadPermissions(getActivity(), Arrays.asList("public_profile"));
LoginManager.getInstance()
.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(final LoginResult loginResult) {
Log.i("MainActivity", "@@@onSuccess");
GraphRequest request = GraphRequest
.newMeRequest(loginResult.getAccessToken(),
(object, response) -> {
Log.i("MainActivity",
"@@@response: " + response.toString());
try {
///
} catch (JSONException e) {
////
}
});
}
@Override
public void onCancel() {
Log.i("MainActivity", "@@@onCancel");
}
@Override
public void onError(FacebookException error) {
Log.i("MainActivity", "@@@onError: " + error.getMessage());
}
});
你知道 FB 的座右铭 - 快速行动,打破陈规。 SDK 与本机应用程序的集成是有时会中断的事情之一。
您可以强制Facebook SDK 使用网页登录:
LoginManager.getInstance().setLoginBehavior(LoginBehavior.WEB_ONLY)
下面的代码适用于 facebook。 如果它在 devide 中找不到任何 facebook 应用程序,它将打开 webView 并获取数据 在 onCreate() 或 onStart() 中调用以下方法:
private void facebookCallback() {
callbackManager = CallbackManager.Factory.create();
btnFacebook.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
progressDialog.setMessage("Connection Facebook...");
progressDialog.show();
String accessToken = loginResult.getAccessToken().getToken();
Log.i("accessToken", accessToken);
GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
Log.i("LoginActivity", response.toString());
try {
System.out.println("----------------------"+object.get("email").toString());
verifySocialAccount(object.get("email").toString());
} catch (JSONException e) {
LoginManager.getInstance().logOut();
progressDialog.dismiss();
Toast.makeText(LoginActivity.this,"Can not find email Address.",Toast.LENGTH_SHORT).show();
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id, first_name, last_name, email,gender, birthday, location"); // Parámetros que pedimos a facebook
request.setParameters(parameters);
request.executeAsync();
}
@Override
public void onCancel() {
System.out.println("-------onCancel");
}
@Override
public void onError(FacebookException error) {
System.out.println("---------onError");
Log.v("LoginActivity", error.getCause().toString());
}
});
}
Activity代码XML:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="10dp"
android:layout_weight="1"
android:layout_marginBottom="10dp"
android:orientation="horizontal"
android:weightSum="6">
<com.facebook.login.widget.LoginButton
xmlns:facebook="http://schemas.android.com/apk/res-auto"
android:id="@+id/btnFacebook"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/facebookBlue"
android:paddingTop="15dp"
android:paddingLeft="15dp"
facebook:com_facebook_login_text="SIGN IN WITH FACEBOOK"
android:paddingBottom="15dp"
android:textColor="@color/white"
android:textSize="15dp" />
</LinearLayout>
好吧,我在某些 LOLIPOP 设备中获得有线行为,甚至在打开 Facebook 本机应用程序之前关闭应用程序,在其他设备应用程序仅与 facebook lite 关闭,但是。
我在 activity 上使用 noHistory=true
属性,因此一旦由于调用 onStop()
.[=13= 而出现对话框,activity 就会从堆栈中删除]
<activity
android:name=".AuthActivity"
android:screenOrientation="portrait"
android:noHistory="true"
android:windowSoftInputMode="stateHidden" />
删除该属性后,现在可以正常使用了!