2011-08-02 12 views
6

こんにちは私はLInkedInとのOAuth通信にスクライブライブラリを使用しています。AndroidでScribeでOAuthを使用する

私はログインクラスとクエリクラスを持っています。

ログインクラスは、リクエストトークンとシークレットを取得するサービスを作成し、アクセストークンを作成します。アクセストークンは、プリファレンスファイルに保存されます。これはうまくいくと思われ、すべてのトークンが作成された後、正常なAPI呼び出しを行うことができます。

私のOAuthクエリクラスでは、アクセストークンを取得し、別のサービスを作成してAPI呼び出しを試みますが、このクラスを呼び出すアクティビティをロードすると、アプリケーションがクラッシュします。私は、アクセストークンが保存されていることを確認するためにテストしました。

は、ここに私のログインクラス

public class Login_LinkedIn extends Activity 
{ 
SharedPreferences settings; 
OAuthService service; 
Token requestToken; 

Button home; 

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

    initControls(); 

    service = new ServiceBuilder() 
    .provider(LinkedInApi.class) 
    .apiKey(getString(R.string.apiKey)) 
    .apiSecret(getString(R.string.secKey)) 
    .callback(getString(R.string.callBack)) 
    .build(); 

    requestToken = service.getRequestToken(); 
    final String authURL = service.getAuthorizationUrl(requestToken); 

    final WebView webview = (WebView) findViewById(R.id.webView); 

    //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(getString(R.string.callBack))) 
      { 
       //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 = service.getAccessToken(requestToken, v); 

       OAuthRequest request = new OAuthRequest(Verb.GET, "http://api.linkedin.com/v1/people/~:(first-name,last-name)"); 
       service.signRequest(accessToken, request); 
       Response response = request.send(); 

       xmlHandler xh = new xmlHandler(response.getBody()); 

       settings = getSharedPreferences("preferences", 0); 
       SharedPreferences.Editor editor = settings.edit(); 

       editor.putString("accessToken", accessToken.getToken()); 

       // The requestToken is saved for use later on to verify the OAuth request. 
       // See onResume() below 
       editor.putString("requestToken", requestToken.getToken()); 
       editor.putString("requestSecret", requestToken.getSecret()); 

       editor.putString("first-name", xh.getValue("first-name")); 
       editor.putString("last-name", xh.getValue("last-name")); 

       editor.commit(); 

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

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

@Override 
protected void onResume() 
{ 
    super.onResume(); 

    Intent i = getIntent(); 

    if(i != null) 
    { 
     Uri uri = i.getData(); 
     if(uri != null) 
     { 
      String oauthVerifier = uri.getQueryParameter("oauth_verifier"); 

      Verifier verifier = new Verifier(oauthVerifier); 

      requestToken = new Token(settings.getString("requestToken", null), settings.getString("requestSecret", null)); 

      Token accessToken = service.getAccessToken(requestToken, verifier); 

      // Save the access token. 
      SharedPreferences.Editor editor = settings.edit(); 
      editor.remove("requestToken"); 
      editor.remove("requestSecret"); 
      editor.putString("accessToken", accessToken.getToken()); 
      editor.putString("accessSecret", accessToken.getSecret()); 
      editor.commit(); 

      // Start the film list activity. 
      final Intent intent = new Intent(this,ProConnect.class); 
      intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      startActivity(intent); 
     } 
    } 
} 

private void initControls() 
{ 
    home = (Button)findViewById(R.id.home); 

    final Intent intent = new Intent(this,ProConnect.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

    home.setOnClickListener(new Button.OnClickListener() 
    { 
     public void onClick (View v) 
     { 
      startActivity(intent); 
     } 
    }); 


} 

} 

と私のクエリクラス ジェフ

+0

ちょっと@jeffここにlogcatの出力を貼り付けることができると思いますか? –

+0

あなたのコードを共有してくれてありがとう、これは本当にここに沿って私を助けた。 – koljaTM

+0

私は質問があります...私はほぼ同じでした - 共有の設定にaccess_tokenとaccess_secretを保存しました...しかし、私が新しい呼び出しをしようとすると、アプリがクラッシュします。 –

答えて

1

が、私はそれが最終的には愚かなものだった問題を解決した任意の助け

public class oAuthQuery extends Activity 
{ 
OAuthService service; 
Token accessToken; 
SharedPreferences settings; 

public oAuthQuery() 
{ 
    service= new ServiceBuilder() 
    .provider(LinkedInApi.class) 
    .apiKey(getString(R.string.apiKey)) 
    .apiSecret(getString(R.string.secKey)) 
    .callback(getString(R.string.callBack)) 
    .build(); 

    settings = getSharedPreferences("preferences", 0); 

    accessToken = new Token(settings.getString("accessToken", null), settings.getString("accessSecret", null)); 

} 

public String query(String s) 
{ 
    OAuthRequest request = new OAuthRequest(Verb.GET, s); 
    service.signRequest(accessToken, request); 
    Response response = request.send(); 

    return response.getBody(); 
} 

public OAuthService getService() 
{ 
    return service; 
} 

} 

おかげです。アクセスシークレットとアクセストークンを保存するために私のコードを編集しましたが、自分の携帯電話で自分のアプリケーションをテストするときに再ログインするのを忘れていました。この結果、トークンの一部を保存したコードには到達していませんでした。

私はまだ招待私はこれがコールにXML文字列を追加するための正しい方法であるかどうかわからないんだけど

invite.setOnClickListener(new Button.OnClickListener() 
     { 
      public void onClick (View v) 
      { 
       inviteXml = inviteCreator.inviteString(to, subj, body, authName, authValue); 
       nameField.setText(inviteXml); 
       titleField.setText(""); 


       call = "http://api.linkedin.com/v1/people/~/mailbox"; 
       request = new OAuthRequest(Verb.GET, call); 
       request.addPayload(inviteXml); 
       service.signRequest(accessToken, request); 
       response = request.send(); 

       invite.setVisibility(View.GONE); 
      } 
     }); 

LinkedInのAPIで呼び出しを使用して問題を持っています。 LinkedIn APIは、どのように追加するかを指定しません。誰にもこれに関する経験はありますか?

+0

私の推測では、 'Verb.POST'または' Verb.PUT'の 'Verb.GET'を変更する必要があります –

関連する問題