首页 > 解决方案 > facebook登录后开始另一个活动的问题

问题描述

如果有人可以在我的 Android 应用程序中检查 Facebook 登录后帮助我开始另一个活动,我已经尝试在代码的不同部分中加入意图,之后没有任何帮助。

我已经尝试将意图放在 onSucces () 方法中,但它仍然不起作用。

我把我的代码留在下面。

class principio : AppCompatActivity() {

lateinit var LoginButton: LoginButton
lateinit var callbackManager: CallbackManager
lateinit var fotoPerfil: ImageView
lateinit var Profile: Profile;

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    FacebookSdk.sdkInitialize(getApplicationContext());

    setContentView(R.layout.activity_principio)


    LoginButton = findViewById(R.id.login_button)
    callbackManager = CallbackManager.Factory.create()

    LoginButton.setReadPermissions("email");
    fotoPerfil = findViewById(R.id.Bienvenida)



    LoginButton.registerCallback(callbackManager, object : FacebookCallback<LoginResult> {
        override fun onSuccess(result: LoginResult?) {
            Toast.makeText(this@principio,"se obtuvo  el resultado",Toast.LENGTH_LONG).show();
            saltarActividad()
        }

        override fun onCancel() {
            Snackbar.make(root_layout,"se Activo en el OnCANCEL",Snackbar.LENGTH_LONG).show()
        }

        override fun onError(error: FacebookException?) {
            TODO("Not yet implemented")
        }

    })


}// final del onCreate


override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    callbackManager.onActivityResult(requestCode, resultCode, data)
    saltarActividad()
     Snackbar.make(root_layout,"se Activo en el On Activity",Snackbar.LENGTH_LONG).show()

    super.onActivityResult(requestCode, resultCode, data)

}

var tokenTracker: AccessTokenTracker = object : AccessTokenTracker() {
    override fun onCurrentAccessTokenChanged(oldAccessToken: AccessToken?, currentAccessToken: AccessToken?) {
        if (currentAccessToken == null) {
          saltarActividad()
            fotoPerfil.setImageResource(0)
            Toast.makeText(this@principio, "User Logget Out", Toast.LENGTH_LONG).show()

        } else {
            loadUserProfile(currentAccessToken)

        }

    }

}

fun loadUserProfile(newAccesToken: AccessToken) {
    var parametros = Bundle()
    var Activity2 = saltarActividad()

    var GraphRequest: GraphRequest =
        GraphRequest.newMeRequest(newAccesToken, object : GraphRequest.GraphJSONObjectCallback {
            override fun onCompleted(`object`: JSONObject?, response: GraphResponse?) {

                var first_name: String = `object`!!.getString("first_name")
                var last_name: String = `object`.getString("last_name")
                var email: String = `object`.getString("email")
                var id: String = `object`.getString("id")
                var image_url: String =
                    "https://graph.facebook.com/" + id + "picture?type=normal"


                Toast.makeText(this@principio,"se quedo aqui",Toast.LENGTH_LONG).show();
                Glide.with(this@principio).load(image_url).into(fotoPerfil)
                fotoPerfil.buildDrawingCache()
                var bitmap = fotoPerfil.drawingCache
                Activity2.putExtra("first_name", first_name)
                Activity2.putExtra("last_name", last_name)
                Activity2.putExtra("email", email)
                Activity2.putExtra("BitImage", bitmap)
                startActivity(Activity2);

            }


        })
    parametros.putString("fields", "first_name,last_name,email,id")
    GraphRequest.parameters = parametros
    startActivity(Activity2);
    GraphRequest.executeAsync()





}

private fun saltarActividad(): Intent {
    var Activity2 = Intent(this, MainActivity::class.java)
    return Activity2
}

}

我的 logcat 中没有出现错误,一切运行完美。只有其他活动没有开始,有人能够处理这个问题并解决了它吗?

我留下一张我的代码卡住的小照片。 这里卡住了

标签: androidfacebookkotlin

解决方案


好的,有一些原因可能会导致问题出现,所以为了解决它,让我们从 Facebook 开发者页面上的应用程序配置开始。

