2013-09-21 9 views
0

Android에서 Facebook에 이미지를 게시하는 데 사용하는 코드는 다음과 같습니다.Facebook SDK 및 Android

public class HelloFacebookSampleActivity extends FragmentActivity { 

private static final List<String> PERMISSIONS = Arrays.asList("publish_actions"); 
private static final Location SEATTLE_LOCATION = new Location("") { 
    { 
     setLatitude(47.6097); 
     setLongitude(-122.3331); 
    } 
}; 

private final String PENDING_ACTION_BUNDLE_KEY = "com.facebook.samples.hellofacebook:PendingAction"; 

private Button postStatusUpdateButton; 
private Button postPhotoButton; 
private Button pickFriendsButton; 
private Button pickPlaceButton; 
private LoginButton loginButton; 
private ProfilePictureView profilePictureView; 
private TextView greeting; 
private PendingAction pendingAction = PendingAction.NONE; 
private ViewGroup controlsContainer; 
private GraphUser user; 

private enum PendingAction { 
    NONE, 
    POST_PHOTO, 
    POST_STATUS_UPDATE 
} 
private UiLifecycleHelper uiHelper; 

private Session.StatusCallback callback = new Session.StatusCallback() { 
    @Override 
    public void call(Session session, SessionState state, Exception exception) { 
     onSessionStateChange(session, state, exception); 
    } 
}; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    uiHelper = new UiLifecycleHelper(this, callback); 
    uiHelper.onCreate(savedInstanceState); 

    if (savedInstanceState != null) { 
     String name = savedInstanceState.getString(PENDING_ACTION_BUNDLE_KEY); 
     pendingAction = PendingAction.valueOf(name); 
    } 

    setContentView(R.layout.main); 

    loginButton = (LoginButton) findViewById(R.id.login_button); 
    loginButton.setUserInfoChangedCallback(new LoginButton.UserInfoChangedCallback() { 
     @Override 
     public void onUserInfoFetched(GraphUser user) { 
      HelloFacebookSampleActivity.this.user = user; 
      updateUI(); 
      // It's possible that we were waiting for this.user to be populated in order to post a 
      // status update. 
      handlePendingAction(); 
     } 
    }); 

    profilePictureView = (ProfilePictureView) findViewById(R.id.profilePicture); 
    greeting = (TextView) findViewById(R.id.greeting); 

    postStatusUpdateButton = (Button) findViewById(R.id.postStatusUpdateButton); 
    postStatusUpdateButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      onClickPostStatusUpdate(); 
     } 
    }); 

    postPhotoButton = (Button) findViewById(R.id.postPhotoButton); 
    postPhotoButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      onClickPostPhoto(); 
     } 
    }); 

    pickFriendsButton = (Button) findViewById(R.id.pickFriendsButton); 
    pickFriendsButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      onClickPickFriends(); 
     } 
    }); 

    pickPlaceButton = (Button) findViewById(R.id.pickPlaceButton); 
    pickPlaceButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      onClickPickPlace(); 
     } 
    }); 

    controlsContainer = (ViewGroup) findViewById(R.id.main_ui_container); 

    final FragmentManager fm = getSupportFragmentManager(); 
    Fragment fragment = fm.findFragmentById(R.id.fragment_container); 
    if (fragment != null) { 
     // If we're being re-created and have a fragment, we need to a) hide the main UI controls and 
     // b) hook up its listeners again. 
     controlsContainer.setVisibility(View.GONE); 
     if (fragment instanceof FriendPickerFragment) { 
      setFriendPickerListeners((FriendPickerFragment) fragment); 
     } else if (fragment instanceof PlacePickerFragment) { 
      setPlacePickerListeners((PlacePickerFragment) fragment); 
     } 
    } 

    // Listen for changes in the back stack so we know if a fragment got popped off because the user 
    // clicked the back button. 
    fm.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 
      if (fm.getBackStackEntryCount() == 0) { 
       // We need to re-show our UI. 
       controlsContainer.setVisibility(View.VISIBLE); 
      } 
     } 
    }); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    uiHelper.onResume(); 

    updateUI(); 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    uiHelper.onSaveInstanceState(outState); 

    outState.putString(PENDING_ACTION_BUNDLE_KEY, pendingAction.name()); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    uiHelper.onActivityResult(requestCode, resultCode, data); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    uiHelper.onPause(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    uiHelper.onDestroy(); 
} 

