0

Android 開発者向けの Facebook チュートリアルを試していますが、ステップ2 - パーソナライズで問題が発生しています。

チュートリアルのコードをコピーして貼り付けるのではなく、入力して学習しようとしたため、何か間違って入力した可能性があります。そして、私はそれを見つけることができないようです。

アプリを承認したにもかかわらず、ユーザーが null のように見えるため、プロファイル写真とユーザー名が表示されません。そのため、選択画面が表示されますが、代わりに空のユーザー プロファイルが表示されます。LoginFragment を作成する前のチュートリアルでも、ユーザーはそこに表示されません。私が間違っていることがありますか?

以下は、インポートステートメントとクラス宣言を除いた私の完全なコードです

private static final int SPLASH = 0;
private static final int SELECTION = 1;
private static final int SETTINGS = 2;
private static final int FRAGMENT_COUNT = SETTINGS + 1;

private Fragment[] fragments = new Fragment[FRAGMENT_COUNT];
private static final String FRAGMENT_PREFIX = "fragment";

private static final String TAG = "MyFirstApp_FacebookMain.java";
private boolean isResumed = false;
private boolean restoredFragment = false;

private MenuItem settings;

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

    for(int i=0; i < fragments.length; i++) {
        restoreFragment(savedInstanceState, i);
    }
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    FragmentManager manager = getSupportFragmentManager();

    // Since we are only adding one fragment at a time, we can only save one.
    Fragment f = manager.findFragmentById(R.id.body_frame);
    for(int i=0; i < fragments.length; i++) {
        if(fragments[i] == f) {
            manager.putFragment(outState, getBundleKey(i), fragments[i]);
        }
    }
}

@Override
public void onResume() {
    super.onResume();
    isResumed = true;
}

@Override
public void onPause() {
    super.onPause();
    isResumed = false;
}

@Override
protected void onSessionStateChange(SessionState state, Exception exception) {
    if(isResumed) {
        FragmentManager manager = getSupportFragmentManager();
        int backStackSize = manager.getBackStackEntryCount();
        for(int i=0; i < backStackSize; i++) {
            manager.popBackStack();
        }
        if(state.isOpened()) {
            FragmentTransaction transaction = manager.beginTransaction();
            transaction.replace(R.id.body_frame, fragments[SELECTION]).commit();
        } else if (state.isClosed()) {
            FragmentTransaction transaction = manager.beginTransaction();
            transaction.replace(R.id.body_frame, fragments[SPLASH]).commit();
        }
    }
}

@Override
protected void onResumeFragments() {
    super.onResumeFragments();
    Session session = Session.getActiveSession();
    if (session == null || session.getState().isClosed()) {
        session = new Session(this);
        Session.setActiveSession(session);
    }

    FragmentManager manager = getSupportFragmentManager();

    if (restoredFragment) {
        return;
    }

    // If we already have a valid token, then we can just open the session silently,
    // otherwise present the splash screen and ask the user to login.
    if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
        // no need to add any fragments here since it will be 
        // handled in onSessionStateChange
        session.openForRead(this);
    } else if (session.isOpened()) {
        // if the session is already open, try to show the selection fragment
        Fragment fragment = manager.findFragmentById(R.id.body_frame);
        if (!(fragment instanceof SelectionFragment)) {
            manager.beginTransaction().replace(R.id.body_frame, 
                    fragments[SELECTION]).commit();
        }
    } else {
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.replace(R.id.body_frame, 
              fragments[SPLASH]).commit();
    }
}

private String getBundleKey(int index) {
    return FRAGMENT_PREFIX + Integer.toString(index);
}