这是文档,您可以在其中找到注册您的应用程序以进行 facebook 开发所需执行的所有步骤。

https://developers.facebook.com/docs/facebook-login/android/?locale=es_ES

首先,您需要在页面上创建一个应用程序,给它一个名称(它不应与您的真实应用程序名称相同,但按照惯例,放一些类似的东西)

创建完成后,将 Facebook SDK 实现添加到您的 gradle 依赖项并同步您的项目:

实施 'com.facebook.android:facebook-login:[5,6)'

然后,在第四步,facebook 会给你一些代码来为你的应用程序进行配置:

在此处输入图像描述

第一个,只是您必须添加到您的 strings.xml 的字符串

<resources>
    <string name="app_name">Facebook</string>
    <string name="facebook_app_id">688207335076511</string>
    <string name="fb_login_protocol_scheme">fb688207335076511</string>

</resources>

注意:这些字符串的值将与您的应用程序不同,只需复制 facebook 开发人员页面提供给您的代码片段即可。

第二个是在清单文件中为您的应用添加 Internet 权限。

  <uses-permission android:name="android.permission.INTERNET"/>

最后,添加一些 facebook 需要的元数据,以将您的 android 应用程序与您在页面上进行的注册连接起来。

<activity android:name="com.facebook.FacebookActivity"
    android:configChanges=
        "keyboard|keyboardHidden|screenLayout|screenSize|orientation"
    android:label="@string/app_name" />
<activity
    android:name="com.facebook.CustomTabActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="@string/fb_login_protocol_scheme" />
    </intent-filter>
</activity>

第5步,询问你应用程序的包名,如果你正在开发,你可以忽略这一步。

此外,您还需要从您的 android 应用程序中注册一个 keyhash。为了得到这个,你可以按照页面给你的步骤或者好吧,我会留下这个代码片段,用你的改变包名字符串并将它放在你的 onCreate 方法中并运行应用程序,hashkey 将出现在你的日志猫。

try {
            PackageInfo info = getPackageManager().getPackageInfo(

                    "yourPackageName",

                    PackageManager.GET_SIGNATURES);
            for (Signature signature : info.signatures) {
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
            }
        } catch (PackageManager.NameNotFoundException e) {

        } catch (NoSuchAlgorithmException e) {

        }

因此,如果您正确执行了所有这些步骤,您就可以开始编写应用程序的逻辑了。以此为指导:

package com.example.facebook;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.example.facebook.databinding.ActivityMainBinding;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

public class MainActivity extends AppCompatActivity {

    ActivityMainBinding binding;

    //Facebook components
    CallbackManager callbackManager;
    Button facebookLogin;
    LoginManager loginManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        configFacebookLogin();    //Facebook Login Configuration
    }

    private void configFacebookLogin() {

        //First, init a callbackManager and a loginManager instances.
        callbackManager = CallbackManager.Factory.create();
        loginManager = LoginManager.getInstance();

        //Then, pass that callback to your loginManager instance via registerCallBack method as you see
        //below
        loginManager.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                Log.d("FacebookCallback", "onSuccess: ");
            }

            @Override
            public void onCancel() {
                Log.d("FacebookCallback", "onSuccess: ");

            }

            @Override
            public void onError(FacebookException error) {
                Log.d("FacebookCallback", "onSuccess: ");

            }
        });

        //bind your button to your xml button and set an onClick method to it
        facebookLogin = binding.buttonFacebookLogin;
        facebookLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //With this line, you trigger the facebook login.
                loginManager.logInWithReadPermissions(MainActivity.this, Arrays.asList("email", "public_profile"));
            }
        });

    }

    //Also, you need to add the callbackManager.onActivityResult method to pass the token
    //of you facebook session to the loginManager, so your app will know if your login succeed or failed.
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        callbackManager.onActivityResult(requestCode, resultCode, data);
        super.onActivityResult(requestCode, resultCode, data);
    }
}

我看到的其他事情是你没有使用 startActivity() 方法来启动你的意图,所以也修复它。最后,删除所有不在 onSuccess() 方法中的意图 (saltarActividad())(这是正确的位置)。


推荐阅读