当请求新权限时,请继续收到UnsupportedOperationException

我是Facebook新手,因此我不太确定为什么会出现此错误。我已经把范围缩小到本节:当请求新权限时,请继续收到UnsupportedOperationException

 List<String> permissions = session.getPermissions(); 

if (!isSubsetOf(PERMISSIONS, permissions)) {

pendingPublishReauthorization = true;

Session.NewPermissionsRequest newPermissionsRequest = new Session

.NewPermissionsRequest(this, PERMISSIONS);

Here>> session.requestNewPublishPermissions(newPermissionsRequest); <<Here

return;

} //this code is located below in the publishStory() method

我跟着两个Authenticate教程,和Publish Feed教程完全一样就是有位重排序,以满足我的需求。我不确定我可能错过了什么。我将发布SelectionFragment类,我将发布状态的内容放到了用户登录的位置。为了确保这一点很明确,登录完美无缺。但是当我尝试点击发布状态时,它什么都不做。第二次点击它,它崩溃了。任何解释将不胜感激。


public class SelectionFragment extends Fragment{ 

private static final int REAUTH_ACTIVITY_CODE = 100;

private ProfilePictureView profilePictureView;

private TextView userNameView;

private UiLifecycleHelper uiHelper;

private Button shareButton;

private static final List<String> PERMISSIONS = Arrays.asList("publish_actions");

private static final String PENDING_PUBLISH_KEY = "pendingPublishReauthorization";

protected static final String TAG = "SelectionFragment.java";

private boolean pendingPublishReauthorization = false;

private Session.StatusCallback callback = new Session.StatusCallback() {

@Override

public void call(final Session session, final SessionState state, final Exception exception) {

onSessionStateChange(session, state, exception);

}

};

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

uiHelper = new UiLifecycleHelper(getActivity(), callback);

uiHelper.onCreate(savedInstanceState);

}//end of onCreate()

@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);

//find the share button

shareButton = (Button) view.findViewById(R.id.shareButton);

shareButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

publishStory();

}

});

// Check for an open session

Session session = Session.getActiveSession();

if (session != null && session.isOpened()) {

// Get the user's data

makeMeRequest(session);

}

if (savedInstanceState != null) {

pendingPublishReauthorization =

savedInstanceState.getBoolean(PENDING_PUBLISH_KEY, false);

}

return view;

}//end of onCreateView

/*

* Private method that requests users data

* */

private void makeMeRequest(final Session session) {

// Make an API call to get user data and define a

// new 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 id for the ProfilePictureView

// view that in turn displays the profile picture.

profilePictureView.setProfileId(user.getId());

// Set the Textview's text to the user's name.

userNameView.setText(user.getName());

}

}

if (response.getError() != null) {

// Handle errors, will do so later.

}

}

});

request.executeAsync();

}

/*

* private method that will respond to session changes and call

* the makeMeRequest() method if the session's open

* */

private void onSessionStateChange(final Session session, SessionState state, Exception exception) {

if (session != null && session.isOpened()) {

// Get the user's data.

makeMeRequest(session);

}

/*The following checks if user is logged in and hides or shows the share button*/

if (state.isOpened()) {

shareButton.setVisibility(View.VISIBLE);

if (pendingPublishReauthorization &&

state.equals(SessionState.OPENED_TOKEN_UPDATED)) {

pendingPublishReauthorization = false;

publishStory();

}

} else if (state.isClosed()) {

shareButton.setVisibility(View.INVISIBLE);

}

}//end of onSessionStateChanged

@Override

public void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

if (requestCode == REAUTH_ACTIVITY_CODE) {

uiHelper.onActivityResult(requestCode, resultCode, data);

}

}

@Override

public void onResume() {

super.onResume();

uiHelper.onResume();

}

@Override

public void onSaveInstanceState(Bundle bundle) {

super.onSaveInstanceState(bundle);

bundle.putBoolean(PENDING_PUBLISH_KEY, pendingPublishReauthorization);

uiHelper.onSaveInstanceState(bundle);

}

@Override

public void onPause() {

super.onPause();

uiHelper.onPause();

}

@Override

public void onDestroy() {

super.onDestroy();

uiHelper.onDestroy();

}

/*

* What actually publishes the status update

* */

private void publishStory() {

Session session = Session.getActiveSession();

if (session != null){

// Check for publish permissions

List<String> permissions = session.getPermissions();

if (!isSubsetOf(PERMISSIONS, permissions)) {

pendingPublishReauthorization = true;

Session.NewPermissionsRequest newPermissionsRequest = new Session

.NewPermissionsRequest(this, PERMISSIONS);

session.requestNewPublishPermissions(newPermissionsRequest);

return;

}

Bundle postParams = new Bundle();

postParams.putString("name", "Facebook SDK for Android");

postParams.putString("caption", "Build great social apps and get more installs.");

postParams.putString("description", "The Facebook SDK for Android makes it easier and faster to develop Facebook integrated Android apps.");

postParams.putString("link", "https://developers.facebook.com/android");

postParams.putString("picture", "/wp-content/uploads/new2022/20220327voicc/63151208.png");

Request.Callback callback= new Request.Callback() {

public void onCompleted(Response response) {

JSONObject graphResponse = response

.getGraphObject()

.getInnerJSONObject();

String postId = null;

try {

postId = graphResponse.getString("id");

} catch (JSONException e) {

Log.i(TAG,

"JSON error "+ e.getMessage());

}

FacebookRequestError error = response.getError();

if (error != null) {

Toast.makeText(getActivity()

.getApplicationContext(),

error.getErrorMessage(),

Toast.LENGTH_SHORT).show();

} else {

Toast.makeText(getActivity()

.getApplicationContext(),

postId,

Toast.LENGTH_LONG).show();

}

}

};

Request request = new Request(session, "me/feed", postParams,

HttpMethod.POST, callback);

RequestAsyncTask task = new RequestAsyncTask(request);

task.execute();

}

}//end of publishStory

