在 Facebook 集成中,当我单击登录按钮时,它会显示加载并返回主屏幕?
Posted
技术标签:
【中文标题】在 Facebook 集成中,当我单击登录按钮时,它会显示加载并返回主屏幕?【英文标题】:In Facebook Integration when i click on the login button it shows loading and returns to the main screen? 【发布时间】:2016-09-27 04:59:20 【问题描述】:我正在我的项目中进行 facebook 集成。但问题是当我点击 facebook 登录按钮时,它显示正在加载并返回到主屏幕。谁能告诉我是什么问题?
这是我的 MainActivity :-
public class MainActivity extends AppCompatActivity
private FacebookData mFacebookData;
private Button mLoginButton;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mFacebookData = new FacebookData();
mLoginButton = (Button) findViewById(R.id.button);
mLoginButton.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
callFacebookLogin();
);
private void callFacebookLogin()
Session session = Session.getActiveSession();
if (session != null)
Log.e("session :", "session already build");
Request request = Request.newMeRequest(session, new Request.GraphUserCallback()
@Override
public void onCompleted(GraphUser user, Response response)
if (user != null)
String str = user.getName();
try
String id = user.getId();
String firstname = user.getFirstName();
String lastname = user.getLastName();
String pic = "http://graph.facebook.com/" + id + "/picture?type=large";
Log.e("id....", id);
Log.e("firstname....", firstname);
mFacebookData.setId(id);
mFacebookData.setFirstname(firstname);
mFacebookData.setLastname(lastname);
mFacebookData.setPicture(pic);
catch (Exception e)
e.printStackTrace();
);
Request.executeBatchAsync(request);
else
Session.openActiveSession(MainActivity.this, true, new Session.StatusCallback()
@Override
public void call(Session session, SessionState state, Exception exception)
if (session.isOpened())
if (state == SessionState.OPENED)
Request request = Request.newMeRequest(session, new Request.GraphUserCallback()
@Override
public void onCompleted(GraphUser user, Response response)
if (user != null)
String str = user.getName();
try
String id = user.getId();
String firstname = user.getFirstName();
String lastname = user.getLastName();
String pic = "http://graph.facebook.com/"
+ id
+ "/picture?type=large";
mFacebookData.setId(id);
mFacebookData.setFirstname(firstname);
mFacebookData.setLastname(lastname);
mFacebookData.setPicture(pic);
catch (Exception e)
e.printStackTrace();
);
Request.executeBatchAsync(request);
);
这是我的清单:-
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.aaa.examplepractise">
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.facebook.LoginActivity"
android:screenOrientation="portrait" />
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/APP_ID" />
</application>
</manifest>
这是我的 Logcat :-
09-27 10:35:24.405 20441-20615/com.example.aaa.examplepractise E/ActivityThread: Failed to find provider info for com.facebook.katana.provider.AttributionIdProvider
09-27 10:35:24.582 20441-20441/com.example.aaa.examplepractise E/ActivityThread: Failed to find provider info for com.facebook.katana.provider.PlatformProvider
09-27 10:35:24.583 20441-20441/com.example.aaa.examplepractise E/ActivityThread: Failed to find provider info for com.facebook.wakizashi.provider.PlatformProvider
【问题讨论】:
justpost 你得到什么 logcat.. 设置登录 onActivityResult 功能 另外 facebook 已将 sdk 版本更改为 4.0 +,他们在其中处理未处于活动状态的片段我认为您使用的是旧版本 @PreetikaKaur 我更新了我的代码。请看logcat。我认为它没有给出任何错误。我使用的是活动而不是片段。我应该使用片段而不是活动。 你使用的是哪个sdk版本? 我为此使用了第三方库。它是编译'com.github.asne.facebook:facebook:3.17.2' 【参考方案1】:这可能是由于以下原因造成的:
-
您未连接到互联网
您没有授予 Internet 访问权限 (Manifest.xml)
您没有为应用使用正确的hashkey
您没有提供正确的应用 ID
尝试最新的方法来做
在您的片段类中包含以下内容:
private FacebookCallback<LoginResult> mFacebookCallback = new FacebookCallback<LoginResult>()
@Override
public void onSuccess(LoginResult loginResult)
Log.d("Login", "onSuccess");
GraphRequest.newMeRequest(
loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback()
@Override
public void onCompleted(JSONObject me, GraphResponse response)
if (response.getError() != null)
// handle error
else
email = me.optString("email");
String id = me.optString("id");
String social_id=me.optString("id");
String name= me.optString("name");
String gender= me.optString("gender");
boolean verified_user= me.optBoolean("is_verified");
).executeAsync();
@Override
public void onCancel ()
Log.d("Login", "onCancel");
@Override
public void onError (FacebookException e)
Log.d("Login", "onError " + e);
;
在 oncreateView 方法中包含以下代码:
btn_facebook = (LoginButton) v.findViewById(R.id.btn_fb);
btn_facebook.setFragment(this);
btn_facebook.setReadPermissions(Arrays.asList("public_profile, email,user_friends"));
btn_facebook.registerCallback(mCallbackManager, mFacebookCallback);
在 oncreate 方法中添加以下代码:
FacebookSdk.sdkInitialize(getContext());
mCallbackManager = CallbackManager.Factory.create();
setupTokenTracker();
setupProfileTracker();
mTokenTracker.startTracking();
mProfileTracker.startTracking();
try
PackageInfo info = getActivity().getPackageManager().getPackageInfo("package name here", PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures)
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
// Log.e("Key", Base64.encodeToString(md.digest(), Base64.DEFAULT));
catch (Exception ex)
StringWriter errors = new StringWriter();
ex.printStackTrace(new PrintWriter(errors));
// Log.e("Error", errors.toString());
TokenTracker 和 PRofileTracker 方法:
private void setupTokenTracker()
mTokenTracker = new AccessTokenTracker()
@Override
protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken currentAccessToken)
// Log.d("VIVZ", "" + currentAccessToken);
;
private void setupProfileTracker()
mProfileTracker = new ProfileTracker()
@Override
protected void onCurrentProfileChanged(Profile oldProfile, Profile currentProfile)
// Log.d("VIVZ", "" + currentProfile);
;
在 onaCtivityResult 你会得到数据,所以像这样添加:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
super.onActivityResult(requestCode, resultCode, data);
// Log.e("info", "onActivityResult:" + requestCode + ":" + resultCode + ":" + data);
Bundle bundle = data.getExtras();
for (String key : bundle.keySet())
Object value = bundle.get(key);
mCallbackManager.onActivityResult(requestCode, resultCode, data);
在 Gradle 文件中添加以下依赖项:
编译'com.facebook.android:facebook-android-sdk:4.0.0'
在 xml 中包含如下按钮:
<com.facebook.login.widget.LoginButton
android:id="@+id/btn_fb"
android:layout_
android:layout_
android:layout_margin="1dp"
android:layout_weight="1"
android:gravity="center"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="16sp"
fb:login_text="@string/facebook"
fb:logout_text="@string/facebook" />
在清单中添加以下权限和元数据和活动标签:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<activity
android:name="com.facebook.FacebookActivity"
android:label="title_facebook_login" />
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/app_id" />
在活动上添加片段并执行代码。希望它有助于让我知道如果需要问其他任何事情。
【讨论】:
我正确地遵循了上述步骤。但在我的情况下,当我单击登录按钮时,它会显示加载时间并返回主屏幕。 com.github.asne.facebook:facebook:3.17.2' 如果你说我应该给你我正在使用的新代码,你正在使用旧的吗?最新的是 4.0+,而您使用的是 3.17。此外,facebook 提供了包含社交登录的简单步骤,为什么需要为此添加第三方 @aarav 现在检查一下 它在 oncreate 中只是全局声明对象 @aarav private CallbackManager mCallbackManager; 如果对您有帮助,请检查这些 url,是的 4.0 不是最新的,所以包括最新的并干净地重建您的项目以上是关于在 Facebook 集成中,当我单击登录按钮时,它会显示加载并返回主屏幕?的主要内容,如果未能解决你的问题,请参考以下文章