0

重複の可能性:
Twitter での Android の共有コメント

Twitter api を介して Android の Twitter でステータスを共有する方法は?以下のコードのエラーが何かわかりません。

以下のようなエラーが出ました。

10-12 16:10:42.966: E/AndroidRuntime(1019): java.lang.NullPointerException
10-12 16:10:42.966: E/AndroidRuntime(1019):     at com.example.news.TwitterUtils.isAuthenticated(TwitterUtils.java:21)
10-12 16:10:42.966: E/AndroidRuntime(1019):     at com.example.news.second$1.onClick(second.java:45)
10-12 16:10:42.966: E/AndroidRuntime(1019):     at android.view.View.performClick(View.java:2485)
10-12 16:10:42.966: E/AndroidRuntime(1019):     at android.view.View$PerformClick.run(View.java:9080)
10-12 16:10:42.966: E/AndroidRuntime(1019):     at android.os.Handler.handleCallback(Handler.java:587)
10-12 16:10:42.966: E/AndroidRuntime(1019):     at android.os.Handler.dispatchMessage(Handler.java:92)
10-12 16:10:42.966: E/AndroidRuntime(1019):     at android.os.Looper.loop(Looper.java:123)
10-12 16:10:42.966: E/AndroidRuntime(1019):     at android.app.ActivityThread.main(ActivityThread.java:3683)
10-12 16:10:42.966: E/AndroidRuntime(1019):     at java.lang.reflect.Method.invokeNative(Native Method)
10-12 16:10:42.966: E/AndroidRuntime(1019):     at java.lang.reflect.Method.invoke(Method.java:507)
10-12 16:10:42.966: E/AndroidRuntime(1019):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
10-12 16:10:42.966: E/AndroidRuntime(1019):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
10-12 16:10:42.966: E/AndroidRuntime(1019):     at dalvik.system.NativeStart.main(Native Method)

私のコードは次のとおりです:---

public class second extends Activity {

    TextView txt_title, txt_desc, txt_link, txt_comment, txt_date;
    String title, desc, link, comment, date;
    Button btn_twit;
    private SharedPreferences prefs;
    private final Handler mTwitterHandler = new Handler();

            txt_title = (TextView) findViewById(R.id.txt_title);
        txt_desc = (TextView) findViewById(R.id.txt_desc);
        txt_link = (TextView) findViewById(R.id.txt_link_second);
        txt_comment = (TextView) findViewById(R.id.txt_comments_second);
        txt_date = (TextView) findViewById(R.id.txt_pubdate_second);
        btn_twit = (Button) findViewById(R.id.btn_twit);
        btn_twit.setOnClickListener(this);
        btn_twit.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                if (TwitterUtils.isAuthenticated(prefs)) {
                    Thread t = new Thread() {
                        public void run() {
                            try {
                                String path = null;
                                TwitterUtils.sendTweet(prefs, desc, path);
                                Runnable mUpdateTwitterNotification = null;
                                mTwitterHandler
                                        .post(mUpdateTwitterNotification);
                            } catch (Exception e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                            super.run();
                        }
                    };
                    t.start();
                } else {
                    Intent i = new Intent(getApplicationContext(),
                            PrepareRequestTokenActivity.class);
                    i.putExtra("tweet_msg", desc);
                    startActivity(i);
                }
            }
        });

        Bundle mbunle = getIntent().getExtras();
        title = mbunle.getString("title");
        txt_title.setText(title);

        desc = mbunle.getString("desc");
        txt_desc.setText(desc);

        link = mbunle.getString("link");
        System.out.println("Link is:----" + link);
        txt_link.setText(link);
        MatchFilter matchFilter = new MatchFilter() {
            public final boolean acceptMatch(CharSequence s, int start, int end) {
                // you can compare match over here
                // return s.toString().equals("@Bharat");
                return true;
            }
        };
        TransformFilter transformFilter = new TransformFilter() {
            public final String transformUrl(final Matcher match, String url) {
                return "";
                // www.android-geek.blogspot.com/2011/04/linkify-text-in-android.html
            }
        };

        Pattern pattern = Pattern.compile(link);
        // String scheme = "http://";
        Linkify.addLinks(txt_link, pattern, link, matchFilter, transformFilter);
        txt_link.setOnClickListener(new OnClickListener() {

            public void onClick(View arg0) {
                Intent in = new Intent(second.this, web.class);
                in.putExtra("link", link);
                startActivity(in);
            }
        });

        comment = mbunle.getString("comment");
        txt_comment.setText(comment);

        date = mbunle.getString("date");
        txt_date.setText(date);

    }
}

PrepareRequestTokenActivity クラス:

public class PrepareRequestTokenActivity extends Activity{

    final String TAG = getClass().getName();

