Android:WebView 中的 Twitter - 通过回调返回 Activity
Posted
技术标签:
【中文标题】Android:WebView 中的 Twitter - 通过回调返回 Activity【英文标题】:Android: Twitter in WebView - Back to an Activity by callback 【发布时间】:2012-05-14 19:38:05 【问题描述】:我尝试创建 Twitter 客户端,现在我通过 OAuth 协议处理授权。我已经创建了“登录”按钮来进入 WebView 并加载 twitter 授权 URL,这是可行的。但是,当授权被成功接受并且 Twitter 服务将我重定向到我的回调时,我在 WebView 中收到错误网页。也就是说我没有重定向到我的活动,我仍然停留在 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 的 Web 视图:
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>
【问题讨论】:
【参考方案1】:我对 LinkedIn、Foursquare 等其他网络也做了同样的事情。但我没有使用回调 URL,而是在您的 WebViewClient(用于显示登录页面)中覆盖了 shouldOverrideUrlLoading (WebView view, String url)
方法,以自己捕获访问令牌和令牌机密(如果需要)。
【讨论】:
泰语是说如果我抓住令牌然后完成()这个活动(WebView)并去某个活动?如何更好地通过 Intent 从 WebView 重定向到另一个活动,或者还有其他更简单的方法? 实际上,您只需在活动中拥有一个 WebViewClient(可见性设置为 View.GONE)。当用户想要链接帐户时,您会显示此 webView(可见性设置为 View.VISIBLE)并在此 webView 中加载登录 URL。当用户确认他的徽标/密码时,webview 会将他重定向到包含您想要的信息的特定 URL。可以肯定的是,在shouldOverrideUrlLoading
覆盖的方法中进行类似 if (url.startsWith(OAUTH_CALLBACK_URL))
的测试。
我按照你说的做了,但我遇到了另一个问题。我写了下一个代码: if (url.startsWith(Constants.OAUTH_CALLBACK_URL)) TwitterWebView.setVisibility(View.GONE); 但是,当我的回调被捕获时,我被重定向到 Twitter Activity。但我不明白为什么这个活动没有任何图像、按钮和文本视图。那是什么?还有一个问题,我怎样才能重定向到另一个活动?以上是关于Android:WebView 中的 Twitter - 通过回调返回 Activity的主要内容,如果未能解决你的问题,请参考以下文章
Android:WebView/BaseInputConnection 中的退格键
多进程中的 Android Pie (9.0) WebView