2013-10-13 4 views
1

J'ai essayé d'obtenir une connexion Facebook (à côté de G + connexion) fonctionnant sur mon application. G + fonctionne bien, et maintenant j'ai décidé d'ajouter l'intégration de Facebook.Facebook Android SDK applicationId provoquant NPE

J'ai l'ID d'application de facebook, et ont prévu que dans le manifeste comme si:

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

Voici la ressource de chaîne:

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

Et voici mon code d'activité de connexion, avec des censeurs sur les informations appropriées. Je ne comprends pas pourquoi il y a une exception NullPointerException sur la ligne Session.openActiveSession dans la section Facebook, indiquant que "Argument 'applicationId" ne peut pas être nulle. This link vous fournira l'information LogCat.Je suis extrêmement nouveau pour le développement Android et encore plus de nouveau à . travailler avec Facebook, juste 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(); 
} 



} 
+0

Utilisez-vous vraiment ce ' 000000000000000' Ressource de chaîne? Ou vous l'avez posté ici comme ceci, pour masquer votre identifiant Real App? –

+0

@SalmanKhakwani Je le cache. – mattcoker

+0

Vous avez implémenté votre propre activité de connexion? S'il vous plaît expliquer le fonctionnement de l'activité de connexion. –

Répondre

0

au lieu d'utiliser un bouton normal à des fins de connexion/déconnexion, vous pouvez utiliser propre Connexion/Déconnexion Widget Facebook SDK vous pouvez trouver les détails de mise en œuvre dans le lien suivant:.
Post to facebook after login fails Android

EDIT:
Après l'initialisation du mFacebookButton, définissez les autorisations:

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

Utilisez le code ci-dessous après avoir défini les autorisations correctement.

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. 
} 
} 
}); 

Au lieu de ce code:

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); 
        } 
       }); 
      } 
     } 
    }); 


J'espère que cette aide.

+0

Voici mon XML pour le bouton facebook. Dans mon activité de connexion, le type LoginButton fait partie du Facebook SDK. '' – mattcoker

+0

Veuillez vérifier la réponse mise à jour. –

+0

Je vais changer le code ce soir, quelque chose vient d'arriver. Mais je pensais que je vous ferais savoir que je n'ai pas besoin de lire ou de publier des compétences en ce moment, juste en train de faire une connexion. – mattcoker