2012-05-05 15 views
1

我嘗試創建Twitter客戶端,現在我通過OAuth協議處理授權。我創建了「登錄」按鈕來進入WebView並加載Twitter授權URL,這是工作。但是,當授權被成功接受並且Twitter服務將我重定向到我的回調時,我會在WebView中收到錯誤的網頁。這就是說我沒有重定向到我的活動,我仍然留在WebView中。但是,如果通過瀏覽器嘗試相同的方式,它的工作。那是什麼問題?Android:Twitter中的WebView - 返回到活動回調

主要Activivty:

public class Twitter extends Activity implements OnClickListener { 

    Button bSignIn; 
    TextView status; 
    private OAuthConsumer consumer; 
    private OAuthProvider provider; 
    private String url; 
    final String TAG = getClass().getName(); 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.home); 

     bSignIn = (Button) findViewById(R.id.bSignIn); 
     status = (TextView) findViewById(R.id.tvStatus); 
     bSignIn.setOnClickListener(this); 
    } 

    public void onClick(View v) { 
     new OAuthWebViewProcess().execute(); 
    } 

    public class OAuthWebViewProcess extends AsyncTask<Void, Void, Void> { 
     ProgressDialog dialog; 

     protected void onPreExecute() { 
      dialog = ProgressDialog.show(Twitter.this, null, 
        "Connecting, please wait..."); 
     } 

     protected Void doInBackground(Void... params) { 
      try { 
      consumer = new CommonsHttpOAuthConsumer(Constants.CONSUMER_KEY, 
        Constants.CONSUMER_SECRET); 
      provider = new CommonsHttpOAuthProvider(Constants.REQUEST_URL, 
        Constants.ACCESS_URL, Constants.AUTHORIZE_URL); 
      url = provider.retrieveRequestToken(consumer, 
         Constants.OAUTH_CALLBACK_URL); 
      } catch (Exception e) { 
       Log.e(TAG, "Error during OAUth retrieve request token", e); 
      } 
      return null; 
     } 

     protected void onPostExecute(Void result) { 
      //Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
      Intent i = new Intent(Twitter.this, TwitterWebView.class); 
      i.putExtra("url", Uri.parse(url).toString()); 
      startActivityForResult(i, 1); 
      dialog.dismiss(); 
     } 
    } 
} 

的WebView Twitter的:

public class TwitterWebView extends Activity { 

    String url; 
    WebView TwitterWebView; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.twitterwebview); 

     Bundle extras = getIntent().getExtras(); 
     url = extras.getString("url"); 

     try { 
      TwitterWebView = (WebView) findViewById(R.id.wvTwitter); 
      TwitterWebView.setWebViewClient(new TwitterWebViewClient(){ 
       public boolean shouldOverrideUrlLoading(WebView view, String url) { 
        view.loadUrl(url); 
        return true; 
       } 
      }); 
      TwitterWebView.getSettings().setJavaScriptEnabled(true); 
      TwitterWebView.getSettings().setDomStorageEnabled(true); 
      TwitterWebView.getSettings().setSavePassword(false); 
      TwitterWebView.getSettings().setSaveFormData(false); 
      TwitterWebView.getSettings().setSupportZoom(false); 
      TwitterWebView.loadUrl(url); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

清單:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="wixanz.app.twitter" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk android:minSdkVersion="8" /> 

<uses-permission android:name="android.permission.INTERNET" /> 

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
     android:name=".Twitter" 
     android:label="@string/app_name" 
     android:launchMode="singleInstance" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name=".TwitterWebView" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 

      <category android:name="android.intent.category.BROWSABLE" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name=".TweetList" 
     android:label="TweetList" 
     android:launchMode="singleInstance" > 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 

      <data 
       android:host="callback" 
       android:scheme="twitter" /> 
     </intent-filter> 
    </activity> 
</application> 

</manifest> 

回答

2

我做了別人網絡,如LinkedIn,Foursquare的相同。但是我沒有使用回調URL,而是覆蓋WebViewClient中的方法shouldOverrideUrlLoading (WebView view, String url)(用於顯示登錄頁面),以便自己捕獲訪問令牌和令牌密鑰(如果需要)。

+0

Thait是說如果我捕捉到令牌,然後完成()這個活動(WebView)並轉到某個活動?通過Intent從WebView重定向到另一個活動如何更好?還是有更簡單的方法? – user1376885

+0

實際上,您只需在活動中擁有一個WebViewClient(在View.GONE中可見性設置)。 當用戶想要鏈接一個帳戶時,顯示此webView(可見性設置爲View.VISIBLE)並在此webView中加載登錄URL。 當用戶確認他的標識/密碼時,webview會將他重定向到一個包含所需信息的特定URL。可以肯定的是,在'shouldOverrideUrlLoading'覆蓋方法中做一個像if(url.startsWith(OAUTH_CALLBACK_URL)){'的測試。 – thomasg

+0

我做了你說的,但我得到另一個問題。我寫了下面的代碼: if(url.startsWith(Constants.OAUTH_CALLBACK_URL)){\t TwitterWebView.setVisibility(View.GONE);} 但是,當我的回調被捕獲時,我被重定向到Twitter Activity。但我不明白爲什麼這項活動沒有任何圖像,按鈕和文字瀏覽。那是什麼? 再次提問,我如何重定向其他活動? – user1376885