Android 连接 Twitter - 从 Twitter 获取空答案

2024-04-11

我在连接 Twitter 时遇到 %&·$5#~€ 问题。 (代码贴在下面)

首先,我已经配置了所有内容(twitter 键、清单中的回调等),然后我调用 twitter 并打开浏览器,然后我登录 twitter 并接受应用程序,然后浏览器返回到应用程序并尝试从 Twitter 得到回复,但我得到 NULL 作为答案。

谁能帮我看看这是怎么回事?

格雷廷斯

PD:我遵循本教程:http://www.androidhive.info/2012/09/android-twitter-oauth-connect-tutorial/ http://www.androidhive.info/2012/09/android-twitter-oauth-connect-tutorial/

PD 2 :有些人认为问题出在手机的日期时间上(https://dev.twitter.com/discussions/374 https://dev.twitter.com/discussions/374),但我改变了它,但不起作用

import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.User;
import twitter4j.auth.AccessToken;
import twitter4j.auth.RequestToken;
import twitter4j.conf.Configuration;
import twitter4j.conf.ConfigurationBuilder;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.Toast;


@SuppressLint("NewApi")
public class TwitterActivity extends Activity {

    Intent TWITTER_INTENT = null;
    //TWITTER THINGS
        static String TWITTER_CONSUMER_KEY = "CONSUMER_KEY_HERE";
        static String TWITTER_CONSUMER_SECRET = "CONSUMER_SECRET_HERE";
        static final String TWITTER_CALLBACK_URL = "oauth://t4jsample";

        // Twitter oauth urls
        static final String URL_TWITTER_AUTH = "https://api.twitter.com/oauth/authorize";
        static final String URL_TWITTER_OAUTH_VERIFIER = "https://api.twitter.com/oauth/access_token";
        static final String URL_TWITTER_OAUTH_TOKEN = "https://api.twitter.com/oauth/request_token";

        // Progress dialog
        ProgressDialog pDialog;

        // Twitter
        public static Twitter twitter;
        public static String twitter_token, twitter_secret; 


        // Internet Connection detector
        private ConnectionDetector cd;

        // Alert Dialog Manager
        AlertDialogManager alert = new AlertDialogManager();



    // Preference Constants
    static String PREFERENCE_NAME = "twitter_oauth";
    static final String PREF_KEY_OAUTH_TOKEN = "oauth_token";
    static final String PREF_KEY_OAUTH_SECRET = "oauth_token_secret";
    static final String PREF_KEY_TWITTER_LOGIN = "isTwitterLogedIn";



    // Twitter

    private static RequestToken requestToken;

    // Shared Preferences
    private static SharedPreferences mSharedPreferences;



    @SuppressLint("NewApi")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_twitter);
        if (Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }
        //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        cd = new ConnectionDetector(getApplicationContext());

        // Check if Internet present
        if (!cd.isConnectingToInternet()) {
            // Internet Connection is not present
            alert.showAlertDialog(TwitterActivity.this, "Internet Connection Error","Please connect to working Internet connection", false);
            // stop executing code by return
            return;
        }

        // Check if twitter keys are set
        if(TWITTER_CONSUMER_KEY.trim().length() == 0 || TWITTER_CONSUMER_SECRET.trim().length() == 0){
            // Internet Connection is not present
            alert.showAlertDialog(TwitterActivity.this, "Twitter oAuth tokens", "Please set your twitter oauth tokens first!", false);
            // stop executing code by return
            return;
        }


        // Shared Preferences
        mSharedPreferences = getApplicationContext().getSharedPreferences("MyPref", 0);



        ImageView TW = (ImageView) findViewById(R.id.twitter_boton);
        TW.setClickable(true);
        TW.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                loginToTwitter();
            }
        });


        /** This if conditions is tested once is
         * redirected from twitter page. Parse the uri to get oAuth
         * Verifier
         * */
        if (!isTwitterLoggedInAlready()) {
            Uri uri = getIntent().getData();
            if (uri != null && uri.toString().startsWith(TWITTER_CALLBACK_URL)) {
                // oAuth verifier
                String verifier = uri.getQueryParameter(URL_TWITTER_OAUTH_VERIFIER);

                try {
                    // Get the access token
                    AccessToken accessToken = twitter.getOAuthAccessToken(
                            requestToken, verifier);

                    // Shared Preferences
                    Editor e = mSharedPreferences.edit();

                    // After getting access token, access token secret
                    // store them in application preferences
                    e.putString(PREF_KEY_OAUTH_TOKEN, accessToken.getToken());
                    e.putString(PREF_KEY_OAUTH_SECRET,
                            accessToken.getTokenSecret());
                    // Store login status - true
                    e.putBoolean(PREF_KEY_TWITTER_LOGIN, true);
                    e.commit(); // save changes

                    Log.e("Twitter OAuth Token", "> " + accessToken.getToken());



                    // Getting user details from twitter
                    // For now i am getting his name only
                    long userID = accessToken.getUserId();
                    User user = twitter.showUser(userID);
                    String username = user.getName();
                    Log.d("nombre",username);
                } catch (Exception e) {
                    // Check log for login errors
                    Log.e("Twitter Login Error", "> " + e.toString());
                    Log.e("Twitter Login Error", "> " + e.getMessage());
                }
            }
        }

    }

    /**
     * Function to login twitter
     * */
    private void loginToTwitter() {
        // Check if already logged in
        if (!isTwitterLoggedInAlready()) {
            ConfigurationBuilder builder = new ConfigurationBuilder();
            builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY);
            builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET);
            Configuration configuration = builder.build();

            TwitterFactory factory = new TwitterFactory(configuration);
            twitter = factory.getInstance();

            if(!(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)) {
                try {
                    requestToken = twitter.getOAuthRequestToken(TWITTER_CALLBACK_URL);
                    this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(requestToken.getAuthenticationURL())));
                } catch (TwitterException e) {
                    e.printStackTrace();
                }
            }
            else
            {
                new Thread(new Runnable() {
                    public void run() {
                        try {   
                            requestToken = twitter.getOAuthRequestToken(TWITTER_CALLBACK_URL);
                            TwitterActivity.this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(requestToken.getAuthenticationURL())));
                        } catch (TwitterException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
            }
        } else {
            // user already logged into twitter
            Toast.makeText(getApplicationContext(),
                    "Already Logged into twitter", Toast.LENGTH_LONG).show();
        }
    }

    /**
     * Function to update status
     * */
    class updateTwitterStatus extends AsyncTask<String, String, String> {

        /**
         * Before starting background thread Show Progress Dialog
         * */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(TwitterActivity.this);
            pDialog.setMessage("Updating to twitter...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        /**
         * getting Places JSON
         * */
        protected String doInBackground(String... args) {
            Log.d("Tweet Text", "> " + args[0]);
            String status = args[0];
            try {
                ConfigurationBuilder builder = new ConfigurationBuilder();
                builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY);
                builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET);

                // Access Token
                String access_token = mSharedPreferences.getString(PREF_KEY_OAUTH_TOKEN, "");
                // Access Token Secret
                String access_token_secret = mSharedPreferences.getString(PREF_KEY_OAUTH_SECRET, "");

                AccessToken accessToken = new AccessToken(access_token, access_token_secret);
                Twitter twitter = new TwitterFactory(builder.build()).getInstance(accessToken);

                // Update status
                twitter4j.Status response = twitter.updateStatus(status);

                Log.d("Status", "> " + response.getText());
            } catch (TwitterException e) {
                // Error in updating status
                Log.d("Twitter Update Error", e.getMessage());
            }
            return null;
        }

        /**
         * After completing background task Dismiss the progress dialog and show
         * the data in UI Always use runOnUiThread(new Runnable()) to update UI
         * from background thread, otherwise you will get error
         * **/
        protected void onPostExecute(String file_url) {
            // dismiss the dialog after getting all products
            pDialog.dismiss();
            // updating UI from Background Thread
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getApplicationContext(),
                            "Status tweeted successfully", Toast.LENGTH_SHORT)
                            .show();
                    // Clearing EditText field

                }
            });
        }

    }



    /**
     * Check user already logged in your application using twitter Login flag is
     * fetched from Shared Preferences
     * */
    private boolean isTwitterLoggedInAlready() {
        // return twitter login status from Shared Preferences
        return mSharedPreferences.getBoolean(PREF_KEY_TWITTER_LOGIN, false);
    }

    protected void onResume() {
        super.onResume();
    }

}

