http://blog.blundell-apps.com/sending-a-tweet/
... I set up Twitter user authentication as in the tutorial above such that the
Activity
doing the Twitter authentication has its content view changed to a WebView
, the Activity
is declared in the manifest file containing an intent-filter
to catch the Twitter callback and, on callback, the response is processed and the Activity
's content view is changed back to whatever it was.I got it working but in doing so I found (what I think is) an easier way and such that the
WebView
doesn't ever kick off the phone's web browser app (thereby leaving your app, which you don't really want), as follows:(1) Remove the
Activity
singleInstance
and intent-filter
declarations you added to the manifest file (in following the tutorial above). Don't need that anymore!(2) Add a
WebView
to your Activity
layout file and set its initial visibility to "gone"
and its position, height, width etc however you want it. I set its properties so that it covers the whole screen when visible, as follows:
<WebView
android:id="@+id/myWebView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" />
(3) Get a handle to your WebView
in your Activity
and set its WebViewClient
to pick up the Twitter callback (and not to kick off the web browser app at any time), as follows...
myWebView = (WebView)findViewById(R.id.myWebView);
myWebView.setWebViewClient(new WebViewClient()
{
@Override
public boolean shouldOverrideUrlLoading(WebView webView, String url)
{
if (url != null
&& url.startsWith("myapptwittercallback:///myapp"))
handleTwitterCallback(url);
else
webView.loadUrl(url);
return true;
}
});
... Here you might also want to enable other settings of your WebView
like saving form data and javascript execution (e.g. myWebView.getSettings().setJavaScriptEnabled(true);
)(4) Make your
WebView
visible and focused at the point you need to do Twitter authentication, as follows:
try
{
twitter = new TwitterFactory().getInstance();
twitter.setOAuthConsumer(
myTwitterConsumerKey,
myTwitterConsumerSecret);
twitterRequestToken = twitter.getOAuthRequestToken(
"myapptwittercallback:///myapp");
myWebView.loadUrl(
twitterRequestToken.getAuthenticationURL());
myWebView.setVisibility(View.VISIBLE);
myWebView.requestFocus(View.FOCUS_DOWN);
}
catch (TwitterException ex)
{
Toast.makeText(
this,
"Login failed. Please try again.",
Toast.LENGTH_SHORT).show();
}
... Remember to clear your WebView
's history (i.e. myWebView.clearHistory()
and set its visibility to "gone"
in your handleTwitterCallback(String)
method.(5) Lastly, override your
Activity
's onBackPressed()
method so that your WebView
handles presses of the back
button if its visible, as follows...
@Override
public void onBackPressed()
{
if (myWebView.getVisibility() == View.VISIBLE)
{
if (myWebView.canGoBack())
{
myWebView.goBack();
return;
}
else
{
myWebView.setVisibility(View.GONE);
return;
}
}
super.onBackPressed();
}
That's it! You should now have Twitter integration in your app and the user should never leave your app in doing Twitter authentication.