首页 > 解决方案 > 使用 Facebook 登录的应用程序在开发中不起作用!它只是加载和关闭-Android Studio

问题描述

我已经实现了一个应用程序,并且我已经使用 facebook 登录到它。应用程序正在运行而没有崩溃,但 facebook 登录不起作用。当我打开应用程序并单击 facebook 登录按钮时,它会显示一个进度条,它会立即消失而无需执行任何操作。我在 logcat 中有以下错误。

2019-08-29 12:45:24.290 19304-19328/com.appic.testfbauth 
E/GraphResponse: 
{
    HttpStatus: 400, 
    errorCode: 100, 
    subErrorCode: 33, 
    errorType: GraphMethodException, 
    errorMessage: Unsupported get request. Object with ID '742177629556035' does not exist, cannot be loaded due to missing permissions, or does not support this operation. Please read the Graph API documentation at https://developers.facebook.com/docs/graph-api
}

请参阅下文了解我所做的工作。

public class MainActivity extends AppCompatActivity {
    private LoginButton loginButton;
    private CircleImageView circleImageView;
    private TextView txtName, txtEmail;

    private CallbackManager callbackManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FacebookSdk.sdkInitialize(getApplicationContext());

        loginButton = findViewById(R.id.login_button);
        circleImageView = findViewById(R.id.profile_pic);
        txtName = findViewById(R.id.profile_name);
        txtEmail = findViewById(R.id.profile_email);
        checkLoginStatus();

        callbackManager = CallbackManager.Factory.create();

        loginButton.registerCallback(callbackManager,
                new FacebookCallback<LoginResult>() {
                    @Override
                    public void onSuccess(LoginResult loginResult) {
                        // App code
                    }

                    @Override
                    public void onCancel() {
                        // App code
                    }

                    @Override
                    public void onError(FacebookException exception) {
                        // App code
                    }
                });
    }

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

    AccessTokenTracker tokenTracker = new AccessTokenTracker() {
        @Override
        protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken currentAccessToken) {
            if(currentAccessToken == null) {
                txtEmail.setText("");
                txtName.setText("");
                circleImageView.setImageResource(0);
                Toast.makeText(MainActivity.this, "User Logged Out!", Toast.LENGTH_SHORT).show();
            }
            else loadUser(currentAccessToken);
        }
    };

    private void loadUser(AccessToken newAccessToken) {
        GraphRequest request = GraphRequest.newMeRequest(newAccessToken, new GraphRequest.GraphJSONObjectCallback() {
            @Override
            public void onCompleted(JSONObject object, GraphResponse response) {
                try {
                    String first_name = object.getString("first_name");
                    String last_name = object.getString("last_name");
                    String email = object.getString("email");
                    String id = object.getString("id");

                    String image_url = "https://graph.facebook.com/"+ id +"/picture?type=normal";

                    txtEmail.setText(email);
                    txtName.setText(first_name +" "+ last_name);

                    RequestOptions requestOptions = new RequestOptions();
                    requestOptions.dontAnimate();

                    Glide.with(MainActivity.this).load(image_url).into(circleImageView);

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });

        Bundle parameters = new Bundle();
        parameters.putString("fields", "first_name,last_name,email,id");
        request.setParameters(parameters);
        request.executeAsync();
    }

    private void checkLoginStatus() {
        if(AccessToken.getCurrentAccessToken() != null) {
            loadUser(AccessToken.getCurrentAccessToken());
        }
    }
}
<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        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>

        <meta-data android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/facebook_app_id"/>

        <meta-data android:name="com.facebook.sdk.ApplicationName"
            android:value="@string/app_name"/>

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

    </application>

我只想集成 facebook 登录并获取电子邮件、姓名、图片 url、id。

标签: javaandroidauthenticationfacebook-login

解决方案


我没有足够的复制来发表评论,所以我粘贴了答案。你只需给我以下问题的答案。

  1. 您在真实设备或模拟器中测试您的应用程序。?
  2. 获得图片许可?
  3. 请检查您的浏览器是否有任何已登录的 Facebook 帐户?

如果您没有收到电子邮件和姓名,请尝试以下代码:

JSONObject res;

res = new JSONObject(json_object.toString());

String id = res.getString("id");
String name = res.getString("name");
String email = res.getString("email");

更新:

  • 请从您的设备上卸载 FB 应用程序并尝试在您的应用程序中使用 FB 登录,它工作正常。

209 年 11 月 25 日更新


推荐阅读