Search code examples
androidfacebookfacebook-graph-apifacebook-sdk-3.0

Why "Getting Started with the Facebook SDK for Android" example doesn't work?


I'm trying to create my first Facebook Android Application but it doesn't work.

https://developers.facebook.com/docs/android/getting-started/

It doesn't print my name in "hello word" string and The app enters in a infinite loop.

Main Class

package com.firstandroidappalf;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.widget.TextView;
import com.facebook.*;
import com.facebook.model.*;

public class MainActivity extends Activity {

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

// start Facebook Login
Session.openActiveSession(this, true, new Session.StatusCallback() {

  // callback when session changes state
  @Override
  public void call(Session session, SessionState state, Exception exception) {
    if (session.isOpened()) {

      // make request to the /me API
      Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {

        // callback after Graph API response with user object
        @Override
        public void onCompleted(GraphUser user, Response response) {
          if (user != null) {
            TextView welcome = (TextView) findViewById(R.id.welcome);
            welcome.setText("Hello " + user.getName() + "!");
          }
        }
      });
    }
  }
});
}

@Override
 public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
 }

}

Manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.firstandroidappalf"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.INTERNET"/>

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.firstandroidappalf.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <meta-data android:value="@string/app_id" android:name="com.facebook.sdk.ApplicationId"/>
    <activity android:name="com.facebook.LoginActivity"></activity>
</application>

String resourc

<string name="app_name">First Android App</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
 <string name="app_id">6427XXXX9097984</string>

keyhashes

http://www.easyfacebookandroidsdk.com/download/keyhash.zip

Log cat Errors:

12-19 17:16:19.870: E/SpannableStringBuilder(19027): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length 12-19 17:16:19.870: E/SpannableStringBuilder(19027): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length 12-19 17:36:19.785: E/SpannableStringBuilder(19027): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length 12-19 17:36:19.785: E/SpannableStringBuilder(19027): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length

facebook dev


Solution

  • After 1 day I solved. The problem was the keyhash to put on android developer because the keyhash created with openssl or the tool in http://www.easyfacebookandroidsdk.com/download/keyhash.zip is wrong.

    My correct solution is below but for more information about this issue you can look

    Troubleshooting section in https://developers.facebook.com/docs/android/login-with-facebook/

    //imports:
    
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.content.pm.PackageInfo;
    import android.content.pm.PackageManager;
    import android.content.pm.PackageManager.NameNotFoundException;
    import android.content.pm.Signature;
    import android.util.Base64;
    import android.util.Log;
    import android.widget.TextView;
    import com.facebook.*;
    import com.facebook.model.*;
    
    @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
    
    
        try {
           **//be careful to put the correct package name, it was mmy first mistake**
           PackageInfo info = getPackageManager().getPackageInfo("[your package name, e.g.    com.yourcompany.yourapp]", PackageManager.GET_SIGNATURES);
           for (Signature signature : info.signatures) {
               MessageDigest md = MessageDigest.getInstance("SHA");
               md.update(signature.toByteArray());
               Log.d("Hash Key:","Hash Key " +Base64.encodeToString(md.digest(), Base64.DEFAULT));
    
            }
            } catch (NameNotFoundException e) {
    
            } catch (NoSuchAlgorithmException e) {
    
        }
       ...
      }
    

    Finding "Hash Key:" in Logcat's messages you find up the correct keyhash.