1

Twitter クライアントを作成しようとしていますが、OAuth プロトコルを介して承認を処理しています。「サインイン」ボタンを作成して、WebView に入り、Twitter の認証 URL をロードしました。これで作業は完了です。ただし、承認が正常に受け入れられ、Twitter サービスがコールバックにリダイレクトすると、WebView でエラー Web ページが表示されます。つまり、アクティビティにリダイレクトされず、WebView のままです。しかし、ブラウザ経由で同じ方法を試すと、うまくいきます。それは何の問題ですか?

主な活動:

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

Twitter の 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>
4

1 に答える 1

2

LinkedIn や Foursquare などの他のネットワークについても同じことをしました。ただし、コールバック URL を使用する代わりに、shouldOverrideUrlLoading (WebView view, String url)(ログイン ページを表示するために使用される) WebViewClient のメソッドをオーバーライドして、アクセス トークンとトークン シークレット (必要な場合) を自分でキャッチします。

于 2012-05-05T14:38:34.213 に答える