1

我一直在尝试让 Facebook 登录(与 G+ 登录一起)在我的应用上运行。G+ 工作正常,现在我决定添加 Facebook 集成。

我有来自 facebook 的应用程序 ID,并在清单中提供了它:

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

这是字符串资源:

<string name="app_id">000000000000000</string>

这是我的登录活动代码,其中包含对适当信息的审查。我不明白为什么Session.openActiveSessionFacebook 部分的行中有 NullPointerException,指出“参数 'applicationId' 不能为空。此链接将为您提供 LogCat 信息。我对 Android 开发非常陌生,甚至对与 Facebook 合作,仅供参考。

package com.example.example;



import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentSender.SendIntentException;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;

import com.facebook.Request;
import com.facebook.Response;
import com.facebook.Session;
import com.facebook.SessionState;
import com.facebook.android.Facebook;
import com.facebook.model.GraphUser;
import com.facebook.widget.LoginButton;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks;
import com.google.android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.plus.PlusClient;
import com.google.android.gms.plus.model.people.Person;


public class LoginActivity extends Activity implements View.OnClickListener, ConnectionCallbacks, OnConnectionFailedListener{



public static final String PREFS_NAME = "MyPrefsFile";
public static Boolean mFirstTimeUsingApp = true;
private static final String TAG = LoginActivity.class.getSimpleName();

//Google Plus Member Variables
protected static final int REQUEST_CODE_RESOLVE_ERR = 9000;
protected PlusClient mPlusClient;
protected ConnectionResult mPlusConnectionResult;
protected ProgressDialog mPlusConnectionProgressDialog;
protected int SIZE_WIDE = 1;

//Facebook Member Variables
private static final String APP_ID = "000000000000000";
private Facebook mFacebook;
private ProgressDialog mFacebookProgress;


@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    SharedPreferences mSharedPreferences = getSharedPreferences(PREFS_NAME, 0);
    boolean firstTimeUsingapp = mSharedPreferences.getBoolean("firstTimeUsingApp", true);


    mPlusClient = new PlusClient.Builder(this, this, this).setVisibleActivities("http://schemas.google.com/AddActivity").build();

    if (firstTimeUsingapp == true) {

        setContentView(R.layout.activity_login);
        this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);



/*-------------------------------------*/           
/*----------Google Plus Login----------*/
/*-------------------------------------*/           

        SignInButton btnSignInGooglePlus = (SignInButton) findViewById(R.id.google_plus_sign_in_button);
        btnSignInGooglePlus.setSize(SIZE_WIDE);

        findViewById(R.id.google_plus_sign_in_button).setOnClickListener(this);
        //Button btnSignOutGooglePlus = (Button) findViewById(R.id.sign_out);
        Log.v(TAG, "5");

        Log.v(TAG, "6");

        //mPlusClient = new PlusClient.Builder(this, this, this).setVisibleActivities("http://schemas.google.com/AddActivity").build();

        //Progress bar to be displayed if the connection failure is not resolved.
        mPlusConnectionProgressDialog = new ProgressDialog(this);
        mPlusConnectionProgressDialog.setMessage("Signing in...");



/*-------------------------------------*/           
/*-----------Facebook Login------------*/
/*-------------------------------------*/

        mFacebookProgress = new ProgressDialog(this);

        LoginButton mFacebookButton = (LoginButton) findViewById(R.id.facebook_sign_in_button);

        Session.openActiveSession(this, true, new Session.StatusCallback() {

            @Override
            public void call(Session session, SessionState state, Exception exception) {
                if (session.isOpened()) {
                    Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {

                        @Override
                        public void onCompleted(GraphUser user, Response response) {
                            Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                            startActivity(intent);
                        }
                    });
                }
            }
        });



/*-------------------------------------*/
/*------------Twitter Login------------*/
/*-------------------------------------*/
//TODO  

/*-------------------------------------*/
/*----------Site Account Login---------*/
/*-------------------------------------*/               
//TODO      
    }
    else {
        setContentView(R.layout.activity_login_pending);
        Log.v(TAG, "99");
    }

}

