任何示例显示如何使用自己的按钮或 Facebook 按钮在 Android 中使用 Facebook SDK 4.0 登录?

Posted

技术标签:

【中文标题】任何示例显示如何使用自己的按钮或 Facebook 按钮在 Android 中使用 Facebook SDK 4.0 登录?【英文标题】:Any Example showing how to login using Facebook SDK 4.0 in Android either by using own button or Facebook Button? 【发布时间】:2015-06-02 17:00:16 【问题描述】:

是否有任何教程或示例显示如何在 Android 中使用 Facebook SDK 4.0 使用自己的按钮登录?我没有到达任何地方并且使用 facebook 开发人员网站很难理解。如下所示调用 FLogin 按钮时我想检查是否登录如果用户尚未登录或登录我想要访问获取 facebook 个人资料信息和用户喜欢的令牌。

FBlogin.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
             //Facebook login Code to get profile info and user likes  
        
    );

我也尝试过 loginButton Facebook。

  <com.facebook.login.widget.LoginButton
            android:id="@+id/login_button"
            android:layout_
            android:layout_
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="30dp"
            android:layout_marginBottom="30dp" 

/>

但它在 xml 中显示错误:-

java.lang.NoClassDefFoundError: Could not initialize class com.facebook.login.widget.LoginButton
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
    at org.jetbrains.android.uipreview.ViewLoader.createNewInstance(ViewLoader.java:413)
    at org.jetbrains.android.uipreview.ViewLoader.loadView(ViewLoader.java:105)
    at com.android.tools.idea.rendering.LayoutlibCallback.loadView(LayoutlibCallback.java:176)
    at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:206)
    at android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:131)
    at android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:739)
    at android.view.LayoutInflater_Delegate.rInflate(LayoutInflater_Delegate.java:64)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:711)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:372)
    at com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:369)
    at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:326)
    at com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:350)
    at com.android.tools.idea.rendering.RenderService$5.compute(RenderService.java:708)
    at com.android.tools.idea.rendering.RenderService$5.compute(RenderService.java:697)
    at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:932)
    at com.android.tools.idea.rendering.RenderService.createRenderSession(RenderService.java:697)
    at com.android.tools.idea.rendering.RenderService.render(RenderService.java:816)
    at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager.doRender(AndroidLayoutPreviewToolWindowManager.java:646)
    at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager.access$1700(AndroidLayoutPreviewToolWindowManager.java:82)
    at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager$7$1.run(AndroidLayoutPreviewToolWindowManager.java:589)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl$2.run(ProgressManagerImpl.java:178)
    at com.intellij.openapi.progress.ProgressManager.executeProcessUnderProgress(ProgressManager.java:209)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:212)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl.runProcess(ProgressManagerImpl.java:171)
    at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager$7.run(AndroidLayoutPreviewToolWindowManager.java:584)
    at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:320)
    at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:310)
    at com.intellij.util.ui.update.MergingUpdateQueue$2.run(MergingUpdateQueue.java:254)
    at com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:269)
    at com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:227)
    at com.intellij.util.ui.update.MergingUpdateQueue.run(MergingUpdateQueue.java:217)
    at com.intellij.util.concurrency.QueueProcessor.runSafely(QueueProcessor.java:238)
    at com.intellij.util.Alarm$Request$1.run(Alarm.java:327)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

我的活动课:-

protected void onCreate(Bundle savedInstanceState)  
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(getApplicationContext());
        setContentView(R.layout.activity_main);

我有任何使用 facebook sdk4.0 登录的示例/教程吗?我被两种方式都困住了。请帮忙。

【问题讨论】:

我认为它会破坏最近的 Facebook 开发者政策。 你需要用户喜欢什么? @luschn 我正在制作一个教育项目,并希望使用用户喜欢的 facebook 提取一些模式。我将在大学校园本地使用该应用程序来获得一些用户的喜欢。如果您有任何关于 Facebook SDK4.0 的教程..请帮助 我不确定您是否会为此获得 user_likes 批准。不过,您可以添加所有参与测试的人。 你还在寻找答案吗@RiturajSinghRathore 【参考方案1】:

这可能对你有帮助

// Custom button
private Button fbbutton;

// Creating Facebook CallbackManager Value
public static CallbackManager callbackmanager;

