2013-03-23 72 views
1

我使用Twitter4j來製作一個Twitter應用程序,用於學習如何製作應用程序。我通過複製sample code from the twitter4j site爲ICS製作了一個非常基本的應用程序。 twitter4j api發送OAuth進程的http請求,然後打開授權過程發生的網頁。問題是應用程序卡在代碼的http請求部分。我已在清單文件中添加了許可<uses-permission android:name="android.permission.INTERNET"/>。代碼片段如下。使用Twitter4j的Http請求不起作用並卡住

 Log.v("storeCredentials", "Started"); 
     System.out.println("storeCredentials"+" Started"); 
     Twitter t1 = TwitterFactory.getSingleton(); 
     t1.setOAuthConsumer(twitter.getConsumerKey(), twitter.getConsumerSecret()); 
     Log.v("storeCredentials", "consumer set"); 
     System.out.println("storeCredentials"+" consumer set"); 
     //ConnectionDetector detective = new ConnectionDetector(this); 
     System.out.println("storeCredentials"+" debug 5"); 
     Log.v("storeCredentials", "connection present"); 

     //Progress Dialog 
     System.out.println("storeCredentials"+" debug 6"); 
     final ProgressDialog d1 = new ProgressDialog(this); 
     System.out.println("storeCredentials"+" debug 7"); 
     d1.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     d1.setCancelable(false); 
     d1.show(); 


     new Thread(new Runnable(){ 
      public void run() 
      { 
       Twitter temp = TwitterFactory.getSingleton(); 
       temp.setOAuthConsumer(twitter.getConsumerKey(), twitter.getConsumerSecret()); 
       try 
       { 
        RequestToken tempToken = temp.getOAuthRequestToken(); 
        AccessToken accessToken = null; 
        System.out.println("storeCredentials"+" debug 10"); 
        Log.v("storeCredentials", "tokens init"); 
        //BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
         //while (null == accessToken) return true; 
         String url = tempToken.getAuthorizationURL(); 
         //String url = "http://www.google.co.in"; 
         if (!url.startsWith("https://") && !url.startsWith("http://")) 
         { 
          url = "http://" + url; 
         } 
         Uri webpage = Uri.parse(url); 
         Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage); 
         Log.v("storeCredentials", "Intent created"); 
         System.out.println("storeCredentials"+" Intent created"); 
         // Verify it resolves 
         PackageManager packageManager = getPackageManager(); 
         List<ResolveInfo> activities = packageManager.queryIntentActivities(webIntent, 0); 
         boolean isIntentSafe = activities.size() > 0; 
         Log.v("Number of browsers", String.valueOf(activities.size())); 
         System.out.println("storeCredentials"+" Number of browsers" + " String.valueOf(activities.size())"); 
         // Start an activity if it's safe 
         if (isIntentSafe) 
         { 
          startActivity(webIntent); 
         } 

我敢肯定的應用卡在RequestToken tempToken = temp.getOAuthRequestToken();線監守我沒有收到,要求我選擇瀏覽器的提示。 twitter4j網站的示例代碼正常工作。我通過在java應用程序中使用它進行驗證。

爲什麼會有這種情況發生?我還必須包含其他許可以及返回請求嗎?

+0

如果您在IDE中執行此操作,請嘗試設置斷點並點擊它。 – karmanaut 2013-03-29 13:23:37

回答

1

這是通過執行http請求來爲異步任務上的twitter4j檢索請求令牌來解決的。

public void getRequestToken()  
{ 
Log.v("storeCredentials", "Started"); 
       System.out.println("storeCredentials"+" Started"); 
       Twitter t1 = TwitterFactory.getSingleton(); 
       t1.setOAuthConsumer(twitter.getConsumerKey(), twitter.getConsumerSecret()); 
       Log.v("storeCredentials", "consumer set"); 
       System.out.println("storeCredentials"+" consumer set"); 
       //ConnectionDetector detective = new ConnectionDetector(this); 
       System.out.println("storeCredentials"+" debug 5"); 
       Log.v("storeCredentials", "connection present"); 

       //Progress Dialog 
       System.out.println("storeCredentials"+" debug 6"); 
       final ProgressDialog d1 = new ProgressDialog(this); 
       System.out.println("storeCredentials"+" debug 7"); 
       d1.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
       d1.setCancelable(false); 
       d1.show(); 
     new RequestLoginToken().execute(1); 
} 
    public class RequestLoginToken extends AsyncTask<Integer, Void, RequestToken> { 


         @Override 
         protected RequestToken doInBackground(Integer... params) { 
          int code = params[0].intValue(); 

          Twitter temp = TwitterFactory.getSingleton(); 
          System.out.println("storeCredentials"+" debug 7"); 
          RequestToken tempToken = null; 
          System.out.println("storeCredentials"+" debug 8"); 
          try 
          { 
           tempToken = temp.getOAuthRequestToken(); 
           System.out.println("storeCredentials"+" debug 9"); 
          } 
          catch(Exception e) 
          { 
           System.out.println("Error getting token"); 
          } 
          return tempToken; 

         } 

         @Override 
         protected void onPostExecute(RequestToken token) 
         { 
          pd1.dismiss(); 
          if(token==null) 
          { 
           Toast.makeText(context, "Try again", Toast.LENGTH_SHORT).show(); 
           return; 
          } 
          requestToken = token; 
          pd1.dismiss(); 
          flag = true; 
          launchURL(requestToken.getAuthenticationURL()); 
         } 

        }