2014-01-24 51 views
0

我正在尝试使用Android Studio 0.4.2和Twitter4J库开发自己的Android应用程序。我的想法是使用WebView在那里加载Twitter认证页面并从那里获取AccessToken。我可以获得oauth_token和oauth_verifier,但是在那之后,所有Twitter方法都可以获得关注者,发布twits,无论什么都不起作用。使用浏览器用户身份验证的Android4的Twitter4J错误:未发现身份验证挑战

这是我的代码:

public class TwitterLoginFragment extends Fragment { 
    private static String TWITTER_CONSUMER_KEY = "***"; 
    private static String TWITTER_CONSUMER_SECRET = "***"; 
    private static final String TWITTER_CALLBACK_URL = "http://www.hita.pro"; 

    private static SharedPreferences sharedPreferences; 
    private Button btnTwitterLogin; 
    private Button btnTwitterLogOut; 
    private WebView wvTwitterLogin; 

    private IDs iDs; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     sharedPreferences = getActivity().getSharedPreferences("CONNECTION_INFO", Context.MODE_PRIVATE); 
     TwitterFactory.getSingleton().setOAuthConsumer(TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET); 
     return inflater.inflate(R.layout.fragment_twitter_login, container, false); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstance) { 
     super.onActivityCreated(savedInstance); 

     wvTwitterLogin = (WebView) getView().findViewById(R.id.wvTwitterLogin); 
     wvTwitterLogin.setWebViewClient(new WebViewClient() { 
      @Override 
      public boolean shouldOverrideUrlLoading(WebView view, String url) { 
       SharedPreferences.Editor editor = sharedPreferences.edit(); 
       editor.putBoolean("KEY_TWITTER_LOGIN", true); 
       editor.putString("OAUTH_TOKEN", url.substring(url.indexOf("oauth_token=") + 12, url.indexOf("&"))); 
       editor.putString("OAUTH_VERIFIER", url.substring(url.indexOf("oauth_verifier=") + 15)); 
       editor.commit(); 

       TwitterFactory.getSingleton().setOAuthAccessToken(new AccessToken(sharedPreferences.getString("OAUTH_TOKEN", ""), sharedPreferences.getString("OAUTH_VERIFIER", ""))); 

       new GetTwitterFollowers().execute(); 

       return true; 
      } 
     }); 

     btnTwitterLogin = (Button) getView().findViewById(R.id.btnTwitterLogin); 
     btnTwitterLogin.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       loginToTwitter(); 
      } 
     }); 

     btnTwitterLogOut = (Button) getView().findViewById(R.id.btnTwitterLogOut); 
     btnTwitterLogOut.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       twitterLogOut(); 
      } 
     }); 
    } 

    public void loginToTwitter() { 
     if (!isTwitterLoggedInAlready()) { 
      Thread thread = new Thread(new Runnable() { 
       @Override 
       public void run() { 
        try { 
         wvTwitterLogin.loadUrl(TwitterFactory.getSingleton().getOAuthRequestToken(TWITTER_CALLBACK_URL).getAuthenticationURL()); 

         getActivity().runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           goToTwitterLogin(); 
          } 
         }); 
        } catch (Exception e) { 
         e.printStackTrace(); 
         Toast.makeText(getActivity(), getString(R.string.error_already_logged_twitter), Toast.LENGTH_LONG).show(); 
        } 
       } 
      }); 

      thread.start(); 
     } else 
      Toast.makeText(getActivity(), getString(R.string.error_already_logged_twitter), Toast.LENGTH_LONG).show(); 
    } 

    private void goToTwitterLogin() { 
     btnTwitterLogin.setVisibility(View.GONE); 
     btnTwitterLogOut.setVisibility(View.GONE); 
     wvTwitterLogin.setVisibility(View.VISIBLE); 
    } 

    private boolean isTwitterLoggedInAlready() { 
     return sharedPreferences.getBoolean("KEY_TWITTER_LOGIN", false); 
    } 

    private void twitterLogOut() { 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     editor.putBoolean("KEY_TWITTER_LOGIN", false); 
     editor.commit(); 
    } 

    private class GetTwitterFollowers extends AsyncTask<Void, Void, Void> { 
     @Override 
     protected Void doInBackground(Void... v) { 
      try { 
       iDs = TwitterFactory.getSingleton().getFollowersIDs(-1); 
      } catch (TwitterException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      iDs.getIDs(); 
     } 
    } 
} 

当我打电话给TwitterFactory.getSingleton()getFollowersIDs(-1)的用户已经烧焦的后,我得到这个异常:

java.io.IOException: No authentication challenges found 

我绝望了,我花了一个星期试图解决这个问题,但我在StackOverflow和其他网站中找到的所有线程都不起作用。系统时钟正常,我尝试过使用ConfigurationBuilder和其他解决方案,但没有运气。有人能帮助我吗?

非常感谢!

回答

0

你是否尝试过使用TwitterFactory中的非单例实例?

Uri uri  = Uri.parse(url); 
String token = uri.getQueryParameter("OAUTH_TOKEN"); 
String verifier = uri.getQueryParameter("OAUTH_VERIFIER"); 

Twitter twitter = TwitterFactory.getInstance(
     new AccessToken(token,verifier); 

twitter.getFollowers(-1);