private void onSessionStateChange(Session session, SessionState state, Exception exception) { 
    if (pendingAction != PendingAction.NONE && 
      (exception instanceof FacebookOperationCanceledException || 
      exception instanceof FacebookAuthorizationException)) { 
      new AlertDialog.Builder(HelloFacebookSampleActivity.this) 
       .setTitle(R.string.cancelled) 
       .setMessage(R.string.permission_not_granted) 
       .setPositiveButton(R.string.ok, null) 
       .show(); 
     pendingAction = PendingAction.NONE; 
    } else if (state == SessionState.OPENED_TOKEN_UPDATED) { 
     handlePendingAction(); 
    } 
    updateUI(); 
} 

private void updateUI() { 
    Session session = Session.getActiveSession(); 
    boolean enableButtons = (session != null && session.isOpened()); 

    postStatusUpdateButton.setEnabled(enableButtons); 
    // postPhotoButton.setEnabled(enableButtons); 
    pickFriendsButton.setEnabled(enableButtons); 
    pickPlaceButton.setEnabled(enableButtons); 

    if (enableButtons && user != null) { 
     profilePictureView.setProfileId(user.getId()); 
     greeting.setText(getString(R.string.hello_user, user.getFirstName())); 
    } else { 
     profilePictureView.setProfileId(null); 
     greeting.setText(null); 
    } 
} 

@SuppressWarnings("incomplete-switch") 
private void handlePendingAction() { 
    PendingAction previouslyPendingAction = pendingAction; 
    // These actions may re-set pendingAction if they are still pending, but we assume they 
    // will succeed. 
    pendingAction = PendingAction.NONE; 

    switch (previouslyPendingAction) { 
     case POST_PHOTO: 
      postPhoto(); 
      break; 
     case POST_STATUS_UPDATE: 
      postStatusUpdate(); 
      break; 
    } 
} 

private interface GraphObjectWithId extends GraphObject { 
    String getId(); 
} 

private void showPublishResult(String message, GraphObject result, FacebookRequestError error) { 
    String title = null; 
    String alertMessage = null; 
    if (error == null) { 
     title = getString(R.string.success); 
     String id = result.cast(GraphObjectWithId.class).getId(); 
     alertMessage = getString(R.string.successfully_posted_post, message, id); 
    } else { 
     title = getString(R.string.error); 
     alertMessage = error.getErrorMessage(); 
    } 

    new AlertDialog.Builder(this) 
      .setTitle(title) 
      .setMessage(alertMessage) 
      .setPositiveButton(R.string.ok, null) 
      .show(); 
} 

private void onClickPostStatusUpdate() { 
    performPublish(PendingAction.POST_STATUS_UPDATE); 
} 

private void postStatusUpdate() { 
    if (user != null && hasPublishPermission()) { 
     final String message = getString(R.string.status_update, user.getFirstName(), (new Date().toString())); 
     Request request = Request 
       .newStatusUpdateRequest(Session.getActiveSession(), message, new Request.Callback() { 
        @Override 
        public void onCompleted(Response response) { 
         showPublishResult(message, response.getGraphObject(), response.getError()); 
        } 
       }); 
     request.executeAsync(); 
    } else { 
     pendingAction = PendingAction.POST_STATUS_UPDATE; 
    } 
} 

private void onClickPostPhoto() { 
    performPublish(PendingAction.POST_PHOTO); 
} 

private void postPhoto() { 
    if (hasPublishPermission()) { 
     Bitmap image = BitmapFactory.decodeResource(this.getResources(), R.drawable.icon); 
     Request request = Request.newUploadPhotoRequest(Session.getActiveSession(), image, new Request.Callback() { 
      @Override 
      public void onCompleted(Response response) { 
       showPublishResult(getString(R.string.photo_post), response.getGraphObject(), response.getError()); 
      } 
     }); 
     request.executeAsync(); 
    } else { 
     pendingAction = PendingAction.POST_PHOTO; 
    } 
} 

