Twitter登录对话框错误。

3

enter image description here

你好,我在我的安卓应用中集成了Twitter。问题是,当我尝试登录Twitter时,它应该首次显示一个登录对话框,它会正确地显示对话框,然后我能够登录到Twitter帐户,但第二次尝试登录时,它显示一个空的Twitter对话框。以下是我的TwitterDialog类的代码。请问如何解决这个问题?请给我一个解决方案。

public class TwitterDialog extends Dialog {

    static final float[] DIMENSIONS_LANDSCAPE = { 460, 260 };
    static final float[] DIMENSIONS_PORTRAIT = { 280, 420 };
    static final FrameLayout.LayoutParams FILL = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.FILL_PARENT);
    static final int MARGIN = 4;
    static final int PADDING = 2;

    private String mUrl;
    private TwDialogListener mListener;
    private ProgressDialog mSpinner;
    private WebView mWebView;
    private LinearLayout mContent;
    private TextView mTitle;

    private static final String TAG = "Twitter-WebView";

    public TwitterDialog(Context context, String url, TwDialogListener listener) {
        super(context);
        mUrl = url;
        mListener = listener;
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mSpinner = new ProgressDialog(getContext());
        mSpinner.requestWindowFeature(Window.FEATURE_NO_TITLE);
        mSpinner.setMessage("Loading...");
        mContent = new LinearLayout(getContext());
        mContent.setOrientation(LinearLayout.VERTICAL);
        setUpTitle();
        setUpWebView();
        Display display = getWindow().getWindowManager().getDefaultDisplay();
        final float scale = getContext().getResources().getDisplayMetrics().density;
        float[] dimensions = (display.getWidth() < display.getHeight()) ? DIMENSIONS_PORTRAIT: DIMENSIONS_LANDSCAPE;addContentView(mContent, new FrameLayout.LayoutParams((int) (dimensions[0] * scale + 0.5f), (int) (dimensions[1]* scale + 0.5f)));
    }

    private void setUpTitle() {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        Drawable icon = getContext().getResources().getDrawable(R.drawable.twitter_icon);
        mTitle = new TextView(getContext());

        mTitle.setText("Twitter");
        mTitle.setTextColor(Color.WHITE);
        mTitle.setTypeface(Typeface.DEFAULT_BOLD);
        mTitle.setBackgroundColor(0xFFbbd7e9);
        mTitle.setPadding(MARGIN + PADDING, MARGIN, MARGIN, MARGIN);
        mTitle.setCompoundDrawablePadding(MARGIN + PADDING);
        mTitle.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null);
        mContent.addView(mTitle);
    }

    private void setUpWebView() {
        mWebView = new WebView(getContext());

        mWebView.setVerticalScrollBarEnabled(false);
        mWebView.setHorizontalScrollBarEnabled(false);
        mWebView.setWebViewClient(new TwitterWebViewClient());
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.loadUrl(mUrl);
        mWebView.setLayoutParams(FILL);
        //mWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
        mContent.addView(mWebView);
    }

    private class TwitterWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (Constants.LOG)Log.d(TAG, "Redirecting URL " + url);
            if (url.startsWith(TwitterApp.CALLBACK_URL)) {
                mListener.onComplete(url);
                //mWebView.getSettings().setAppCacheEnabled(false);
                //mWebView.refreshDrawableState();
                if (Constants.LOG)Log.d(TAG, "Clearing chache");
                TwitterDialog.this.dismiss();
                return true;
            } else if (url.startsWith("authorize")) {
                return false;
            }
            return true;
        }
        @Override
        public void onReceivedError(WebView view, int errorCode,
            String description, String failingUrl) {
            if (Constants.LOG)Log.d(TAG, "Page error: " + description);
            super.onReceivedError(view, errorCode, description, failingUrl);
            mListener.onError(description);
            TwitterDialog.this.dismiss();
        }
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            if(Constants.LOG)Log.d(TAG, "Loading URL: " + url);
            super.onPageStarted(view, url, favicon);
            mSpinner.show();
        }
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            String title = mWebView.getTitle();
            if (title != null && title.length() > 0) {
            mTitle.setText(title);
            }
            mSpinner.dismiss();
        }

    }
}``
1个回答

6

您需要强制重新登录以解决此问题,

因此只需在Twitter授权网址中添加force_login=true

我的意思是只需更改TwitterApp.java类中的以下代码行(如果您的类文件名称不同,请在项目中搜索DefaultOAuthProvider

mHttpOauthprovider = new DefaultOAuthProvider("http://twitter.com/oauth/request_token",
                "http://twitter.com/oauth/access_token",
        "http://twitter.com/oauth/authorize?force_login=true");

在添加了force_login=true后,webview的加载问题将得到解决,但每次都需要输入登录名和密码。
我整天都卡在了这个问题上。

非常感谢您发布这篇文章。对于使用Twitter的大多数开发人员来说,这确实是一个非常大的问题.....我有一个问题。如果我已经登录并且我的访问令牌有效,但我仍然想显示登录对话框,是否可能?如果是这样,那么在登录后它会生成一个新的访问令牌还是使用旧的有效访问令牌? - KK_07k11A0585
1
新登录后可能会返回相同或不同的access_token。因此,您需要每次更新您的access_token。 - Vivek Kumar Srivastava
好的,非常感谢。我还有一个疑问,我今天上午9点登录了Twitter。那么我的会话或访问令牌有效期是多长时间? - KK_07k11A0585
1
访问令牌的有效性取决于许多因素,例如密码更改、登录位置更改以及时间等。我不知道令牌验证的确切时间长度。 - Vivek Kumar Srivastava
点赞给@Ganesh,因为我整天都被卡在这个问题上并搜索了很多论坛。而且Ganesh问了这个问题,所以对其他人来说真的很有帮助。 - Vivek Kumar Srivastava
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接