2012-02-22 155 views
4

是否有可能以某种方式从Android中的WebView中检索PIN码,同时授权Twitter?Twitter - 从webview中检索pin码。 Android

我有教程的例子,但登录用户需要重写从WebView到应用程序的PIN码。我只是想通过这个并直接从网上获取PIN码。

这和它在iPhone上的表现非常相似。

现在我使用的东西是这样的:

public void getTwitter() 
{ 
     handleEvent.post(new Runnable() 
     { 

     @Override 
     public void run() 
     {    
      if (oHelper.hasAccessToken()) 
      { 

       oHelper.configureOAuth(twitterConnection); 
       try 
       { 
        twitterConnection.updateStatus("Hii!!!!"); 
       } 
       catch (TwitterException e) 
       { 
        Log.d("TWEET", "Error Updating status " + e.getMessage()); 
        e.printStackTrace(); 
       } 
      } 
      else 
      { 
       try 
       { 
         twitterConnection.setOAuthConsumer(CONSUMER_KEY,CONSUMER_SECRET); 
         requestToken = twitterConnection.getOAuthRequestToken(""); 
         webViewDialog(requestToken.getAuthorizationURL(), 0); 
       } 
       catch (TwitterException e) 
       { 
        e.printStackTrace(); 
       } 
      } 
     } 

     }); 
} 

然后显示对话框弹出里面的网页流量:

private void webViewDialog(final String authorizationURL, final int type) 
{ 
     LinearLayout container = new LinearLayout(this); 
     container.setMinimumWidth(200); 
     container.setMinimumHeight(320); 
     webView = new WebView(this); 

     webView.setMinimumWidth(200); 
     webView.setMinimumHeight(380); 
     webView.getSettings().setJavaScriptEnabled(true); 
     webView.setWebViewClient(new WebViewClient()); 
     webView.loadUrl(authorizationURL); 

     container.addView(webView); 
     webDialog = new AlertDialog.Builder(this); 
     webDialog.setView(container).setPositiveButton("Ok", new DialogInterface.OnClickListener() 
     { 

     @Override 
     public void onClick(DialogInterface dialog, int which) 
     { 
      dia = dialog; 
       if (type == 0) 
       { 
        twitterPinCodeDialog(); 
       } 

     } 
     }).show(); 
} 

,并在最后提示用户输入PIN码:

public void twitterPinCodeDialog() 
{ 
     LinearLayout pinHolder = new LinearLayout(this); 
     pinHolder.setGravity(Gravity.CENTER); 
     final EditText editPinCode = new EditText(this); 
     editPinCode.setGravity(Gravity.CENTER); 
     editPinCode.setHint("Pin Code"); 
     editPinCode.setWidth(200); 
     pinHolder.addView(editPinCode); 

     Builder pinBuilder = new AlertDialog.Builder(this); 
     pinBuilder.setView(pinHolder).setTitle("Twitter Pin Code Entry") 
     .setMessage("Please enter displayed twitter code into the field") 
     .setPositiveButton("Ok", new DialogInterface.OnClickListener() 
     { 

     @Override 
     public void onClick(DialogInterface dialog, int which) 
     { 
       if (editPinCode.getText().toString() != null && !editPinCode.getText().toString().equals("")) 
       { 
        try 
        { 
         accessToken = twitterConnection.getOAuthAccessToken(requestToken,editPinCode.getText().toString()); 
         oHelper.storeAccessToken(accessToken); 
         Log.i("Access Token:", accessToken.getToken()); 
         Log.i("Access Secret:", accessToken.getTokenSecret()); 
         twitterConnection.updateStatus("Tweeted Successfully"); 
        } 
        catch (TwitterException te) 
        { 
         if (401 == te.getStatusCode()) 
         { 
          System.out.println("Unable to get the access token."); 
         } 
         else 
         { 
          te.printStackTrace(); 
         } 
        } 
       } 
       else 
       { 
       Toast.makeText(context, "Pin code is required", 
       Toast.LENGTH_SHORT).show(); 
       dialog.dismiss();  
       dia.dismiss(); 
       twitterPinCodeDialog(); 
       } 
     } 

     }).setNegativeButton("Cancel",new DialogInterface.OnClickListener() 
     { 

      @Override 
      public void onClick(DialogInterface dialog,int which) 
      { 
       Toast.makeText(context,"To share your news please complete login next time",Toast.LENGTH_LONG).show(); 
       dialog.dismiss(); 
      } 
      }).show(); 
    } 