private boolean isSubsetOf(Collection<String> subset, Collection<String> superset) {

for (String string : subset) {

if (!superset.contains(string)) {

return false;

}

}

return true;

}

}//end of class

编辑

好了,所以我能够最终发布,但现在我已经想通了,为什么它的崩溃仍。上述类中的最后一个方法isSubset似乎总是返回false,这意味着即使发布权限已经创建,也会始终运行。

编辑2

public class FacebookFrag extends FragmentActivity { 

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 MenuItem settings;

//flag that indicates a visible activity

private boolean isResumed = false;

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);

setContentView(R.layout.facebook_layout);

FragmentManager fm = getSupportFragmentManager();

fragments[SPLASH] = fm.findFragmentById(R.id.splashFragment);

fragments[SELECTION] = fm.findFragmentById(R.id.selectionFragment);

fragments[SETTINGS] = fm.findFragmentById(R.id.userSettingsFragment);

FragmentTransaction transaction = fm.beginTransaction();

for(int i = 0; i < fragments.length; i++) {

transaction.hide(fragments[i]);

}

transaction.commit();

uiHelper = new UiLifecycleHelper(this, callback);

uiHelper.onCreate(savedInstanceState);

}

private void showFragment(int fragmentIndex, boolean addToBackStack) {

FragmentManager fm = getSupportFragmentManager();

FragmentTransaction transaction = fm.beginTransaction();

for (int i = 0; i < fragments.length; i++) {

if (i == fragmentIndex) {

transaction.show(fragments[i]);

} else {

transaction.hide(fragments[i]);

}

}

if (addToBackStack) {

transaction.addToBackStack(null);

}

transaction.commit();

}

private void onSessionStateChange(Session session, SessionState state, Exception exception) {

// Only make changes if the activity is visible

if (isResumed) {

FragmentManager manager = getSupportFragmentManager();

// Get the number of entries in the back stack

int backStackSize = manager.getBackStackEntryCount();

// Clear the back stack

for (int i = 0; i < backStackSize; i++) {

manager.popBackStack();

}

if (state.isOpened()) {

// If the session state is open:

// Show the authenticated fragment

showFragment(SELECTION, false);

} else if (state.isClosed()) {

// If the session state is closed:

// Show the login fragment

showFragment(SPLASH, false);

}

}

}

@Override

protected void onResumeFragments() {

super.onResumeFragments();

Session session = Session.getActiveSession();

if (session != null && session.isOpened()) {

// if the session is already open,

// try to show the selection fragment

showFragment(SELECTION, false);

} else {

// otherwise present the splash screen

// and ask the person to login.

showFragment(SPLASH, false);

}

}

@Override

public boolean onPrepareOptionsMenu(Menu menu) {

// only add the menu when the selection fragment is showing

if (fragments[SELECTION].isVisible()) {

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)) {

showFragment(SETTINGS, true);

return true;

}

return false;

}

@Override

public void onResume() {

super.onResume();

uiHelper.onResume();

isResumed = true;

}

@Override

public void onPause() {

super.onPause();

uiHelper.onPause();

isResumed = false;

}

@Override

public void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

uiHelper.onActivityResult(requestCode, resultCode, data);

}

@Override

public void onDestroy() {

super.onDestroy();

uiHelper.onDestroy();

}

@Override

protected void onSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);

uiHelper.onSaveInstanceState(outState);

}

}//end of class

回答:

只是删除您publishstory返回();并确保您的会话处于OPEN状态,当你调用publishstory()。

//

if(isNetworkAvailable()){ 

/* ~post your data only if session is in OPEN state also check

for login and internet connection*/

Session session=Session.getActiveSession();

if(session!=null){

MyLog.w("session state",session.getState().toString());

if(session.getState()==SessionState.OPENED){

publishStory();

}else{

showAlertDialog("Unable to Share");

}

}else{

showAlertDialog("Please login first!");

}

}else{

showAlertDialog("Problem occured with your internet connection");

}

删除return语句

if (!isSubsetOf(PERMISSIONS, permissions)) { 

pendingPublishReauthorization = true;

Session.NewPermissionsRequest newPermissionsRequest = new Session

.NewPermissionsRequest(this, PERMISSIONS);

session.requestNewPublishPermissions(newPermissionsRequest);

`Remove this===>` return;

}

回答:

通常,当你得到了UnsupportedOperationException异常,这意味着该设备无法找到您的应用中使用的方法。 你需要检查的东西:

  1. Android版本的模拟器或测试设备必须大于Min SDK吗?
  2. 所有库都包含并正确导出?

以上是 当请求新权限时,请继续收到UnsupportedOperationException 的全部内容, 来源链接: utcz.com/qa/263504.html

回到顶部