    private OAuthConsumer consumer; 
    private OAuthProvider provider;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try {
            this.consumer = new CommonsHttpOAuthConsumer(constant.CONSUMER_KEY, constant.CONSUMER_SECRET);
            this.provider = new CommonsHttpOAuthProvider(constant.REQUEST_URL,constant.ACCESS_URL,constant.AUTHORIZE_URL);
        } catch (Exception e) {
            Log.e(TAG, "Error creating consumer / provider",e);
        }

        Log.i(TAG, "Starting task to retrieve request token.");
        new OAuthRequestTokenTask(this,consumer,provider).execute();
    }

    /**
     * Called when the OAuthRequestTokenTask finishes (user has authorized the request token).
     * The callback URL will be intercepted here.
     */
    @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(constant.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 Context context;
        private OAuthProvider provider;
        private OAuthConsumer consumer;
        private SharedPreferences prefs;

        public RetrieveAccessTokenTask(Context context, OAuthConsumer consumer,OAuthProvider provider, SharedPreferences prefs) {
            this.context = context;
            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,second.class));

                executeAfterAccessTokenRetrieval();

                Log.i(TAG, "OAuth - Access Token Retrieved");

            } catch (Exception e) {
                Log.e(TAG, "OAuth - Access Token Retrieval Error", e);
            }

            return null;
        }


        private void executeAfterAccessTokenRetrieval() {
            String msg = getIntent().getExtras().getString("tweet_msg");
            try {
                String path = null;
                TwitterUtils.sendTweet(prefs, msg, path);
            } catch (Exception e) {
                Log.e(TAG, "OAuth - Error sending to Twitter", e);
            }
        }
    }   



}

TwitterUtils クラス:

public class TwitterUtils {
    public static boolean isAuthenticated(SharedPreferences prefs) {

        String token = prefs.getString(OAuth.OAUTH_TOKEN, "");
        String secret = prefs.getString(OAuth.OAUTH_TOKEN_SECRET, "");

        AccessToken a = new AccessToken(token, secret);
        Twitter twitter = new TwitterFactory().getInstance();
        twitter.setOAuthConsumer(constant.CONSUMER_KEY,
                constant.CONSUMER_SECRET);
        twitter.setOAuthAccessToken(a);

        try {
            twitter.getAccountSettings();
            return true;
        } catch (TwitterException e) {
            return false;
        }
    }

    @SuppressWarnings("deprecation")
    public static void sendTweet(SharedPreferences prefs, String msg,
            String path) throws Exception {
        String token = prefs.getString(OAuth.OAUTH_TOKEN, "");
        String secret = prefs.getString(OAuth.OAUTH_TOKEN_SECRET, "");

        AccessToken a = new AccessToken(token, secret);
        Twitter twitter = new TwitterFactory().getInstance();
        twitter.setOAuthConsumer(constant.CONSUMER_KEY,
                constant.CONSUMER_SECRET);
        twitter.setOAuthAccessToken(a);

        Properties props = new Properties();
        props.put(PropertyConfiguration.OAUTH_ACCESS_TOKEN, token);
        props.put(PropertyConfiguration.OAUTH_ACCESS_TOKEN_SECRET, secret);
        props.put(PropertyConfiguration.OAUTH_CONSUMER_KEY,
                constant.CONSUMER_KEY);
        props.put(PropertyConfiguration.OAUTH_CONSUMER_SECRET,
                constant.CONSUMER_SECRET);
        Configuration conf = new PropertyConfiguration(props);
        OAuthAuthorization oauth = new OAuthAuthorization(conf);

        try {
            ImageUpload upload = ImageUpload.getTwitpicUploader(
                    "68057368936da4a4d083935a7e309d03", oauth);
            // File f = new File(Environment.getExternalStorageDirectory()
            // + "/sbcards_tmp/1348291353413.png");
            File f = new File(path);

            if (f.exists()) {
                String res = upload.upload(f);
                twitter.updateStatus(res);
            } else {
                // Debug.
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

定数クラス:

public class constant {

    public static final String CONSUMER_KEY = "CNHQcuaUX6sNZnbwEI1uZQ";
    public static final String CONSUMER_SECRET= "SUu7F84kyYaMJ39i9E9x0mcMNSp2cPbkA91SRtP9J0";

    public static final String REQUEST_URL = "  https://api.twitter.com/oauth/request_token";
    public static final String ACCESS_URL = "https://api.twitter.com/oauth/access_token";
    public static final String AUTHORIZE_URL = "https://api.twitter.com/oauth/authorize";

    public static final String  OAUTH_CALLBACK_SCHEME   = "x-oauthflow-twitter";
    public static final String  OAUTH_CALLBACK_HOST     = "callback";
    public static final String  OAUTH_CALLBACK_URL      = OAUTH_CALLBACK_SCHEME + "://" + OAUTH_CALLBACK_HOST;

}
4

1 に答える 1

0

twitter4j APIを使用できます

Twitter twitter = new TwitterFactory().getInstance();
Status status = twitter.updateStatus(latestStatus);
System.out.println("Successfully updated the status to [" + status.getText() + "].");
于 2012-10-12T06:46:39.583 に答える