我甚至不记得我从哪里拿这个例子。 但最好摆脱最后的对话。

回答

2

是的,它是完全可能的 - 我没有我的代码在我的面前,但是这个过程如下:

  • 当你让你的Twitter的授权请求,你为它提供一个回调URL ,让我们把它叫做回调://myapp.twitter.pin
  • 在您的清单注册一个URL处理此URL
  • 如果授权是成功的,Twitter的网页将用户重定向到您的回调URL
  • 的Android将拦截回调网址并恢复您的logi ñ活动
  • 您可以使用您的onResume从URI访问密码,因为我在我的问题表现出here
+0

谢谢,我会试试看。如果你找到一些例子,你可以跟我分享一下吗? – goodm 2012-02-22 10:18:31

1

调用web视图的活动授权如下。

final String url = provider.retrieveRequestToken(consumer, 
       "callback://x-oauthflow-twitter"); 
     Log.i(TAG, "Popping a browser with the authorize URL : " + url); 
     Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)) 
       .setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP 
         | Intent.FLAG_ACTIVITY_NO_HISTORY 
         | Intent.FLAG_FROM_BACKGROUND); 
     context.startActivity(intent); 

然后按如下方式检索活动中的访问令牌。

@Override 
public void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    SharedPreferences prefs = PreferenceManager 
      .getDefaultSharedPreferences(this); 
    final Uri uri = intent.getData(); 
    if (uri != null 
      && uri.getScheme().equals(Constants.OAUTH_CALLBACK_SCHEME)) { 
     Log.i(TAG, "Callback received : " + uri); 
     Log.i(TAG, "Retrieving Access Token"); 
     new RetrieveAccessTokenTask(this, consumer, provider, prefs) 
       .execute(uri); 
     finish(); 
    } 
} 

public class RetrieveAccessTokenTask extends AsyncTask<Uri, Void, Void> { 

    private OAuthProvider provider; 
    private OAuthConsumer consumer; 
    private SharedPreferences prefs; 

    public RetrieveAccessTokenTask(Context context, OAuthConsumer consumer, 
      OAuthProvider provider, SharedPreferences prefs) { 
     this.consumer = consumer; 
     this.provider = provider; 
     this.prefs = prefs; 
    } 

    /** 
    * Retrieve the oauth_verifier, and store the oauth and 
    * oauth_token_secret for future API calls. 
    */ 
    @Override 
    protected Void doInBackground(Uri... params) { 
     final Uri uri = params[0]; 
     final String oauth_verifier = uri 
       .getQueryParameter(OAuth.OAUTH_VERIFIER); 

     try { 
      provider.retrieveAccessToken(consumer, oauth_verifier); 

      final Editor edit = prefs.edit(); 
      edit.putString(OAuth.OAUTH_TOKEN, consumer.getToken()); 
      edit.putString(OAuth.OAUTH_TOKEN_SECRET, 
        consumer.getTokenSecret()); 
      edit.commit(); 

      String token = prefs.getString(OAuth.OAUTH_TOKEN, ""); 
      String secret = prefs.getString(OAuth.OAUTH_TOKEN_SECRET, ""); 

      consumer.setTokenWithSecret(token, secret); 
      // context.startActivity(new Intent(context, 
      // MerionActivity.class)); 

      executeAfterAccessTokenRetrieval(); 

      Log.i(TAG, "OAuth - Access Token Retrieved"); 

     } catch (Exception e) { 
      Log.e(TAG, "OAuth - Access Token Retrieval Error", e); 
     } 

     return null; 
    } 

该活动应在清单文件中声明如下。

<activity 
     android:name="com.nppa.twitter.PrepareRequestTokenActivity" 
     android:launchMode="singleTask" > 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 

      <data 
       android:host="callback" 
       android:scheme="x-oauthflow-twitter" /> 
     </intent-filter> 
    </activity> 
+0

你会请描述这个参数“x-oauthflow-twitter”什么是x什么是oauthflow和什么是代替twitter的。 – 2014-01-24 07:09:00

+0

对不起,延迟回复。只是给这个参数。它由twitter api定义。 – Thasneem 2014-05-12 10:22:25