Question

I was trying out codes from Android Twitter oAuth Connect Tutorial and it worked successfully. I tried to change the twitter authorization page to run in a WebView instead of a web browser but the WebView couldn't seem to load url with this format oauth://twittersample which is the link back to my application. Upon successful authorization, the webview should close and return to my app successfully.

There is an error saying "The web page at oauth://twittersample?oauth_token=.... might be temporarily down or it may have moved permanently to a new web address". What should I do?

This is the snippet to my WebView that is in my onCreate

WebView myWebView = (WebView)findViewById(R.id.myWebView);

    myWebView.setWebViewClient(new WebViewClient()
    {
    @Override
    public boolean shouldOverrideUrlLoading(WebView webView, String url)
    {
     if (url != null && url.startsWith("oauth://twittersample"))
      //handleTwitterCallback(url);
     {
        System.out.println("TWEET TWEET TWEET");    
        webView.loadUrl(url);
        return true;

        }

     else

     return false;
    }
    }); 

This is the link to my Twitter java class TWITTER CONNECT CLASS And this is my manifest

<activity android:name="com.test.settings.ShareSettings" android:label="ShareSettings" android:screenOrientation="portrait" android:configChanges="orientation|keyboardHidden">       
        <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:scheme="oauth" android:host="twittersample"/>
        </intent-filter>
    </activity>

Attached is the logcat when successfully run in browser

enter image description here

Was it helpful?

Solution

I finally get it to work. I think earlier it did not work because I did not retrieve access token into the WebView.

In my WebView under onCreate i did this

myWebView = (WebView)findViewById(R.id.myWebView);
    myWebView.setWebViewClient(new WebViewClient()
    {
    @Override
    public boolean shouldOverrideUrlLoading(WebView webView, String url)
    { if (url != null && url.startsWith(TWITTER_CALLBACK_URL))

     { System.out.println("TWEET TWEET TWEET");
        retrieveAccessToken(url); //added this
        webView.setVisibility(View.GONE); //added this
        return true;            
        }

     else

     return false;

    }
    }); 

and in my retrieveAccessToken(url) i have this.

private void retrieveAccessToken(final String url)
{
    Uri uri = Uri.parse(url);
    String verifier = uri.getQueryParameter(URL_TWITTER_OAUTH_VERIFIER);

    try {
        // Get the access token
        AccessToken accessToken = twitter.getOAuthAccessToken(requestToken, verifier);

        // Shared Preferences
        Editor e = mSharedPreferences.edit();

        // After getting access token, access token secret
        // store them in application preferences
        e.putString(PREF_KEY_OAUTH_TOKEN, accessToken.getToken());
        e.putString(PREF_KEY_OAUTH_SECRET,accessToken.getTokenSecret());
        // Store login status - true
        e.putBoolean(PREF_KEY_TWITTER_LOGIN, true);
        e.commit(); // save changes

        Log.e("Twitter OAuth Token", "> " + accessToken.getToken());

        TextView twitterConnect = (TextView) findViewById(R.id.twitterConnect);
        String disconnect = "Disconnect";
        twitterConnect.setText(disconnect);                                                     

        // Getting user details from twitter
        // For now i am getting his name only
        long userID = accessToken.getUserId();
        User user = twitter.showUser(userID);
        String username = user.getName();

        txtUpdate.setVisibility(View.VISIBLE);
        btnUpdateStatus.setVisibility(View.VISIBLE);

        // Displaying in xml ui
        //twitterUser.setText(Html.fromHtml("<b>Welcome " + username + "</b>"));
        TextView twitterUser = (TextView) findViewById(R.id.twitterDesc);     
        twitterUser.setText(Html.fromHtml(username));
        Toast.makeText(getApplicationContext(), "LOGGED IN AS " + username, Toast.LENGTH_LONG).show(); 
    } catch (Exception e) {
        // Check log for login errors
        Log.e("Twitter Login Error", "> " + e.getMessage());
    }
}

I got this to work exactly how I wanted it and logged in successfully. Do correct me if I'm doing anything wrong here.

Thank you @user1690588 and @Nikolay Elenkov, for your time to help me out. :)

OTHER TIPS

Use an HTTP url like http://localhost/twittersample/oauth_callback or similar.

I was also having this problem and I realize that my callback url does not match with my filter entry in my manifest file. May be you also have same problem.

You can solve this by following steps:

set your callback url in your class as

oauth://twittersample

and in your AndroidManifest

<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:scheme="oauth" android:host="twittersample"/>
</intent-filter>

Try it..,.

Make sure your callback url

XXX://YYY 

match with

<data android:scheme="XXX" android:host="YYY"/>

EDIT..................................................................................

Try this like also..,.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top