@Override
protected void onCreate(final Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);

    // Initialize SDK before setContentView(Layout ID)
    FacebookSdk.sdkInitialize(getApplicationContext());

    setContentView(R.layout.activity_main);

    // Initialize layout button
    fbbutton = (Button) findViewById(R.id.button2);

    fbbutton.setOnClickListener(new OnClickListener() 

        @Override
        public void onClick(View v) 
            // Call private method
            onFblogin();
        
    );



// Private method to handle Facebook login and callback
private void onFblogin()

    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);

在清单中添加以下内容,

<application
    android:allowBackup="true"
    android:icon="@drawable/app_icon"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    .
    .
     <!-- [START Facebook] -->
    <activity
        android:name="com.facebook.FacebookActivity"
        android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Translucent.NoTitleBar" />

    <meta-data
        android:name="com.facebook.sdk.ApplicationId"
        android:value="@string/facebook_app_id" />
    <!-- [END Facebook] -->
    .
    .
</application>

【讨论】:

你拯救了我的一天! SO答案中没有一个提到将activityResult翻译成callbackManager... 哦@shybovycha,我只是在做我的工作,如果你需要更多可以在这里问我 @ManishSB 我正在使用您的示例,但由于某种原因,未调用 onActivityResult 并且活动只是完成了。您知道可能出了什么问题吗? 请分享您的代码@Mantas,这就是我可以帮助您解决问题的方法 @ManishSB 感谢您的努力,但我已经解决了。问题是我没有为该活动设置任何历史记录。【参考方案2】:

最好的解决方案是使用 LoginManager 登录。这是我的管理方法(点击是使用 ButterKnife 制作的):

 @Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);        
    mCallbackManager = CallbackManager.Factory.create();


@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) 
    super.onViewCreated(view, savedInstanceState);
    LoginManager.getInstance().registerCallback(mCallbackManager, this);


@OnClick(R.id.facebook_login_button)
@SuppressWarnings("unused")
public void loginWithFacebookAccount() 
    LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "email"));


@Override
public void onSuccess(LoginResult loginResult) 
    Bundle parameters = new Bundle();
    parameters.putString("fields", "id,name,last_name,link,email,picture");
    GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), (jsonObject, graphResponse) -> 
        String id = null;
        if (jsonObject != null) 
            try 
                id = jsonObject.getString("id");
             catch (JSONException e) 
                e.printStackTrace();
                            
        
    );
    request.setParameters(parameters);
    request.executeAsync();


@Override
public void onCancel() 



@Override
public void onError(FacebookException e) 



@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) 
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK) 
        mCallbackManager.onActivityResult(requestCode, resultCode, data);           
    

所以这就是我所做的。随意问;)

【讨论】:

我需要你的帮助。我想检索 api 中提供的用户地址:developers.facebook.com/docs/android/graph#userdata-step3 但无法在图形响应中获取位置 json 数组。 你设置“user_location”参数了吗? 最好的决定是使用 Facebook LoginManager 对象,而不是 facebook 登录按钮。这个答案很好【参考方案3】:
public class AuthWFacebookSDKFour extends Activity implements View.OnClickListener,FacebookCallback<LoginResult>   

    List<String> permissionNeeds=Arrays.asList("user_photos","friends_photos", "email", "user_birthday", "user_friends");

    //facebook callbacks manager
    private CallbackManager cm;
    private LoginButton mFbLoginButton;

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        //init facebook sdk and 
        FacebookSdk.sdkInitialize(getApplicationContext());

        //instantiate callbacks manager
        mCallbackManager = CallbackManager.Factory.create();


        mFbLoginButton=(LoginButton)findViewById(R.id.FBBUTTONID);

        //set permissions mFbLoginButton.setReadPermissions(ApplicationContext.facebookPermissions);
        // register callback
        //means hey facebook after login call onActivityResult of **this**  
        mFbLoginButton.registerCallback(mCallbackManager, this);

    

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 

        super.onActivityResult(requestCode, resultCode, data);
        //manage login result
        mCallbackManager.onActivityResult(requestCode, resultCode, data);
    


    @Override
    public void onSuccess(LoginResult loginResults) 


        //login ok  get access token 
        AccessToken.getActiveAccessToken();   

    
    @Override
    public void onCancel() 

        Log.e(TAG(),"facebook login canceled");

    


    @Override
    public void onError(FacebookException e) 



        Log.e(TAG(),"facebook login failed error");

    







记得在清单中插入

