Twitter - получить пин-код из веб-просмотра.Android - PullRequest
4 голосов
/ 22 февраля 2012

Можно ли каким-то образом получить пин-код из WebView в Android при авторизации в Twitter?

У меня есть учебный пример, но для входа в систему пользователь должен переписать пин-код из WebView в приложение. Я просто хочу передать это и получить пин-код прямо из Интернета.

Это очень похоже на то, как это происходит на 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();
}

и в конце подсказывает пользователю ввести пин-код:

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 голосов
/ 22 февраля 2012

Да, это вполне возможно - у меня нет своего кода передо мной, но процесс выглядит следующим образом:

  • Когда вы делаете запрос на авторизацию в Твиттере, вы предоставляете емуURL обратного вызова, давайте назовем его callback: //myapp.twitter.pin
  • Зарегистрируйте обработчик URL в вашем манифесте для этого URL
  • Когда авторизация будет успешной, веб-страница Twitter перенаправит пользователяна ваш URL обратного вызова
  • Android перехватит URL обратного вызова и возобновит вашу регистрационную активность
  • Вы можете использовать свой onResume для доступа к PIN-коду из URI, как я продемонстрировал в своем вопросе здесь
1 голос
/ 13 сентября 2012

Вызовите действие веб-просмотра для авторизации следующим образом.

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...