Java 在Android上使用OAuth和Scribe

Java 在Android上使用OAuth和Scribe,java,android,oauth,linkedin,scribe,Java,Android,Oauth,Linkedin,Scribe,嗨,我正在使用scribe库与LInkedIn进行OAuth通信 我有一个登录类和一个查询类 login类创建一个服务来获取我的请求令牌和密码,并创建我的访问令牌。然后将访问令牌保存到首选项文件中。这似乎工作得很好,我可以在创建了所有令牌之后成功地进行api调用 在我的OAuth查询类中,我检索访问令牌,创建另一个服务并尝试进行API调用,但当我加载一个调用该类的活动时,它会导致我的应用程序崩溃。我已经进行了测试,以确保访问令牌已保存,并且它们已保存 这是我的登录类 public class L

嗨,我正在使用scribe库与LInkedIn进行OAuth通信

我有一个登录类和一个查询类

login类创建一个服务来获取我的请求令牌和密码,并创建我的访问令牌。然后将访问令牌保存到首选项文件中。这似乎工作得很好,我可以在创建了所有令牌之后成功地进行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);
        }
    });


}

}
还有我的查询类

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;
}

}
谢谢你的帮助
杰夫

我解决了这个问题,但最终还是有些愚蠢。我编辑了代码以保存访问密码和访问令牌,但在手机上测试应用程序时忘记重新登录。这导致无法访问保存令牌部分的代码

在LinkedIn API中使用invite调用仍然存在问题

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);
            }
        });

我不确定这是否是将XML字符串添加到调用中的正确方法。LinkedIn API没有指定如何添加它。有人对此有经验吗?

Hey@jeff认为你可以将logcat输出粘贴到这里吗?谢谢分享你的代码,这对我很有帮助。我有个问题。。。我对共享首选项执行了几乎相同的存储访问令牌和访问密钥。。。但当我尝试打新电话时,应用程序崩溃了。。。你知道吗?这是OOB认证吗?我猜你需要更改
动词。GET
for
动词。POST
动词。PUT