private void showPickerFragment(PickerFragment<?> fragment) { 
    fragment.setOnErrorListener(new PickerFragment.OnErrorListener() { 
     @Override 
     public void onError(PickerFragment<?> pickerFragment, FacebookException error) { 
      String text = getString(R.string.exception, error.getMessage()); 
      Toast toast = Toast.makeText(HelloFacebookSampleActivity.this, text, Toast.LENGTH_SHORT); 
      toast.show(); 
     } 
    }); 

    FragmentManager fm = getSupportFragmentManager(); 
    fm.beginTransaction() 
      .replace(R.id.fragment_container, fragment) 
      .addToBackStack(null) 
      .commit(); 

    controlsContainer.setVisibility(View.GONE); 

    // We want the fragment fully created so we can use it immediately. 
    fm.executePendingTransactions(); 

    fragment.loadData(false); 
} 

private void onClickPickFriends() { 
    final FriendPickerFragment fragment = new FriendPickerFragment(); 

    setFriendPickerListeners(fragment); 

    showPickerFragment(fragment); 
} 

private void setFriendPickerListeners(final FriendPickerFragment fragment) { 
    fragment.setOnDoneButtonClickedListener(new FriendPickerFragment.OnDoneButtonClickedListener() { 
     @Override 
     public void onDoneButtonClicked(PickerFragment<?> pickerFragment) { 
      onFriendPickerDone(fragment); 
     } 
    }); 
} 

private void onFriendPickerDone(FriendPickerFragment fragment) { 
    FragmentManager fm = getSupportFragmentManager(); 
    fm.popBackStack(); 

    String results = ""; 

    Collection<GraphUser> selection = fragment.getSelection(); 
    if (selection != null && selection.size() > 0) { 
     ArrayList<String> names = new ArrayList<String>(); 
     for (GraphUser user : selection) { 
      names.add(user.getName()); 
     } 
     results = TextUtils.join(", ", names); 
    } else { 
     results = getString(R.string.no_friends_selected); 
    } 

    showAlert(getString(R.string.you_picked), results); 
} 

private void onPlacePickerDone(PlacePickerFragment fragment) { 
    FragmentManager fm = getSupportFragmentManager(); 
    fm.popBackStack(); 

    String result = ""; 

    GraphPlace selection = fragment.getSelection(); 
    if (selection != null) { 
     result = selection.getName(); 
    } else { 
     result = getString(R.string.no_place_selected); 
    } 

    showAlert(getString(R.string.you_picked), result); 
} 

private void onClickPickPlace() { 
    final PlacePickerFragment fragment = new PlacePickerFragment(); 
    fragment.setLocation(SEATTLE_LOCATION); 
    fragment.setTitleText(getString(R.string.pick_seattle_place)); 

    setPlacePickerListeners(fragment); 

    showPickerFragment(fragment); 
} 

private void setPlacePickerListeners(final PlacePickerFragment fragment) { 
    fragment.setOnDoneButtonClickedListener(new PlacePickerFragment.OnDoneButtonClickedListener() { 
     @Override 
     public void onDoneButtonClicked(PickerFragment<?> pickerFragment) { 
      onPlacePickerDone(fragment); 
     } 
    }); 
    fragment.setOnSelectionChangedListener(new PlacePickerFragment.OnSelectionChangedListener() { 
     @Override 
     public void onSelectionChanged(PickerFragment<?> pickerFragment) { 
      if (fragment.getSelection() != null) { 
       onPlacePickerDone(fragment); 
      } 
     } 
    }); 
} 

private void showAlert(String title, String message) { 
    new AlertDialog.Builder(this) 
      .setTitle(title) 
      .setMessage(message) 
      .setPositiveButton(R.string.ok, null) 
      .show(); 
} 

