android - 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 中没有出现错误,一切运行完美。只有其他活动没有开始,有人能够处理这个问题并解决了它吗?
我留下一张我的代码卡住的小照片。 这里卡住了
解决方案
好的,有一些原因可能会导致问题出现,所以为了解决它,让我们从 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())(这是正确的位置)。
推荐阅读
- javascript - 将 ES6 类转换为 typescript 类
- python-3.x - 安装 python-docx 时遇到问题
- html - 声明后缺少或未立即执行函数实现。在 ts 的角度问题中
- python - 如何在 Python 中为 YAML 文件的特定键添加值?
- php - Xdebug trace Phalcon 无法保存跟踪文件
- c# - 为什么我的功能在没有警报的情况下停止工作?
- python-3.x - 为什么训练几个小时后 Fasttext train_unsupervised 冻结?
- php - 如何通过控制器排序获取数据?
- stm32 - 计时器作为毫秒计数器
- c# - 使用路由在 QueryParameters 中传递字典