我正在使用最新的facebook sdk,我试图按照官方样本创建自己的登录按钮,但是,我在我的应用程序中发现了一个奇怪的行为。
登录后,会弹出一个权限对话框,即使我点击了“接受”,它仍然属于授权例外并且未找到显示权限,如何解决?
谢谢
public class SharePicForm extends Activity implements LoginListener,
UploadImageListener {
private final String TAG = "SharePicForm";
public ImageView photoArea;
public ImageView sharePhotoBtn;
public TextView shareTitle;
public EditText shareContent;
public Bitmap mBitmap;
public Context ctx;
public String shareTxt;
public String fileUri;
public static boolean isShowForm = true;
public EasyTracker tracker = null;
public SharedPreferences prefs;
public String catId;
public File savedBitmap;
public Editor editor;
public ProgressDialog pd;
// Facebook share
private PendingAction pendingAction = PendingAction.NONE;
private enum PendingAction {
NONE, POST_PHOTO
}
private Session.StatusCallback callback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state,
Exception exception) {
onSessionStateChange(session, state, exception);
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.share_pic_form);
ctx = this;
prefs = ctx.getSharedPreferences("userInfo", 0);
editor = prefs.edit();
tracker = EasyTracker.getInstance(this);
Utility.setHeader(this, "selfie", false);
Session session = Session.getActiveSession();
if (session == null) {
if (savedInstanceState != null) {
session = Session.restoreSession(this, null, callback,
savedInstanceState);
}
if (session == null) {
session = new Session(this);
}
Session.setActiveSession(session);
if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
session.openForRead(new Session.OpenRequest(this).setPermissions(Arrays.asList("basic_info","email")).setCallback(callback));
}
}
photoArea = (ImageView) findViewById(R.id.photo_area);
int size = (int) (Utility.getScreenWidth(this) - 220);
RelativeLayout.LayoutParams imgParams = new RelativeLayout.LayoutParams(size, size);
imgParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
imgParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
// imgParams.addRule(RelativeLayout.ABOVE, R.id.share_title);
photoArea.setAdjustViewBounds(true);
photoArea.setLayoutParams(imgParams);
photoArea.setBackgroundResource(android.R.color.darker_gray);
photoArea.getBackground().setAlpha(204); // = 0.8 alpha
shareTitle = (TextView) findViewById(R.id.share_title);
shareContent = (EditText) findViewById(R.id.share_content);
shareContent.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (v.getId() == R.id.share_content) {
v.getParent().requestDisallowInterceptTouchEvent(true);
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_UP:
v.getParent().requestDisallowInterceptTouchEvent(false);
break;
}
}
return false;
}
});
if (getIntent() != null) {
Intent intent = getIntent();
fileUri = (String) intent.getStringExtra("photo");
catId = (String) intent.getStringExtra("catId");
} else if (savedInstanceState != null) {
mBitmap = (Bitmap) savedInstanceState.getParcelable("bitmap") == null ? null
: (Bitmap) savedInstanceState.getParcelable("bitmap");
catId = (String) savedInstanceState.getString("catId");
}
savedBitmap = new File(fileUri);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap beforeScale = BitmapFactory.decodeFile(fileUri, options);
if (beforeScale.getWidth() > 1280) {
mBitmap = ThumbnailUtils.extractThumbnail(beforeScale, 1280, 1280);
FileOutputStream fos;
try {
fos = new FileOutputStream(savedBitmap);
mBitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
mBitmap = beforeScale;
}
if (mBitmap == null) {
Toast.makeText(ctx,ctx.getResources().getString(R.string.get_photo_error),Toast.LENGTH_SHORT).show();
finish();
} else {
photoArea.setImageBitmap(mBitmap);
sharePhotoBtn = (ImageView) findViewById(R.id.share_submit);
sharePhotoBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
tracker.send(MapBuilder.createEvent("form_button",
"Category_form",
"SubmitnShare_" + Utility.getLocale(ctx), null)
.build());
performPublish(PendingAction.POST_PHOTO);
}
});
}
}
// Facebook share
@SuppressWarnings("deprecation")
private void onSessionStateChange(final Session session,
SessionState state, Exception exception) {
Log.d(TAG, "" + exception);
if (pendingAction != PendingAction.NONE && exception != null) {
if (!session.isClosed())
session.closeAndClearTokenInformation(); // reset session
if (exception instanceof FacebookAuthorizationException) {
new AlertDialog.Builder(SharePicForm.this)
.setTitle(ctx.getResources().getString(R.string.error))
.setMessage(
ctx.getResources().getString(
R.string.facebook_permission_missing))
.setPositiveButton(
ctx.getResources().getString(R.string.close),
null).show();
}
pendingAction = PendingAction.NONE;
} else if (state == SessionState.OPENED_TOKEN_UPDATED) {
Request.executeMeRequestAsync(session,
new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser user,
Response response) {
// TODO Auto-generated method stub
if (user != null) {
if (!user.getId().equals(
prefs.getString("fbId", ""))) {
editor.putString("fbId", user.getId());
editor.putString("fName",
user.getFirstName());
editor.putString("lName",
user.getLastName());
if (user.getProperty("email") != null) {
editor.putString("email", user.getProperty("email").toString());
}
editor.commit();
}
if (prefs.getString("memId", "").equals("")
|| prefs.getString("token", "").equals(
"")
|| !user.getId().equals(
prefs.getString("fbId", ""))) {
pd = ProgressDialog.show(
ctx,
getResources().getString(
R.string.sys_info),
getResources().getString(
R.string.loading));
new APIHandler(ctx, tracker, "login", pd)
.execute(ctx,
session.getAccessToken());
} else {
onLoginComplete("", "");
}
}
}
});
} else if (session != null && session.isOpened()) {
session.requestNewPublishPermissions(new Session.NewPermissionsRequest(
this, "publish_actions")); // login complete
}
}
private boolean hasPublishPermission() {
Session session = Session.getActiveSession();
return session != null
&& session.getPermissions().contains("publish_actions");
}
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;
if (previouslyPendingAction == PendingAction.POST_PHOTO) {
MyApp appState = ((MyApp) getApplicationContext());
boolean isGameClose = appState.getState();
if (isGameClose) {
Toast.makeText(this,
getResources().getString(R.string.game_close),
Toast.LENGTH_LONG).show();
} else {
pd = ProgressDialog.show(ctx,
getResources().getString(R.string.sys_info),
getResources().getString(R.string.publishing));
postPhoto();
}
}
}
private void performPublish(PendingAction action) {
Log.d(TAG, "Perform publish");
Session session = Session.getActiveSession();
if (session != null) {
Log.d(TAG, "Session != null");
pendingAction = action;
if (hasPublishPermission()) {
Log.d(TAG, "Has permission");
// We can do the action right away.
handlePendingAction();
return;
} else if (session.isOpened()) {
Log.d(TAG, "Open session");
// We need to get new permissions, then complete the action when
// we get called back.
session.requestNewPublishPermissions(new Session.NewPermissionsRequest(this, "publish_actions"));
return;
} else {
onClickLogin();
}
} else {
Log.d(TAG, "Session == null");
}
}
private void onClickLogin() {
Session session = Session.getActiveSession();
if (!session.isOpened() && !session.isClosed()) {
session.openForRead(new Session.OpenRequest(this).setPermissions(Arrays.asList("basic_info","email")).setCallback(callback));
} else {
Session.openActiveSession(this, true, callback);
}
}
private void postPhoto() {
Log.d(TAG, "postPhoto: " + hasPublishPermission());
if (hasPublishPermission()) {
Request request = Request.newUploadPhotoRequest(
Session.getActiveSession(), mBitmap,
new Request.Callback() {
@Override
public void onCompleted(Response response) {
if (response.getError() == null
&& savedBitmap != null) {
new APIHandler(ctx, tracker, "uploadImg", pd)
.execute(ctx, shareTxt, savedBitmap,
catId);
} else {
if (pd != null)
pd.dismiss();
Log.d(TAG, response.getError()
.getErrorMessage());
Toast.makeText(ctx,
response.getError().getErrorMessage(),
Toast.LENGTH_LONG).show();
Utility.showDialog(ctx, "error", tracker);
}
}
});
Bundle params = request.getParameters();
shareTxt = shareContent.getText().toString().equals("") ? getResources().getString(R.string.default_msg) : shareContent.getText().toString();
params.putString("message", shareTxt);
request.setParameters(params);
request.executeAsync();
} else {
if (pd != null)
pd.dismiss();
pendingAction = PendingAction.POST_PHOTO;
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (mBitmap != null) {
outState.putParcelable("bitmap", mBitmap);
}
if (catId != null) {
outState.putString("catId", catId);
}
Session session = Session.getActiveSession();
Session.saveSession(session, outState);
}
@Override
public void onStart() {
super.onStart();
Session.getActiveSession().addCallback(callback);
EasyTracker.getInstance(this).activityStart(this);
tracker.set(Fields.SCREEN_NAME, "hk7app/CX/" + Utility.getLocale(this)
+ "/Image_entryForm");
tracker.send(MapBuilder.createAppView().build());
}
@Override
public void onStop() {
if (pd != null)
pd.dismiss();
super.onStop();
Session.getActiveSession().removeCallback(callback);
EasyTracker.getInstance(this).activityStop(this);
}
@Override
public void onDestroy() {
if (savedBitmap != null && savedBitmap.exists())
savedBitmap.delete();
super.onDestroy();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Session.getActiveSession().onActivityResult(this, requestCode,
resultCode, data);
}
@Override
public void onResume() {
super.onResume();
AppEventsLogger.activateApp(this,
getResources().getString(R.string.app_id));
}
@Override
public void onLoginComplete(String memberId, String token) {
if (pd != null)
pd.dismiss();
if (!memberId.equals("") && !token.equals("")) {
editor.putString("memId", memberId);
editor.putString("token", token);
editor.commit();
}
handlePendingAction();
}
@Override
public void onLoginFailure(String errorMsg) {
if (pd != null)
pd.dismiss();
Toast.makeText(this, errorMsg, Toast.LENGTH_LONG).show();
}
@Override
public void onImageUploadComplete(int isFormCompleted) {
if (pd != null)
pd.dismiss();
if (isFormCompleted == 1) {
Utility.showDialog(ctx, "success", tracker);
} else {
Intent intent = new Intent(ctx, PersonalInfoForm.class);
ctx.startActivity(intent);
finish();
}
}
@Override
public void onImageUploadFailure(String errorMsg) {
if (pd != null)
pd.dismiss();
Toast.makeText(this, errorMsg, Toast.LENGTH_LONG).show();
}
}
答案 0 :(得分:1)
我的建议是使用单独的Session.StatusCallback
实施来登录'和' requestPostPermission'。
private Session.StatusCallback callbackLogin = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state,
Exception exception) {
session.removeCallback( this );
if ( session.isOpen() ) {
...
} else if ( session.isClosed() ) {
...
}
}
};
和postPermissions:
private Session.StatusCallback callbackPostPermission = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state,
Exception exception) {
session.removeCallback( this );
if ( session.isOpen() ) {
if ( session.getPermissions().contains( "publish_actions" ) {
...
} else {
...
}
...
} else if ( session.isClosed() ) {
...
}
}
};