2012-06-20 64 views
1

我打算将雅虎集成到我的Android应用程序中以获取用户的姓名和个人详细信息。我如何将雅虎与android整合?雅虎Android中的集成

我花了几个小时寻找一个教程/示例Android应用程序,它集成了使用OAuth的Yahoo登录,但是我找不到一个。

+0

@ColinPickard它给我一个错误:'认证错误:无法对任何的应对这些挑战:{的OAuth = WWW验证:OAuth的oauth_problem = timestamp_refused&oauth_acceptable_timestamps = 1340194003-1340195203}' –

回答

2

请看下面的代码,你需要路标库 Signpost Library

import oauth.signpost.OAuth; 
import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer; 
import oauth.signpost.commonshttp.CommonsHttpOAuthProvider; 
import oauth.signpost.exception.OAuthCommunicationException; 
import oauth.signpost.exception.OAuthExpectationFailedException; 
import oauth.signpost.exception.OAuthMessageSignerException; 
import oauth.signpost.exception.OAuthNotAuthorizedException; 
import oauth.signpost.signature.HmacSha1MessageSigner; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.entity.StringEntity; 
import org.apache.http.impl.client.DefaultHttpClient; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.net.Uri; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.Toast; 
import com.synapse.selfervices.R; 

public class YahooScreen extends Activity { 
    private static final String REQUEST_TOKEN_ENDPOINT_URL ="https://api.login.yahoo.com/oauth/v2/get_request_token"; 
    private static final String ACCESS_TOKEN_ENDPOINT_URL ="https://api.login.yahoo.com/oauth/v2/get_access_token"; 
    private static final String AUTHORIZE_WEBSITE_URL ="https://api.login.yahoo.com/oauth/v2/request_auth"; 
    private static final int PIN_DIALOG = 0; 
String CALLBACK_URL = OAuth.OUT_OF_BAND; // this should be the same as the 
// SCHEME and HOST values in 
// your AndroidManifest.xml file 
    String CONSUMER_KEY = "";// 
    String CONSUMER_SECRET = ""; 
    private CommonsHttpOAuthConsumer myConsumer; 
    private CommonsHttpOAuthProvider myProvider; 
    private String requestToken; 
    private String accessToken; 

    /** Called when the activity is first created. */ 
@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     callOAuth(); 
     showDialog(PIN_DIALOG); 
     // createPinDialog().show(); 
} 

private void callOAuth() { 
     try { 
       // retrieve the consumer token and then sign it 
       myConsumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, 
           CONSUMER_SECRET); 

       myConsumer.setMessageSigner(new HmacSha1MessageSigner()); 

       HttpClient client = new DefaultHttpClient(); 
       // retrieve the provider by using the signed consumer token 
       myProvider = new CommonsHttpOAuthProvider(
           REQUEST_TOKEN_ENDPOINT_URL, ACCESS_TOKEN_ENDPOINT_URL, 
           AUTHORIZE_WEBSITE_URL, client); 
       myProvider.setOAuth10a(true); 
       String aUrl = myProvider.retrieveRequestToken(myConsumer, 
           CALLBACK_URL); 

       requestToken = myConsumer.getToken(); 
       startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(aUrl))); 
     } catch (Exception ex) { 
       Toast.makeText(getApplicationContext(), ex.getMessage(), 
           Toast.LENGTH_LONG).show(); 
       Log.e(ex.getMessage(), ex.toString()); 
     } 
} 

// this is the callback function that will run when oauth authenticates 
// successfully 
@Override 
protected void onNewIntent(Intent intent) { 
     System.out.println("OnNewIntent..."); 
     Toast.makeText(getApplicationContext(), "OnNewIntent - It works!", 
         Toast.LENGTH_LONG).show(); 
     // whatever you want to do after authenticating goes here .... 
} 

