2012-05-05 6 views
1

私はTwitterクライアントを作成しようとしていますが、今はOAuthプロトコルによる承認を扱っています。私はWebViewに来て、Twitterの認証URLをロードするための "サインイン"ボタンを作成しました、それは仕事です。ただし、承認が正常に受け入れられ、Twitterサービスが私のコールバックにリダイレクトされると、WebViewでエラーページが表示されます。つまり、自分の活動にリダイレクトされていない、私はまだWebViewにとどまっています。しかし、ブラウザを使って同じ方法で試してみると、うまくいきます。何が問題なの?Android:WebViewのTwitter - コールバックでアクティビティに戻る

メインActivivty:Twitterのための

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の:

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の、フォースクエアのような他のネットワークについて同じことをやりました。しかし、コールバックURLを使用する代わりに、WebViewClient(ログインページを表示するために使用される)のshouldOverrideUrlLoading (WebView view, String url)メソッドをオーバーライドして、アクセストークンとトークンシークレット(必要な場合)を自分で捕捉します。

+0

私はトークンをキャッチしたら、このアクティビティ(WebView)を終了して特定のアクティビティに行くのですか? WebViewからインテント別のアクティビティにリダイレクトする方が良いでしょうか、それとも簡単な方法がありますか? – user1376885

+0

実際には、あなたのアクティビティでWebViewClient(View.GONEで可視性が設定されている)を持っていなければなりません。 ユーザーがアカウントをリンクする場合は、このWebView(Visibilityを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アクティビティでリダイレクトされます。しかし、私はこの活動が画像、ボタン、テキストビューなしでどうなるのか理解できませんでした。それは何ですか? もう一度質問がありますが、別のアクティビティでどのようにリダイレクトできますか? – user1376885