Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WebView could not load oAuth url

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

like image 716
Honey H Avatar asked Dec 02 '12 09:12

Honey H


2 Answers

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. :)

like image 115
Honey H Avatar answered Sep 21 '22 23:09

Honey H


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

like image 20
Nikolay Elenkov Avatar answered Sep 22 '22 23:09

Nikolay Elenkov