AlertDialog createPinDialog() { 
     LayoutInflater factory = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 

     // LayoutInflater factory = LayoutInflater.from(this); 
     final View textEntryView = factory.inflate(R.layout.pin, null); 
     final EditText pinText = (EditText) textEntryView 
         .findViewById(R.id.pin_text); 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setTitle("Twitter OAuth PIN"); 
     builder.setView(textEntryView); 
     builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton) { 
         if (pinText != null) 
           gotOAuthPin(pinText.getText().toString()); 
         onResume(); 
       } 
     }); 
     return builder.create(); 
} 

private void gotOAuthPin(String pin) { 
     SharedPreferences.Editor editor = getSharedPreferences("yahoo", 
         MODE_PRIVATE).edit(); 
     try { 
       myProvider.retrieveAccessToken(myConsumer, pin); 
       accessToken = myConsumer.getToken(); 

     } catch (OAuthMessageSignerException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
     } catch (OAuthNotAuthorizedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
     } catch (OAuthExpectationFailedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
     } catch (OAuthCommunicationException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
     } 
     if (accessToken != null && accessToken.length() > 0) { 
       Toast.makeText(this, "Authorized", Toast.LENGTH_SHORT).show(); 
       HttpPost request = new HttpPost(
           "http://social.yahooapis.com/v1/user/profile?format=json"); 
       StringEntity body = null; 
       /* 
       * try { body = new StringEntity("city=hamburg&label=" + 
       * URLEncoder.encode("Send via Signpost!", "UTF-8")); } catch 
       * (UnsupportedEncodingException e1) { // TODO Auto-generated catch 
       * block e1.printStackTrace(); } 
       * body.setContentType("application/x-www-form-urlencoded"); 
       * request.setEntity(body); 
       */ 

       try { 
         myConsumer.sign(request); 
       } catch (OAuthMessageSignerException e1) { 
         // TODO Auto-generated catch block 
         e1.printStackTrace(); 
    } catch (OAuthMessageSignerException e1) { 
         // TODO Auto-generated catch block 
         e1.printStackTrace(); 
       } catch (OAuthExpectationFailedException e1) { 
         // TODO Auto-generated catch block 
         e1.printStackTrace(); 
       } catch (OAuthCommunicationException e1) { 
         // TODO Auto-generated catch block 
         e1.printStackTrace(); 
       } 

       System.out.println("Sending update request to Fire Eagle..."); 

       HttpClient httpClient = new DefaultHttpClient(); 
       HttpResponse response = null; 
       try { 
         response = httpClient.execute(request); 
       } catch (ClientProtocolException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
       } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
       } 

       Toast.makeText(
           this, 
           "Response: " + response.getStatusLine().getStatusCode() 
               + " " + response.getStatusLine().getReasonPhrase(), 
           Toast.LENGTH_SHORT).show(); 
     } else { 
       Toast.makeText(this, "Not Authorized", Toast.LENGTH_SHORT).show(); 
     } 
} 

@Override 
protected Dialog onCreateDialog(int id) { 
     switch (id) { 
     case PIN_DIALOG: 
       LayoutInflater factory = LayoutInflater.from(this); 
       final View textEntryView = factory.inflate(R.layout.pin, null); 
       final EditText pinText = (EditText) textEntryView 
           .findViewById(R.id.pin_text); 
       AlertDialog.Builder builder = new AlertDialog.Builder(this); 
       builder.setTitle("OAuth PIN"); 
       builder.setView(textEntryView); 
       builder.setPositiveButton("OK", 
           new DialogInterface.OnClickListener() { 
             public void onClick(DialogInterface dialog, 
                 int whichButton) { 
               if (pinText != null) 
                 gotOAuthPin(pinText.getText().toString()); 
             } 
           }); 
       return builder.create(); 
     } 

     return super.onCreateDialog(id); 
}} 
+0

你能提供布局xml吗?请。 –

+1

我收到此错误:'验证错误:无法应对以下任何挑战:{oauth = WWW-Authenticate:OAuth oauth_problem = timestamp_refused&oauth_acceptable_timestamps = 1340197551-1340198751}' –

+0

检查设备的日期和时间设置测试。 – prageeth