在花了几个小时阅读文档之后(我现在没有眼睛),当我尝试获取 access_token 时,我称之为:

// Get the access token
AccessToken accessToken = twitter.getOAuthAccessToken(requestToken, verifier);

我通过了验证器(这是 pin pass,但 pin pass 不再使用)并且他为空,因为不再使用 twitter,然后我只需要用这个重写:

// Get the access token
AccessToken accessToken = twitter.getOAuthAccessToken(requestToken);

只需要 requestToken 即可获取 access_token。

我希望这可以帮助任何有同样问题的人。

问候。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 连接 Twitter - 从 Twitter 获取空答案 的相关文章

  • 如何在 Android 中以编程方式配置启动器活动?

    我正在开发一个具有两项活动的应用程序 LoginActivity and MainActivity 当用户首次打开应用程序时 他将登录并且他的凭据 用户名和令牌 保存在Preferences 现在 如果用户再次打开应用程序MainActiv
  • 关于android Sqlite在多进程情况下的安全性

    在我的应用程序中 存在多个进程 并且在每个进程中 我需要访问同一个SQLite数据库 当然 这意味着超过2个线程 所以我不仅担心SQLite的线程安全性 还担心SQLite的线程安全性 还有过程安全 这种情况的一种解决方案是使用内容提供者
  • Android Material主题alpha颜色问题

    我已经创建了一个构建版本为 5 0 的应用程序 我在下面编写了主题
  • Android 中的 XmlPullParser 陷入困境

    经过多个小时的搜索和调试后 我仍然停留在同一个地方 并且 Eclipse 没有帮助我 我试图解析这个 RSS 提要 http fr espnf1 com rss motorsport story feeds 0 xml type 2 这很简
  • 尝试使用掩码裁剪位图会抛出 IllegalArgumentException:

    我正在使用以下代码 public void cropSelection Bitmap bitmap annotationBitmap copy annotationBitmap getConfig true Canvas canvas ne
  • 在 doInBackground 方法中启动活动

    在下面的代码中 我从互联网下载 json 并希望显示在列表中 如果列表为空 则转到另一个活动 但其他活动未启动 没有错误 但没有启动活动 感谢您的帮助 package ir mohammadi android nightly import
  • Android 可检查子菜单选项

    所以我有一个用于选项菜单项的子菜单 我想要一个可检查条目的列表 用户可以根据需要选择 取消选择多个条目 我无法解决的唯一问题是如何防止单击其中一个复选框时关闭选项菜单 我看到 PerformShortcut 有一个 FLAG PERFORM
  • 如何在android中的应用程序小部件中找到哪个按钮被点击?

    我想设计一个简单的应用程序小部件 它有两个文本视图和两个用于上一个 下一个的按钮 我很难处理应用程序小部件中的按钮单击 实际上我的愿望是 如果用户单击上一个按钮 我想显示以前的值 如果用户单击下一个按钮 我想显示数据库中的下一个值 如何知道
  • Android 视图上的动态气泡

    任何人都可以如何在Android布局上制作可点击的动态气泡 我的设计师对屏幕的想法如下 我的图像中所有气泡都是分配给用户的一组任务 气泡的标签根据任务而变化 1 1 根据我的项目要求 颜色和半径将根据 api 响应而变化 您能建议任何演示或
  • GCM(Google 云消息传递)是否需要 Google 帐户?

    我需要编写一个简单的应用程序来获取推送通知 我使用 GCM 它使用 Google Play 服务来获取信息 我的问题是 要访问 GCM 是否需要 Google 帐户 我可以使用其他电子邮件帐户来识别设备吗 有没有其他方法可以获取另一个电子邮
  • 为什么设置 MediaRecorder 时显示错误 IllegalStateException?

    我的代码设置 MediaRecorder 它显示行集质量错误 mMediaRecorder new MediaRecorder Step 1 Unlock and set camera to MediaRecorder mCamera st
  • Android - 具有可序列化对象的 SharedPreferences

    我知道 SharedPreferences 有putString putFloat putLong putInt and putBoolean 但我需要存储一个类型的对象Serializable in SharedPreferences 我
  • Android 如何从我的应用程序使用 SD 卡中的文件路径预览图像

    文件存在于sdcard image jpg我想创建我自己的应用程序 活动 按下按钮时 需要使用内置图像查看器显示存储在 SD 卡中的图像 按图像查看器中的后退按钮后 它应该返回到我正在运行的应用程序 需要一些帮助 您可以为此创建一个具有适当
  • 未调用内容提供商 query() (Android TV)

    据报道 我正在尝试将我的应用程序纳入 Android TV 全局搜索中文档 http developer android com training tv discovery searchable html我必须创建以下内容 内容提供商 可搜
  • Android 简单 TextView 动画

    我有一个 TextView 我想倒计时 3 2 1 发生了事情 为了使其更有趣 我希望每个数字都以完全不透明开始 然后淡出至透明 有没有一种简单的方法可以做到这一点 尝试这样的事情 private void countDown final
  • 我可以在导航组件中使用多个 NavHostFragment 吗?

    如果您难以理解以下段落 请查看我制作的流程图 我目前正在制作一个带有 3 个顶级目的地的笔记应用程序 顶级目标之一 NotesList 显示用户创建的注释列表 NotesList 有一个过滤器按钮 可显示带有 FilterMenu 目标的底
  • 日志记录在 Android 设备上实际上有什么作用?

    我一直在 Android 示例中看到这样的代码 try catch Exception e Log e Error e getMessage 什么是Log e实际上在物理设备上做什么 它进入系统日志 开发人员可以通过 SDK 工具访问该日志
  • Android - 保持用户登录状态

    我正在尝试使用 PHP 和 MySQLi for Android 进行登录 我不明白的是如何保持用户登录状态 我看到一个简单的教程 其中有人使用 SQLite 来保护信息 但我不知道这是否真的安全 如何保存用户信息以保持用户登录状态 谢谢
  • Activity 上的 OnTouchListener 从不调用

    我使用了这段代码 但是当我在运行时单击活动时 它永远不会在 OnTouch 方法中命中 有人可以指导我我做错了什么吗 我需要设置此活动的内容视图吗 实际上我想要用户在执行过程中触摸的活动的坐标 public class TouchTestA
  • 更改 Android 中突出显示文本的颜色

    我不确定这是否可能 也许有人可以纠正我 我在 Android 应用程序中有一个 EditText 视图 该视图在蓝色背景上有白色文本 当选择文本时 通过长按和编辑对话框 我希望突出显示为白色并将文本颜色更改为黑色 令人烦恼的是 似乎没有办法

