Facebook Android SDK applicationId导致NPE
我一直在尝试在我的应用程序上获得Facebook登录(与G +登录一起)。 G +工作正常,现在我决定添加Facebook整合。
I have been trying to get a Facebook Login (alongside G+ log in) working on my app. G+ works fine, and now I've decided to add Facebook integration.
我有来自Facebook的应用程序ID,并在清单中提供: p>
I have the app ID from facebook, and have provided that in the manifest as so:
<meta-data
android:name="com.facebook.skd.ApplicationId"
android:value="@string/app_id" />
这是字符串资源:
<string name="app_id">000000000000000</string>
这里是我的登录活动代码,并附有相关信息的审查。我不明白为什么Facebook部分的 Session.openActiveSession
行中有一个NullPointerException,表示参数applicationId不能为空。此链接将为您提供LogCat信息。对于Android开发而言,我非常新颖,甚至更新,只能在FYI上使用Facebook。
And here is my login activity code, with censors on the appropriate information. I do not understand why there is an NullPointerException on the Session.openActiveSession
line in the Facebook section, stating that "Argument 'applicationId' cannot be null. This link will provide you with the LogCat info. I am extremely new to Android development and even more new to working with Facebook, just FYI.
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();
}
}
您可以使用Facebook SDK自己的登录/注销小部件,而不是使用普通按钮进行登录/注销。您可以在以下链接中找到实施细节:
登录失败后发布到脸书Android
Instead of using a normal button for login/logout purposes, you can use Facebook SDK's own Login/Logout Widget. You can find the implementation details in the following link:
Post to facebook after login fails Android
编辑:
初始化 mFacebookButton
后,设置以下权限:
After initializing the mFacebookButton
, set these permissions:
mFacebookButton.setPublishPermissions(Arrays.asList("publish_stream","read_stream"));
正确设置权限后,请使用以下代码。
Use the code below after setting the permissions correctly.
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);
}
});
}
}
});
我希望这有助于。
I hope this helps.