Twitter - 从Webview中获取PIN码。Android

4

在Android的WebView中授权Twitter时,是否有可能从WebView中检索到PIN码?

我已经有了教程示例,但是用户需要将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();
                 }
            }
       }

      });
}

然后在对话框弹出窗口中显示 Webview:
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个回答

2
是的,这是完全可能的 - 我没有我的代码在手边,但是以下过程如下:
当您进行Twitter授权请求时,提供回调URL,让我们称其为callback://myapp.twitter.pin。
在您的清单中注册此URL的URL处理程序。
当授权成功时,Twitter网页将重定向用户到您的回调URL。
Android将拦截回调URL并恢复您的登录活动。
您可以使用onResume从uri中访问PIN,如我在这里展示的那样。

谢谢,我会尝试的。如果你找到了一些例子,能和我分享一下吗? - goodm

1
请按以下方式调用Webview活动以进行授权。
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>

请描述一下参数"x-oauthflow-twitter",x是什么,oauthflow又是什么,以及在twitter的位置应该写什么。 - Akanksha Rathore
抱歉回复晚了。只需将此参数保持不变即可。Twitter API定义了它的格式。 - Thasneem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接