title: Using OAuth with Scribe on Android
body: <p>Hi I'm using the scribe library for OAuth communication with LInkedIn. </p>
  
  <p>I have a login class and a query class. </p>
  
  <p>The login class creates a service to get my request token and secret and creates my access token. The access token is then saved to the preferences file. This seems to work fine and I can make a successful api call after all the tokens have been created. </p>
  
  <p>In my OAuth query class i retrieve the access token, create another service and try to make an API call, but when ever I load an activity which makes calls this class it causes my app to crash. I have tested to make sure that the access token is saved and they are.</p>
  
  <p>Here is my login class</p>
  
  <pre><code>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);
          }
      });
  
  
  }
  
  }
  </code></pre>
  
  <p>and my query class</p>
  
  <pre><code>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;
  }
  
  }
  </code></pre>
  
  <p>Thanks for any help
  Jeff</p>