2013-02-28 55 views
4

我很新的android,请原谅任何错误。Flickr Oauth登录使用Scribe Library

package net.schwiz.oauth; 

import org.json.JSONException; 
import org.json.JSONObject; 
import org.scribe.builder.ServiceBuilder; 
import org.scribe.builder.api.TwitterApi; 
import org.scribe.model.OAuthRequest; 
import org.scribe.model.Response; 
import org.scribe.model.Token; 
import org.scribe.model.Verb; 
import org.scribe.model.Verifier; 
import org.scribe.oauth.OAuthService; 

import android.app.Activity; 
import android.net.Uri; 
import android.os.Bundle; 
import android.view.View; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.widget.TextView; 


public class Main extends Activity { 

    final static String APIKEY = "XXXXXXXXXXXXXXXXXXXX"; 
    final static String APISECRET = "XXXXXXXXXXXXXXXXXXXX"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     final TextView textView = (TextView)findViewById(R.id.textview); 
     final WebView webview = (WebView) findViewById(R.id.webview); 

     if(APIKEY == null || APISECRET == null){ 
      textView.setText("You must enter your own APIKEY and SECRET to use this demo. dev.twitter.com"); 
      webview.setVisibility(View.GONE); 
      return; 
     } 

     //set up service and get request token as seen on scribe website 
     //https://github.com/fernandezpablo85/scribe-java/wiki/Getting-Started 
     final OAuthService s = new ServiceBuilder() 
     .provider(TwitterApi.class) 
     .apiKey(APIKEY) 
     .apiSecret(APISECRET) 
     .callback(CALLBACK) 
     .build(); 

     final Token requestToken = s.getRequestToken(); 
     final String authURL = s.getAuthorizationUrl(requestToken); 

     //attach WebViewClient to intercept the callback url 
     webview.setWebViewClient(new WebViewClient(){ 
      @Override 
      public boolean shouldOverrideUrlLoading(WebView view, String url) { 

       //check for our custom callback protocol otherwise use default behavior 
       if(url.startsWith("oauth")){ 
        //authorization complete hide webview for now. 
        webview.setVisibility(View.GONE); 

        Uri uri = Uri.parse(url); 
        String verifier = uri.getQueryParameter("oauth_verifier"); 
        Verifier v = new Verifier(verifier); 

        //save this token for practical use. 
        Token accessToken = s.getAccessToken(requestToken, v); 


        if(uri.getHost().equals("twitter")){ 
         OAuthRequest req = new OAuthRequest(Verb.GET, "URL here"); 
         s.signRequest(accessToken, req); 
         Response response = req.send(); 
         try { 
          JSONObject json = new JSONObject(response.getBody()); 
          textView.setText(json.toString(3)); 
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
        } 

        return true; 
       } 


       return super.shouldOverrideUrlLoading(view, url); 
      } 
     }); 


     //send user to authorization page 
     webview.loadUrl(authURL); 
    } 
} 

我尝试这个代码,它的做工精细与Twitter,但现在我想用Flickr的认证用户,上面的代码是不是在这种情况下工作,如果条件if(url.startsWith("oauth"))不工作我以为的方式。请帮忙。

回答

0

我已经想通了这个问题!当我调用方法webview.loadUrl(authURL);时,flickr www.flickr.com的URL会更改为m.flickr.com,在任何用户登录/身份验证之前触发事件shouldOverrideUrlLoading

if(authURL.charAt(7)=='w') 
{ 
    authURL=authURL.replaceFirst("www", "m"); 
} 

解决了我的问题。

+0

你好,我在同一个问题有问题。你可以帮忙吗? – user1891910 2013-03-04 14:17:14

+0

是的!在我的情况下的问题是!浏览器将重定向到导致访问令牌出现问题的其他地址。仔细调试你的应用程序。 – Desire 2013-03-14 19:37:21