无法执行所选操作,因为未授予权限

时间:2015-10-08 06:30:04

标签: android facebook android-studio permissions

我正在进行facebook集成,几乎是通过登录和共享功能完成的。状态共享工作正常。

但是,当我尝试发布照片时,它会提示对话框,并显示以下消息:

无法执行所选操作,因为未授予权限

我还在 AndroidManifest.xml 文件中分配了以下权限,如下所示:

  <?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.myfbint.latestfacebookintegration" >
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name="com.facebook.FacebookActivity"
        android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
        android:theme="@android:style/Theme.Translucent.NoTitleBar"
        android:label="@string/app_name" />
    <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id"/>
    <meta-data android:name="com.facebook.sdk.ApplicationName"
        android:value="@string/facebook_app_name" />
    <provider android:authorities="com.facebook.app.FacebookContentProvider355198514515820"
        android:name="com.facebook.FacebookContentProvider"
        android:exported="true"/>
    <receiver android:name="com.myfbint.latestfacebookintegration.HelloFacebookBroadcastReceiver">
        <intent-filter>
            <action android:name="com.facebook.platform.AppCallResultBroadcast" />
        </intent-filter>
    </receiver>
</application>
</manifest>

以下是我的MainActivity.java文件:

public class MainActivity extends FragmentActivity {

private static final String PERMISSION = "publish_actions";
private static final Location SEATTLE_LOCATION = new Location("") {
    {
        setLatitude(47.6097);
        setLongitude(-122.3331);
    }
};

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

private Button postStatusUpdateButton;
private Button postPhotoButton;
private ProfilePictureView profilePictureView;
private TextView greeting;
private PendingAction pendingAction = PendingAction.NONE;
private boolean canPresentShareDialog;
private boolean canPresentShareDialogWithPhotos;
private CallbackManager callbackManager;
private ProfileTracker profileTracker;
private ShareDialog shareDialog;
private FacebookCallback<Sharer.Result> shareCallback = new FacebookCallback<Sharer.Result>() {
    @Override
    public void onCancel() {
        Log.d("HelloFacebook", "Canceled");
    }

    @Override
    public void onError(FacebookException error) {
        Log.d("HelloFacebook", String.format("Error: %s", error.toString()));
        String title = getString(R.string.error);
        String alertMessage = error.getMessage();
        showResult(title, alertMessage);
    }

    @Override
    public void onSuccess(Sharer.Result result) {
        Log.d("HelloFacebook", "Success!");
        if (result.getPostId() != null) {
            String title = getString(R.string.success);
            String id = result.getPostId();
            String alertMessage = getString(R.string.successfully_posted_post, id);
            showResult(title, alertMessage);
        }
    }

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

private enum PendingAction {
    NONE,
    POST_PHOTO,
    POST_STATUS_UPDATE
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FacebookSdk.sdkInitialize(this.getApplicationContext());

    callbackManager = CallbackManager.Factory.create();

    LoginManager.getInstance().registerCallback(callbackManager,
            new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResult) {
                    handlePendingAction();
                    updateUI();
                }

                @Override
                public void onCancel() {
                    if (pendingAction != PendingAction.NONE) {
                        showAlert();
                        pendingAction = PendingAction.NONE;
                    }
                    updateUI();
                }

                @Override
                public void onError(FacebookException exception) {
                    if (pendingAction != PendingAction.NONE
                            && exception instanceof FacebookAuthorizationException) {
                        showAlert();
                        pendingAction = PendingAction.NONE;
                    }
                    updateUI();
                }

                private void showAlert() {
                    new AlertDialog.Builder(MainActivity.this)
                            .setTitle(R.string.cancelled)
                            .setMessage(R.string.permission_not_granted)
                            .setPositiveButton(R.string.ok, null)
                            .show();
                }
            });

    shareDialog = new ShareDialog(this);
    shareDialog.registerCallback(
            callbackManager,
            shareCallback);

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

    setContentView(R.layout.content_main);

