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中的地雷

Android:WebView/BaseInputConnection 中的退格键

多进程中的 Android Pie (9.0) WebView

Android 下的 WebView 中数据如何保存

Android API 21 中的 Webview 为空白/白色

Android O 中的 WebView 崩溃