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 获取空答案 的相关文章

  • 找不到参数的方法 dependencyResolutionManagement()

    我正在尝试使用老师给我的一个项目 但它显示了一个错误 Settings file Users admin AndroidStudioProjects HTTPNetworking settings gradle line 1 A probl
  • 如何在 Android 中保存相机的临时照片?

    在尝试从相机拍照并将其保存到应用程序的缓存文件夹中时 我没有得到任何可见的结果 应用程序不会崩溃 但在 LogCat 上 当我尝试将 ImageView src 字段设置为刚刚获取的文件的 URI 时 我收到此消息 09 17 14 03
  • 如何快速自动发送FCM或APNS消息?

    我正在开发一项后端服务 通过 FCM 或 APNS 向移动应用程序发送推送通知 我想创建一个可以在一分钟内运行的自动化测试 并验证服务器是否可以成功发送通知 请注意 我不一定需要检查通知是否已送达 只需检查 FCM 或 APNS 是否已成功
  • android中向sqlite中插入大量数据

    目前 我必须一次向我的 Android 中插入超过 100 亿条数据 然而 内存不足的问题会使程序崩溃 sqlite 插入测试非常简单 只需使用 for 循环生成 sql 插入命令并通过 开始 和 提交 进行包装 private Array
  • 如何在android中获取Camera2 API的当前曝光

    In android hardware Camera旧的 我使用下面的代码获取当前曝光并获取它Camera Camera Parameters param mCamera getParameters currentExposure para
  • Android Activity 生命周期函数基础知识

    我正在测试这段代码 它显示活动所处的状态 public class Activity101Activity extends Activity String tag Lifecycle Called when the activity is
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 获取当前 android.intent.category.LAUNCHER 活动的实例

    我创建了一个库项目 并在多个应用程序之间共享 我实现了一个简单的会话过期功能 该功能将在一段时间后将用户踢回到登录屏幕 登录屏幕活动是我的主要活动 因此在清单中它看起来像这样
  • 如何使用 IF 检查 TextView 可见性

    我有一个 onCheckedChangeListener 来根据选择的单选按钮显示文本视图 我有 1 个疑问和 1 个难题 想知道是否有人可以帮助我 问题 您能否将单选组默认检查值设置为 否 单选按钮 以便一开始就不会检查任何内容 问题 如
  • Google 云端硬盘身份验证异常 - 需要许可吗? (v2)

    我一直在尝试将 Google Drive v2 添加到我的 Android 应用程序中 但无法获得授权 我收到 UserRecoverableAuthIOException 并显示消息 NeedPermission 我感觉 Google A
  • 我想实现下面的布局,按钮应该在屏幕底部,当惰性列被填充时,按钮不应该出去

    顶部有惰性列 惰性列下方有输入电话号码布局并从电话簿布局添加联系人 我希望当未添加联系人时此布局位于顶部 当我添加大量联系人时输入电话号码并添加电话簿布局中的联系人会随着惰性列滚动并移出屏幕 我不让他们走出屏幕 当接触较多时 它们必须粘在底
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 尝试在 ubuntu 中编译 android 内核时出错

    我正在尝试从源代码编译 Android 内核 并且我已经下载了所有正确的软件包来执行此操作 但由于某种原因我收到此错误 arm linux androideabi gcc error unrecognized command line op
  • 错误:在根项目“projectName”中找不到项目“app”

    我有一个在 Eclipse 中开发的旧应用程序 现在尝试将其迁移到 Android Studio 我更新了库并遵循了基本步骤 现在 我收到此错误 Error Project app not found in root project pro
  • Android访问远程SQL数据库

    我可以直接从 Android 程序访问远程 SQL 数据库 在网络服务器上 吗 即简单地打开包含所有必需参数的连接 然后执行 SQL 查询 这是一个私人程序 不对公众开放 仅在指定的手机上可用 因此我不担心第三方获得数据库访问权限 如果是这
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 如何根据 gradle 风格设置变量

    我想传递一个变量test我为每种风格设置了不同的值作为 NDK 的定义 但出于某种原因 他总是忽略了最后味道的价值 这是 build gradle apply plugin com android library def test andr
  • 增加活动的屏幕亮度

    显然 Android 操作系统中至少有三种不同的技术可以改变屏幕亮度 其中两个在纸杯蛋糕之后不再起作用 而第三个被接受的技术显然有一个错误 我想在单视图活动开始时增加屏幕亮度 然后在活动结束时将亮度恢复为用户设置 没有按钮 没有第二个视图或
  • 如何确定对手机号码的呼叫是本地呼叫还是 STD 或 ISD

    我正在为 Android 开发某种应用程序 但不知道如何获取被叫号码是本地或 STD 的号码的数据 即手机号码检查器等应用程序从哪里获取数据 注意 我说的是手机号码 而不是固定电话 固定电话号码 你得到的数字是字符串类型 因此 您可以获取号
  • android sdk 的位置尚未在 Windows 操作系统的首选项中设置

    在 Eclipse 上 我转到 windows gt Android SDK 和 AVD Manager 然后弹出此消息 Android sdk 的位置尚未在首选项中设置 进入首选项 在侧边栏找到 Android 然后会出现一个 SDK 位

随机推荐

  • 封装和抽象之间的区别

    我今天去面试了 我有一个问题来自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 并接受应用程序 然后浏览器返回到应用程序并尝试从