随机推荐

  • 封装和抽象之间的区别

    我今天去面试了 我有一个问题来自OOP 关于之间的区别封装 抽象 我据我所知回答说封装基本上将数据成员和成员函数绑定到一个称为Class 然而抽象基本上是为了隐藏实现的复杂性并为用户提供方便的访问 我以为她会同意我的回答 但她质疑 如果两者
  • 不包含“GetAwaiter”的定义

    我在下面的代码集中收到以下错误 它在 alliancelookup 行上出错 我不确定我做错了什么 但我自己看不到任何东西 我运行到 crest 的查询似乎运行良好 但我遇到的问题似乎与等待者有关 我想知道是否有解决方法 DynamicCr
  • AudioUnitInitialize 返回 -10851 (kAudioUnitErr_InvalidPropertyValue)

    假设代码是 status AudioUnitSetProperty unit kAudioUnitProperty StreamFormat kAudioUnitScope Input element format sizeof Audio
  • JavaScript 相当于 printf/String.Format

    我正在寻找一个与 C PHP 相当的 JavaScriptprintf 或者对于 C Java 程序员来说 String Format IFormatProvider对于 NET 我的基本要求是目前数字的千位分隔符格式 但处理大量组合 包括
  • 允许多个角色成员资格的自定义 MVC AuthorizeAttribute

    我创建了一个自定义 AuthorizeAttribute 类来处理我的 MVC4 应用程序中的精细授权 这是班级 AttributeUsage AttributeTargets Method AllowMultiple true publi
  • 事件必须是委托类型吗?

    不太熟悉声明和使用事件并收到错误 事件必须是委托类型 基本上想通过IMyInterface作为对另一个类的依赖 该类可以订阅接收MyClassEvent事件和事件数据是MyClass public interface IMyInterfac
  • 删除 RecyclerView 项目

    我有一个 RecyclerView 它在每个特定时期添加项目 添加对象时 如果列表项超过 比方说 500 则第一个项目将被删除 新项目将被添加 如果RecyclerView无法再向下滚动 recyclerView canScrollVert
  • 如何从类似于 Angular 中的 http 的静态数据创建一个 Observable?

    我有一个具有此方法的服务 export class TestModelService public testModel TestModel constructor Inject Http public http Http public fe
  • 忽略已经提交到 Git 存储库的文件 [重复]

    这个问题在这里已经有答案了 我有一个已经初始化的 Git 存储库 我添加了一个 gitignore文件到 如何刷新文件索引以便忽略我想要忽略的文件 取消跟踪single已添加 初始化到您的存储库的文件 i e 停止跟踪该文件 但不将其从系统
  • python 可以有不以“self”作为第一个参数的类或实例方法吗? [复制]

    这个问题在这里已经有答案了 我见过的每一个例子method in a class在Python中 有self作为第一个参数 所有方法都是如此吗 如果是这样 难道Python不能被编写成让这个论点被理解并且因此不需要吗 如果你想要一个不需要访
  • Google Charts:折线图和柱形图之间的切换

    我有一个仪表板 其中包含一些 Google Analytics 指标 我想在每日 每月和每周图表上绘制这些指标 日线图为折线图 其他为柱形图 我能够将图表最初绘制为折线图或条形图 然后将其重新绘制为不同类型 但之后它不会再次重新绘制 这是我
  • 如何构建 systemd 可以直接作为服务执行的 Spring Boot jarfile?

    如何构建一个 Spring Boot jarfilesystemd https freedesktop org wiki Software systemd 可以直接作为服务执行吗 按照中的示例作为 systemd 服务安装 http doc
  • Hadoop:间隔和 JOIN

    我很新Hadoop我目前正在尝试加入两个数据源 其中关键是interval 说 开始日期 结束日期 例如 input1 20091001 20091002 A 20091011 20091104 B 20080111 20091103 C
  • 为什么断言定义为(void)0?

    Why define assert expression void 0 而不是 define assert expression 是在release模式下使用的吗 严格来说 当定义NDEBUG时 我听说有一些原因 但我忘了 void 0 定
  • 使用 Jackson 反序列化 JSON 时的隐式默认值

    当反序列化各种JSON消息时 我想为某种类型的属性提供默认值 这是一般建议 https stackoverflow com a 18806773 147806简单地指定类中的值 但如果必须在多个类中执行此操作 则很容易出错 你可能会忘记一个
  • 如何使用 Keycloak 和 Angular 避免“等待第 3 方检查 iframe 消息时超时”

    我正在尝试使用 Keycloak 服务器保护 Angular 应用程序的安全 我遵循了一些教程 它们或多或少提供了相同的说明 但我遇到了以下错误 等待第 3 方检查 iframe 消息时超时 我使用以下 docker compose 配置启
  • MFC中如何将BYTE数组转换为CString?

    如何在 MFC 中将 BYTE 数组转换为 CString 试试这个 例如 如果 x 是你的字节数组 那么 BYTE x 5 x 0 A x 1 0 x 2 B x 3 C x 4 0 CString str LPCSTR x sizeof
  • 如何使用 ASP.NET 身份在 Web API 2 中实现两因素身份验证?

    我看过这个链接使用谷歌身份验证器的两因素身份验证 http bitoftech net 2014 10 15 two factor authentication asp net web api angularjs google authen
  • 我们如何在phantomjs中使用evaluateAsync

    有什么用evaluateAsync以及什么时候我们必须使用这个功能以及使用这个功能有什么好处 在下面我们看到一个可怜的文档 http phantomjs org api webpage method evaluate async html为
  • Android 连接 Twitter - 从 Twitter 获取空答案

    我在连接 Twitter 时遇到 5 问题 代码贴在下面 首先 我已经配置了所有内容 twitter 键 清单中的回调等 然后我调用 twitter 并打开浏览器 然后我登录 twitter 并接受应用程序 然后浏览器返回到应用程序并尝试从