在 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 集成中,当我单击登录按钮时,它会显示加载并返回主屏幕?的主要内容,如果未能解决你的问题,请参考以下文章

登录 facebook 错误

Facebook 连接集成错误

通过 Facebook 登录

在Facebook对话框中单击关闭(交叉)按钮时未调用onCancel()方法

Facebook 连接错误

DaveJohnson Phonegap/Facebook 插件问题