0

Facebookとのすべてのやり取りを処理するクラスを作成しようとしています。作成したログインアクティビティをFacebookConnectorオブジェクト(問題のオブジェクト)に渡して、資格情報などを保存します。ビデオを見て、私が扱っているものを確認してくださいhttp://www.youtube.com/watch?v =OkHEy9Mh1hc。以下は、アプリ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

ブラウザのキャッシュとアプリのデータをクリアしました。キーハッシュを確認し、アプリIDを複数回コピーしてアプリに貼り付けました。

4

2 に答える 2

0

次のように、アプリケーションの署名をアプリケーション設定に追加していることを確認してください。

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

于 2012-02-02T05:16:18.600 に答える
0

ログインしようとしているアクティビティにメソッドがないonActivityResult()場合、android sdkがメソッドを呼び出すため、ログインはFacebookになりますauthorizeCallback(requestCode, resultCode, data)

于 2012-02-02T20:09:45.863 に答える