Facebook授权Android SDK失败

时间:2012-02-02 04:52:30

标签: android facebook single-sign-on facebook-android-sdk

我正在努力创建一个课程来处理我与Facebook的所有互动。我将我创建的Login活动传递给FacebookConnector对象(相关对象)以存储凭据等。请查看视频以查看我正在处理http://www.youtube.com/watch?v=OkHEy9Mh1hc的内容。以下是已删除App ID的FacebookConnector类

package it.stick;

import java.io.IOException;

import java.net.MalformedURLException;

import com.facebook.android.DialogError;
import com.facebook.android.Facebook;
import com.facebook.android.Facebook.DialogListener;
import com.facebook.android.FacebookError;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

public class FacebookConnector {

private static final String APP_ID ="************";
private static final String[] PERMISSIONS = new String[] {"user_likes","read_stream", "user_photos", "email","photo_upload", "offline_access", "publish_actions"};

private static final String TOKEN = "access_token";
private static final String EXPIRES = "expires_in";
private static final String KEY = "facebook-credentials";

private Facebook facebook;

private Activity activity;


/** Saves applications credentials */
public boolean saveCredentials(Facebook facebook){
    Editor editor = activity.getSharedPreferences(KEY, Context.MODE_PRIVATE).edit();
    editor.putString(TOKEN, facebook.getAccessToken());
    editor.putLong(EXPIRES, facebook.getAccessExpires());
    return editor.commit();
}

public boolean restoreCredentials(Facebook facebook){
    SharedPreferences sharedPreferences = activity.getSharedPreferences(KEY, Context.MODE_PRIVATE);
    facebook.setAccessToken(sharedPreferences.getString(TOKEN, null));
    facebook.setAccessExpires(sharedPreferences.getLong(EXPIRES, 0));
    return facebook.isSessionValid();
}

public FacebookConnector(Activity activity){
    facebook = new Facebook(APP_ID);
    this.activity = activity;
}

// Creates new Facebook session and stores credentials
public void login(){
    // 1.Restores previous credentials 
    //2.Creates and saves new session if previous session is not valid
    restoreCredentials(facebook);
    if(!facebook.isSessionValid()){
        facebook.authorize(activity, PERMISSIONS, new LoginDialogListener());
    }
}
public boolean isSessionValid() {
    return facebook.isSessionValid();
}

public void logout(){
    try {
        facebook.logout(activity.getApplicationContext());
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public void postToWall(String message){
    Bundle parameters = new Bundle();
    parameters.putString("message", message);
    parameters.putString("description", "topic share");

    try{
        facebook.request("me");
        String response = facebook.request("me/feed", parameters, "POST");
        Log.d("Tests", "got response: " + response);
        if(response == null || response.equals("") || response.equals("false")){
            showToast("Blank response from facebook.");
        }
        else{
            showToast("Message posted to your facebook wall.");
        }
    }
    catch(Exception e){
        showToast("Failed to post to wall. We fucked up :(");
        e.printStackTrace();
    }       
}

class LoginDialogListener implements DialogListener{

    @Override
    public void onComplete(Bundle values) {
        saveCredentials(facebook);
        postToWall("logged on to Stick.it");            
    }

    @Override
    public void onFacebookError(FacebookError e) {
        showToast("Authentification with Facebook failed!");            
    }

    @Override
    public void onError(DialogError e) {
        showToast("Authentification with Facebook failed!");        
    }

    @Override
    public void onCancel() {
        showToast("Authentification with Facebook failed!");
    }

}

public void showToast(String message){
    Toast.makeText(activity.getApplicationContext(), message, Toast.LENGTH_SHORT).show();
}

}

这是日志猫:

02-01 22:39:39.459: W/KeyCharacterMap(637): No keyboard for id 0
02-01 22:39:39.470: W/KeyCharacterMap(637): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
02-01 22:39:46.299: D/dalvikvm(637): GC_EXPLICIT freed 91K, 50% free 2744K/5447K, external 3745K/3903K, paused 1017ms
02-01 22:39:46.999: D/webviewglue(637): nativeDestroy view: 0x303080
02-01 22:39:48.239: D/dalvikvm(637): GC_EXTERNAL_ALLOC freed 54K, 51% free 2706K/5447K, external 3331K/3903K, paused 735ms
02-01 22:39:52.139: D/Facebook-WebView(637): Webview loading URL: https://m.facebook.com/dialog/oauth?display=touch&client_id=228461823905169&scope=user_likes%2Cread_stream%2Cuser_photos%2Cemail%2Cphoto_upload%2Coffline_access%2Cpublish_actions&type=user_agent&redirect_uri=fbconnect%3A%2F%2Fsuccess
02-01 22:40:12.209: D/Facebook-authorize(637): Login failed: com.facebook.android.DialogError: The connection to the server was unsuccessful.
02-01 22:40:12.279: D/Facebook-WebView(637): Webview loading URL: https://m.facebook.com/dialog/oauth?display=touch&client_id=228461823905169&scope=user_likes%2Cread_stream%2Cuser_photos%2Cemail%2Cphoto_upload%2Coffline_access%2Cpublish_actions&type=user_agent&redirect_uri=fbconnect%3A%2F%2Fsuccess
02-01 22:46:14.119: W/KeyCharacterMap(637): No keyboard for id 0
02-01 22:46:14.119: W/KeyCharacterMap(637): Using default keymap: /system/usr/keychars/qwerty.kcm.bin

我已清除浏览器缓存和应用数据。我已经检查了密钥哈希,并且已经多次将App ID复制并粘贴到应用程序中。

2 个答案:

答案 0 :(得分:0)

请确保您已将应用程序的签名添加到应用程序设置中,如下所示:

http://developers.facebook.com/docs/mobile/android/build/#sig

答案 1 :(得分:0)

如果您尝试登录的Activity中没有onActivityResult()方法,登录将是Facebook,因为android sdk然后调用authorizeCallback(requestCode, resultCode, data)方法。