    profileTracker = new ProfileTracker() {
        @Override
        protected void onCurrentProfileChanged(Profile oldProfile, Profile currentProfile) {
            updateUI();
            // It's possible that we were waiting for Profile 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();
        }
    });

    // Can we present the share dialog for regular links?
    canPresentShareDialog = ShareDialog.canShow(
            ShareLinkContent.class);

    // Can we present the share dialog for photos?
    canPresentShareDialogWithPhotos = ShareDialog.canShow(
            SharePhotoContent.class);
}

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

    // Call the 'activateApp' method to log an app event for use in analytics and advertising
    // reporting.  Do so in the onResume methods of the primary Activities that an app may be
    // launched into.
    AppEventsLogger.activateApp(this);

    updateUI();
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.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);
    callbackManager.onActivityResult(requestCode, resultCode, data);
}

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

    // Call the 'deactivateApp' method to log an app event for use in analytics and advertising
    // reporting.  Do so in the onPause methods of the primary Activities that an app may be
    // launched into.
    AppEventsLogger.deactivateApp(this);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    profileTracker.stopTracking();
}

private void updateUI() {
    boolean enableButtons = AccessToken.getCurrentAccessToken() != null;

    postStatusUpdateButton.setEnabled(enableButtons || canPresentShareDialog);
    postPhotoButton.setEnabled(enableButtons || canPresentShareDialogWithPhotos);

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

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 NONE:
            break;
        case POST_PHOTO:
            postPhoto();
            break;
        case POST_STATUS_UPDATE:
            postStatusUpdate();
            break;
    }
}

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

private void postStatusUpdate() {
    Profile profile = Profile.getCurrentProfile();
    ShareLinkContent linkContent = new ShareLinkContent.Builder()
            .setContentTitle("Hello Facebook")
            .setContentDescription(
                    "The 'Hello Facebook' sample  showcases simple Facebook integration")
            .setContentUrl(Uri.parse("http://developers.facebook.com/docs/android"))
            .build();
    if (canPresentShareDialog) {
        shareDialog.show(linkContent);
    } else if (profile != null && hasPublishPermission()) {
        ShareApi.share(linkContent, shareCallback);
    } else {
        pendingAction = PendingAction.POST_STATUS_UPDATE;
    }
}

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

private void postPhoto() {
    Bitmap image = BitmapFactory.decodeResource(this.getResources(), R.drawable.com_facebook_profile_picture_blank_square);
    SharePhoto sharePhoto = new SharePhoto.Builder().setBitmap(image).build();
    ArrayList<SharePhoto> photos = new ArrayList<>();
    photos.add(sharePhoto);

    SharePhotoContent sharePhotoContent =
            new SharePhotoContent.Builder().setPhotos(photos).build();
    if (canPresentShareDialogWithPhotos) {
        shareDialog.show(sharePhotoContent);
    } else if (hasPublishPermission()) {
        ShareApi.share(sharePhotoContent, shareCallback);
    } else {
        pendingAction = PendingAction.POST_PHOTO;
        // We need to get new permissions, then complete the action when we get called back.
        LoginManager.getInstance().logInWithPublishPermissions(
                this,
                Arrays.asList(PERMISSION));
    }
}

private boolean hasPublishPermission() {
    AccessToken accessToken = AccessToken.getCurrentAccessToken();
    return accessToken != null && accessToken.getPermissions().contains("publish_actions");
}

private void performPublish(PendingAction action, boolean allowNoToken) {
    AccessToken accessToken = AccessToken.getCurrentAccessToken();
    if (accessToken != null || allowNoToken) {
        pendingAction = action;
        handlePendingAction();
    }
}

}

我的Logcat如下:

enter image description here

那么,问题应该是什么?

1 个答案:

答案 0 :(得分:1)

当Facebook权限对话框打开时,用户应授予photo-publish权限,否则您将收到此消息无法执行所选操作,因为未授予权限。您可能还需要在Facebook开发者控制台中为您的应用启用照片发布权限。