2012-05-11 53 views
4

enter image description hereTwitter的登录对话框错误

您好我有集成的Twitter在我的Android application.here的问题是,当我尝试登录到它应该显示在第一次登录对话框Twitter的,它显示了对话框正确,我可以登录到Twitter帐户,但在第二次尝试登录时显示一个空白的twitter对话框。下面是我的代码TwitterDialog calss。我该如何解决这个问题。请给我一个解决方案。

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

    } 
}`` 

回答

6

您需要强制登录第二次来解决这个问题,

所以只需添加force_login =真在你的Twitter授权网址。

我的意思只是改变了下面的代码行中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加载问题将被解决,但每次您需要输入登录名和密码。

我被卡住整天解决这个问题。

+0

很好的答案,它的工作感谢Vivek ......... – Ganesh

+0

非常感谢您对本文的评论对于大多数使用Twitter的开发者来说,这真的是一个非常大的问题.....我有一个问题。如果我已经登录,我的访问令牌是有效的,但仍然想显示登录对话框是可能的。如果登录后它是这样的话,它会生成一个新的访问令牌,或者它将使用旧的有效访问令牌?新登录后 –

+1

它可能会返回相同或不同的access_token。所以你需要每次更新你的access_token。 –