我一直试图在我的应用上进行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>
这是我的登录活动代码,其中包含适当信息的审查。我不明白为什么在Facebook部分的Session.openActiveSession
行上有一个NullPointerException,说明“Argument'applicationId'不能为空。This link将为您提供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();
}
}
答案 0 :(得分:0)
您可以使用Facebook SDK自己的登录/注销小部件,而不是使用普通按钮进行登录/注销。您可以在以下链接中找到实施细节:
Post to facebook after login fails Android
修改:
初始化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);
}
});
}
}
});
我希望这会有所帮助。