私は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>
私はトークンをキャッチしたら、このアクティビティ(WebView)を終了して特定のアクティビティに行くのですか? WebViewからインテント別のアクティビティにリダイレクトする方が良いでしょうか、それとも簡単な方法がありますか? – user1376885
実際には、あなたのアクティビティでWebViewClient(View.GONEで可視性が設定されている)を持っていなければなりません。 ユーザーがアカウントをリンクする場合は、このWebView(VisibilityをView.VISIBLEに設定)を表示し、このWebViewにログインURLをロードします。 ユーザーがロゴ/パスワードを確認すると、webviewは必要な情報を含む特定のURLにリダイレクトします。 'shouldOverrideUrlLoading'オーバーライドメソッドで' if(url.startsWith(OAUTH_CALLBACK_URL)){'のようなテストをしてください。 – thomasg
私はあなたの言うことをしましたが、別の問題が生じます。私は次のコードを書いた: if(url.startsWith(Constants.OAUTH_CALLBACK_URL)){\t TwitterWebView.setVisibility(View.GONE);} しかし、私のコールバックがキャッチされたとき、私はTwitterアクティビティでリダイレクトされます。しかし、私はこの活動が画像、ボタン、テキストビューなしでどうなるのか理解できませんでした。それは何ですか? もう一度質問がありますが、別のアクティビティでどのようにリダイレクトできますか? – user1376885