2012-02-22 54 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