private boolean hasPublishPermission() { 
    Session session = Session.getActiveSession(); 
    return session != null && session.getPermissions().contains("publish_actions"); 
} 

private void performPublish(PendingAction action) { 
    Session session = Session.getActiveSession(); 
    if (session != null) { 
     pendingAction = action; 
     if (hasPublishPermission()) { 
      // We can do the action right away. 
      handlePendingAction(); 
     } else { 
      // We need to get new permissions, then complete the action when we get called back. 
      session.requestNewPublishPermissions(new Session.NewPermissionsRequest(this, PERMISSIONS)); 
     } 
    } 
} 

}

하지만 내 로그인 버튼을 클릭하면, 그것은 faceebook의 로그인 페이지로 저를 가지고 다음과 같은 예외

09-22 01:48:20.859: E/AndroidRuntime(15874): FATAL EXCEPTION: main 
09-22 01:48:20.859: E/AndroidRuntime(15874): java.lang.UnsupportedOperationException: Session: an attempt was made to request new permissions for a session that is not currently open. 
09-22 01:48:20.859: E/AndroidRuntime(15874): at com.facebook.Session.requestNewPermissions(Session.java:977) 
09-22 01:48:20.859: E/AndroidRuntime(15874): at com.facebook.Session.requestNewPublishPermissions(Session.java:501) 
09-22 01:48:20.859: E/AndroidRuntime(15874): at com.facebook.samples.hellofacebook.HelloFacebookSampleActivity.performPublish(HelloFacebookSampleActivity.java:436) 
09-22 01:48:20.859: E/AndroidRuntime(15874): at com.facebook.samples.hellofacebook.HelloFacebookSampleActivity.onClickPostPhoto(HelloFacebookSampleActivity.java:292) 
09-22 01:48:20.859: E/AndroidRuntime(15874): at com.facebook.samples.hellofacebook.HelloFacebookSampleActivity.access$5(HelloFacebookSampleActivity.java:291) 
09-22 01:48:20.859: E/AndroidRuntime(15874): at com.facebook.samples.hellofacebook.HelloFacebookSampleActivity$5.onClick(HelloFacebookSampleActivity.java:117) 
09-22 01:48:20.859: E/AndroidRuntime(15874): at android.view.View.performClick(View.java:4084) 
09-22 01:48:20.859: E/AndroidRuntime(15874): at android.view.View$PerformClick.run(View.java:16966) 
09-22 01:48:20.859: E/AndroidRuntime(15874): at android.os.Handler.handleCallback(Handler.java:615) 
09-22 01:48:20.859: E/AndroidRuntime(15874): at android.os.Handler.dispatchMessage(Handler.java:92) 
09-22 01:48:20.859: E/AndroidRuntime(15874): at android.os.Looper.loop(Looper.java:137) 
09-22 01:48:20.859: E/AndroidRuntime(15874): at android.app.ActivityThread.main(ActivityThread.java:4745) 
09-22 01:48:20.859: E/AndroidRuntime(15874): at java.lang.reflect.Method.invokeNative(Native Method) 
09-22 01:48:20.859: E/AndroidRuntime(15874): at java.lang.reflect.Method.invoke(Method.java:511) 
09-22 01:48:20.859: E/AndroidRuntime(15874): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
09-22 01:48:20.859: E/AndroidRuntime(15874): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
09-22 01:48:20.859: E/AndroidRuntime(15874): at dalvik.system.NativeStart.main(Native Method) 

답변

0

이를 함께 안드로이드 응용 프로그램에 나를 돌아갑니다 솔루션은 작동합니다 :

Session: an attempt was made to request new permissions for a session that has a pending request

나는 시간에 로그인 및 공유 작업을하려고합니다. 필요한 권한으로 로그인 작업이 완료 될 때까지 기다려야합니다. 그런 다음 애플리케이션을 통해 콘텐츠를 공유 할 수 있습니다. 희망이 도움이됩니다.

...

당신은 onCompleted() 방법 shareOnFacebook() 메소드를 호출 할 필요가 있습니다.

+0

어떻게 작성해주세요. – geekdev786