<activity
 android:name="com.facebook.FacebookActivity"
 android:label="@string/app_name"
 android:theme="@android:style/Theme.Translucent.NoTitleBar"
                />

【讨论】:

我不断收到此错误,不知道“意外调用 LoginManager.onActivityResult”出了什么问题 不,它仍然给出相同的错误/异常,JSONexception/classnotfoundexception @user2273146 试试上面的答案,可能对你有帮助【参考方案4】:

对于 Facebook SDK 4.X 版, 在您的活动或片段中(通常在 onCreate() 方法上):

// Initialize Facebook Sdk before UI
    FacebookSdk.sdkInitialize(getApplicationContext());

    callbackManager = CallbackManager.Factory.create();
    loginButton = (LoginButton) findViewById(R.id.login_button);
    loginButton.setReadPermissions("user_friends");

    // Callback registration
    loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() 
        @Override
        public void onSuccess(LoginResult loginResult) 
            // App code
            Log.v(TAG, "fblogin onSuccess");

        

        @Override
        public void onCancel() 
            // App code
            Log.v(TAG, "fblogin onCancel");
        

        @Override
        public void onError(FacebookException exception) 
            // App code
            Log.v(TAG, "fblogin onError");
        
    );

别忘了将facebook活动结果传递给经理:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    ...

    callbackManager.onActivityResult(requestCode, resultCode, data);

【讨论】:

这对我有用,我错过了添加 onActivityResult 方法。【参考方案5】:

使用Android facebook SDK 4.X Login with facebook Default Login_button

public class FbDefaultBtnLogin extends AppCompatActivity 

private CallbackManager callbackManager;
@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    FacebookSdk.sdkInitialize(getApplicationContext());
    setContentView(R.layout.activity_fb_default_btn_login);
    callbackManager = CallbackManager.Factory.create();
  //  LoginButton loginButton=(LoginButton)findViewById(R.id.login_button);


LoginManager.getInstance().logInWithReadPermissions(this,Arrays.asList("email","user_photos","public_profile"));
         LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() 
            @Override
            public void onSuccess(LoginResult loginResult) 

            

            @Override
            public void onCancel() 

            

            @Override
            public void onError(FacebookException e) 

            
        );
    

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) 
        super.onActivityResult(requestCode, resultCode, data);
        callbackManager.onActivityResult(requestCode, resultCode, data);
    


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_
    android:layout_
    tools:context="com.jitendra.facebooklogin.FbDefaultBtnLogin">

<!--<com.facebook.login.widget.LoginButton-->
    <!--android:id="@+id/login_button"-->
    <!--android:layout_-->
    <!--android:layout_-->
    <!--android:layout_gravity="center_horizontal"-->
    <!--android:layout_marginTop="30dp"-->
    <!--android:layout_marginBottom="30dp" />

</RelativeLayout>

在 Mainifest 中:-

 <meta-data
        android:name="com.facebook.sdk.ApplicationId"
        android:value="@string/app_id" />
 <activity
        android:name="com.facebook.FacebookActivity"
        android:theme="@style/AppTheme" >
 </activity>

【讨论】:

我认为 Session 在 4.0 中已被弃用 是的。找到教程了吗?像往常一样,开发者网站没有提供帮助。 Right Session 在 4.0 中已被弃用。再次在 4.X 中,您可以使用它。检查这个编辑过的答案。 如何退出facebook登录如何清除凭据并再次调用登录 只需调用 LoginManager.getInstance().logOut();【参考方案6】:

您好,请查看本教程:click here

在本教程中,您可以获得 最新 Facebook SDK 示例,其中包含 自定义 loginlogout 按钮 逻辑。

【讨论】:

嗨,你的 tut 只是第一次运行,之后它总是重定向到登录页面而不是上面显示的屏幕。您能否使用 git repo github.com/niravkalola/FacebookLoginSample-master 中的代码更新您的 tut。

以上是关于任何示例显示如何使用自己的按钮或 Facebook 按钮在 Android 中使用 Facebook SDK 4.0 登录?的主要内容,如果未能解决你的问题,请参考以下文章

使用我们代码中的'fb_ref'参数跟踪来自Facebook的按钮推介

如何在动画结束时设置属性或任何回调? [复制]

如何使用清除按钮创建文本

如何为 Instagram 基本显示 API 实现 Instagram 或 Facebook 登录按钮的继续?

带有消息的 Facebook 喜欢按钮

facebook 分享按钮显示错误的缩略图