private void restoreFragment(Bundle savedInstanceState, int fragmentIndex) {
    Fragment fragment = null;
    if(savedInstanceState != null) {
        FragmentManager manager = getSupportFragmentManager();
        fragment = manager.getFragment(savedInstanceState, getBundleKey(fragmentIndex));
    }
    if(fragment != null) {
        fragments[fragmentIndex] = fragment;
        restoredFragment = true;
    } else {
        switch(fragmentIndex) {
            case SPLASH:
                fragments[SPLASH] = new SplashFragment();
                break;
            case SELECTION:
                fragments[SELECTION] = new SelectionFragment();
                break;
            case SETTINGS:
                fragments[SETTINGS] = new LoginFragment();
                break;
            default:
                Log.w(TAG, "invalid fragment index");
                break;
        }
    }
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    FragmentManager manager = getSupportFragmentManager();
    Fragment currentFragment = manager.findFragmentById(R.id.body_frame);
    // only add the menu when the selection fragment is showing
    if (currentFragment == fragments[SELECTION]) {
        if (menu.size() == 0) {
            settings = menu.add(R.string.settings);
        }
        return true;
    } else {
        menu.clear();
        settings = null;
    }
    return false;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.equals(settings)) {
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.add(R.id.body_frame, fragments[SETTINGS]).addToBackStack(null).commit();
        return true;
    }
    return false;
}

そしてSelectionFragment.javaで

public class SelectionFragment extends Fragment {
private ProfilePictureView profilePictureView;
private TextView userNameView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    View view = inflater.inflate(R.layout.selection, container, false);

    // Find the user's profile picture custom view
    profilePictureView = (ProfilePictureView) view.findViewById(R.id.selection_profile_pic);
    profilePictureView.setCropped(true);

    // Find the user's name view
    userNameView = (TextView) view.findViewById(R.id.selection_user_name);

    // Get the active session
    final Session session = Session.getActiveSession();
    if (session != null && session.isOpened()) {
        // if the session is open, make an API call to get user data
        // and define a callback to handle the response
        Request request = Request.newMeRequest(session, new Request.GraphUserCallback() {

            @Override
            public void onCompleted(GraphUser user, Response response) {
                // if the response is successful
                if (session == Session.getActiveSession()) {
                    if (user != null) {
                        // set the userid for the ProfilePictureView
                        // view that in turn displays the profile picture
                        profilePictureView.setProfileId(user.getId());
                        // set the textview to the user's name
                        userNameView.setText(user.getName());
                    }
                }
            }
        });
        Request.executeBatchAsync(request);
    }
    return view;
}
}

そして最後に SplashFragment.java

public class SplashFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.splash, container, false);
    return view;
}
}
4

4 に答える 4

1

必死になってプロジェクト全体を再起動したところ、現在は機能しています。私は何がうまくいかなかったのか決して発見できないと思います。:(

于 2012-12-17T10:07:37.197 に答える
1

このコードを使用して Facebook にログインします

mFacebook = new Facebook(APP_ID);
SessionStore.restore(mFacebook, getApplicationContext());
mAsyncRunner = new AsyncFacebookRunner(mFacebook);

これは、この関数を使用してプロファイル写真を取得し、必要に応じて変更してください:)

void update_user_image() {
    Bundle params = new Bundle();
    params.putString("fields", "id,picture");
    mAsyncRunner.request("me", params, new AsyncRequestListener(this) {

        @Override
        public void onComplete(JSONObject obj, Object state) {
            try {
                String Image_url = obj.optString("picture");
                if (Image_url.contains("_q.jpg"))
                    Image_url = Image_url.replace("_q.jpg", "_n.jpg");
                if (Image_url.contains("_s.jpg"))
                    Image_url = Image_url.replace("_s.jpg", "_n.jpg");
                if (userImage != null && userImage.getImageUrl() != null)
                    if (!userImage.getImageUrl().equals(Image_url)) {
                        Editor editor = mActivity.getSharedPreferences("userInformation", Context.MODE_PRIVATE).edit();
                        editor.putString("ImageURL", Image_url);
                        editor.commit();
                        final String latest_image_url = Image_url;
                        main.this.runOnUiThread(new Runnable() {

                            @Override
                            public void run() {
                                userImage.setImageUrl(latest_image_url);                                
                                userImage.loadImage();

                            }
                        });
                    }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}
于 2012-11-30T17:58:05.200 に答える