@Override
protected void onStart() {
    Log.v(TAG, "onStart called");
    super.onStart();
    Log.v(TAG, "super.onStart called");
    if (mPlusClient.isConnected() == false) {
        mPlusClient.connect();
    }
    Log.v(TAG, "mPlusClient connected");
}

@Override
protected void onStop() {
    super.onStop();
    mPlusClient.disconnect();
}


@Override
public void onConnectionFailed(ConnectionResult result) {
    if(mPlusConnectionProgressDialog.isShowing()) {

        if (result.hasResolution()) {
            try {
                result.startResolutionForResult(this, REQUEST_CODE_RESOLVE_ERR);
            } catch (SendIntentException e){
                mPlusClient.connect();
            }
        }
    }

    mPlusConnectionResult = result;
}

@Override
public void onConnected(Bundle arg0) {
    if (mPlusConnectionProgressDialog != null) {
        if (mPlusConnectionProgressDialog.isShowing() == true) {
            mPlusConnectionProgressDialog.dismiss();
        }
    }

    Person person = mPlusClient.getCurrentPerson();

    String userID = person.getId();     

    SharedPreferences sharedPreferences = getSharedPreferences(PREFS_NAME, 0);
    SharedPreferences.Editor editor = sharedPreferences.edit();

    editor.putString("userID", userID);
    editor.commit();

    Intent intent = new Intent(LoginActivity.this, MainActivity.class);
    startActivity(intent);

    finish();
}

@Override
public void onDisconnected() {
}

@Override
protected void onActivityResult(int requestCode, int responseCode, Intent intent) {
    if (requestCode == REQUEST_CODE_RESOLVE_ERR && responseCode == RESULT_OK) {
        mPlusConnectionResult = null;
        mPlusClient.connect();
    }
}

@Override
public void onClick(View view) {
    if (view.getId() == R.id.google_plus_sign_in_button && !mPlusClient.isConnected()) {
        if (mPlusConnectionResult == null) {
            mPlusConnectionProgressDialog.show();
        } else {
            try {
                mPlusConnectionResult.startResolutionForResult(this, REQUEST_CODE_RESOLVE_ERR);
            } catch (SendIntentException e) {
                //Try connecting again.
                mPlusConnectionResult = null;
                mPlusClient.connect();
                mPlusClient.disconnect();
            }
        }
    } else if (view.getId() == R.id.facebook_sign_in_button)  /* && not sure what goes here TODO*/ {

    }

}

protected void errorLogin() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(R.string.error_login_title);
    builder.setMessage(R.string.error_login_message);
    builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();

        }
    });
    AlertDialog dialog = builder.create();
    dialog.show();
}



}
4

1 回答 1

0

您可以使用 Facebook SDK 自己的登录/注销小部件,而不是使用普通按钮进行登录/注销。您可以在以下链接中找到实现细节:
Android 登录失败后发布到 Facebook

编辑:
初始化后mFacebookButton,设置这些权限:

mFacebookButton.setPublishPermissions(Arrays.asList("publish_stream","read_stream"));

正确设置权限后使用下面的代码。

mFacebookButton.setSessionStatusCallback(new Session.StatusCallback() 
{
public void call(Session session, SessionState state,Exception exception) 
{
// TODO Auto-generated method stub
if (session.isOpened()) 
 {
Log.i(TAG, "Access Token" + session.getAccessToken());
Request.executeMeRequestAsync(session,new Request.GraphUserCallback() {

public void onCompleted(GraphUser user,Response response) 
    {
    // TODO Auto-generated method stub
    if (user != null) 
        {
        Log.i(TAG, "User ID " + user.getId());
        Log.i(TAG,"Email "+ user.asMap().get("email"));
        }
    }});
 } 
else 
 {
    //This else condition will be executed when logout will be clicked.
 }
}
});

而不是这段代码:

Session.openActiveSession(this, true, new Session.StatusCallback() {
        @Override
        public void call(Session session, SessionState state, Exception exception) {
            if (session.isOpened()) {
                Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {

                    @Override
                    public void onCompleted(GraphUser user, Response response) {
                        Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                        startActivity(intent);
                    }
                });
            }
        }
    });


我希望这有帮助。

于 2013-10-13T15:18:37.027 回答