为什么android sdk在android中错过了许可?

时间:2014-03-03 16:58:06

标签: android facebook facebook-graph-api

我正在使用最新的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();
    }

}

1 个答案:

答案 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() ) {
                ...
            }
        }
    };