忍者ブログ
rel@zx勉強雑記。 AndroidやゲームAIなどの覚書など。
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

こんばんは。

さて、約3日の格闘の末、ようやく出来たAndroidのtwitterアプリもどきの覚書など。
調べれば調べるほどドツボにハマる凶悪な仕様でした。
APIが分からないというかAndroidの仕組みが分からなくて難航してたのは内緒。

と言うか、twitterアプリの設定からアプリケーション設定消えてるよね?
既存の設定にもないし、新規作成時にも確認されず。

どうやら、CallbackのURIに何かを含める事で分岐するとかしないとか?
(確証が持てないので未だ調査中…)

拍手[0回]


1.実施手順について
 最初に、実施の工程を簡単に列挙していきたいと思います。
(1)アプリケーションの登録
(2)twitter4jのダウンロード、設定
(3)アプリケーションからブラウザで認証画面を開く
(4)ブラウザから認証後、自動でアプリに戻り、結果を反映。
(5)ブラウザからもらった結果を保存
(6)何かつぶやいてみる

以上について見ていきます。
今回は参考サイトに挙げていますアクティビティを2つ使った方法について
記述しております。他にも認証をStartActivityで行う方法、startActivityForResultを
Overrideする方法については以前仕組みが不明なため、
判明次第書いていきたいと思います。


(1)アプリケーションの登録
 https://dev.twitter.com/apps へアクセスします。
ログインを行い、画面上部の "Create a new application" ボタンを押します。
表示されていない場合は右上の自分のアカウントアイコンにカーソルを持って行き、
"My application" を押します。
以下のように入力していきます。
Name:アプリケーション名
Description:アプリケーションの説明
WebSite:自分のWebサイトなどを記述

Yes, I agreeにチェック。
表示されている識別記号を入力。
Create your Twitter applicationボタンを押します。
登録したアプリケーションを開き、以下の2つを控えておきます。

・Consumer key
・Consumer secret


(2)twitter4jのダウンロード、設定
 http://twitter4j.org/ja/index.html からAndroid用のzipをダウンロードします。
ダウンロードしたzipを適当なフォルダに展開します。
Eclipseの新規Androidプロジェクトを作成します。
作成したプロジェクトを右クリックし、Properties を開きます。
Java Build PathからLibrariesタブを開き、Add External JARs...ボタンを押し、
先ほど、展開したフォルダのlibフォルダ中の、twitter4j-core-android-2.2.x.jarを指定します。
201112292229.png

(3)アプリケーションからブラウザでOAuth認証画面を開く
 res/layout内の main.xml を以下のように書き換えます。


	<?xml version="1.0" encoding="utf-8"?>

	<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

	    android:layout_width="fill_parent"

	    android:layout_height="fill_parent"

	    android:orientation="vertical" >

	 

	    <Button android:text="OAuth" android:id="@+id/button1"

	        android:layout_width="wrap_content"

	        android:layout_height="wrap_content">      

	    </Button>

	</LinearLayout>
続いて、main.xmlをコピーペーストして、callback.xmlを作ります。 callback.xml は以下のように記述します。

	<?xml version="1.0" encoding="utf-8"?>

	<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

	    android:layout_width="fill_parent"

	    android:layout_height="fill_parent"

	     android:orientation="vertical" >

	 

	     <Button android:text="Tweet" android:id="@+id/button2"

	        android:layout_width="wrap_content"

	        android:layout_height="wrap_content">

	    </Button>

	 

	    <TextView android:text="TextView" android:id="@+id/textview1"

	        android:layout_width="wrap_content"

	        android:layout_height="wrap_content">

	    </TextView>

	</LinearLayout>

AndroidManifest.xml を開き、</activity> の後に以下の行を追記します。

	<activity android:label="@string/app_name"

	            android:name="CallBackActivity" >

	            <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:scheme="Callback" />

	            </intent-filter>

	</activity>

文字色を変更したnameは後述するcallbackのクラス名と一致させる必要があります。 <application></application>の外に以下の行を追加します。 ※以下の行は必ずapplicationタグの外に記述してください
<uses-permission android:name="android.permission.INTERNET" />

プロジェクト作成時に自動生成されたアクティビティクラスを開きます。
以下のように記述します。
Eclipseの補完機能のショートカット Ctrl+Space を使うと自動的にimportが設定されて便利です。


	public class OAuthTest extends Activity {

	    public static RequestToken mRequestToken = null;

	    public static OAuthAuthorization mOAuth = null;

	    private static final String CONSUMER_KEY = "先ほど控えたConsumer keyを記述";

	    private static final String CONSUMER_SECRET = "先ほど控えたConsumer secretを記述";

	    private static final String CALLBACK_URL = "Callback://CallbackActivity";

	    private static final int REQUEST_CODE = 1;

	    private String OAUTH_VERIFIER = "oauth_verifier";

	 

	    @Override

	    public void onCreate(Bundle savedInstanceState) {

	        super.onCreate(savedInstanceState);

	        setContentView(R.layout.main);

	        Button button = (Button)findViewById(R.id.button1);

	        button.setOnClickListener(new OnClickListener() {

	            @Override

	            public void onClick(View v) {

	                executeOAuth();

	            }

	        });

	    }    

	 

	    private void executeOAuth() {

	        // twitter4jの設定を読み込む

	        Configuration conf = ConfigurationContext.getInstance();

	 

	        // OAuth認証オブジェクト作成

	        mOAuth = new OAuthAuthorization(conf);

	 

	        // OAuth認証オブジェクトにCONSUMER_KEY、CONSUMER_SECRETを追加

	        mOAuth.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);

	 

	        // アプリの認証オブジェクト作成

	        try {

	            mRequestToken = mOAuth.getOAuthRequestToken(CALLBACK_URL);

	        } catch(TwitterException e) {

	            e.printStackTrace();

	        }

	 

	        String uri;

	        uri = mRequestToken.getAuthorizationURL();

	        startActivityForResult(new Intent(Intent.ACTION_VIEW, Uri.parse(uri)), REQUEST_CODE);

	    }

	}

先ほどの手順で控えた"Consumer key"と、 "Consumer secret"をそれぞれ記述します。 ※Configurationクラスは2つありますが、twitter4j.conf.Configurationが正解です。 Activityを継承した CallBackActivity クラスを作成します。 onCreateの中を以下の行で書き換えます。
super.onCreate(savedInstanceState);
setContentView(R.layout.callback);

(4)ブラウザからOAuth認証後、自動でアプリに戻り、結果を反映。
 先ほどの手順で記述した CallBackActivityクラスのonCreate関数に以下の行を追記します。

	AccessToken accessToken = null;

	 

	// Twitterの認証画面から発行されるIntentからUriを取得

	Uri uri = getIntent().getData();

	 

	if(uri != null && uri.toString().startsWith(CALLBACK_URL)) {

	   // oauth_verifierを取得する

	   String verifier = uri.getQueryParameter(OAUTH_VERIFIER);

	   try {

	         // AccessTokeオブジェクトを取得

	         accessToken = OAuthTest.mOAuth.getOAuthAccessToken(OAuthTest.mRequestToken, verifier);

	       } catch(TwitterException e) {

	             e.printStackTrace();

	       }

	 

	}

	 

	TextView tv = (TextView)findViewById(R.id.textview1);

	CharSequence cs = "token:" + accessToken.getToken() + "\r\n" + "token secret:" + accessToken.getTokenSecret();

	tv.setText(cs);

ここまで手順でアプリケーションを起動すると、 最初にOAuthボタンが表示され、 そのボタンを押すことによってブラウザが起動し、ログイン後 自動的にアプリ側に戻り、アクセストークンが画面に表示されます。 (5)ブラウザからもらった結果を保存  SharedPreferencesによって実現します。 先ほどの手順のTextView tv... の行の前に以下の行を追記します。

	// 設定ファイルに認証情報を書き込み

	SharedPreferences pref = getPreferences(MODE_PRIVATE);

	SharedPreferences.Editor editor = pref.edit();

	editor.putString(KEY_TOKEN, accessToken.getToken());

	editor.putString(KEY_TOKEN_SECRET,

	accessToken.getTokenSecret());

	editor.commit();

(6)何かつぶやいてみる  文字列を渡すことで認証したアカウントでつぶやく関数を実装します。 CallBackActivityクラスに以下の関数を追加します。

	    // つぶやき関数

	    public void tweet(String tweet) {

	 

	        // アクセストークンの生成

	 

	        SharedPreferences pref = getPreferences(MODE_PRIVATE);

	 

	        String token = pref.getString(KEY_TOKEN, null);

	 

	        String tokenSecret = pref.getString(KEY_TOKEN_SECRET, null);

	 

	        AccessToken accessToken = new AccessToken(token, tokenSecret);

	 

	        

	 

	        // つぶやく

	 

	        Twitter twitter = new TwitterFactory().getInstance();

	 

	        twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);

	 

	        twitter.setOAuthAccessToken(accessToken);

	 

	        try {

	 

	            twitter.updateStatus(tweet);

	 

	        } catch (TwitterException e) {

	 

	            android.util.Log.e("TwitterException", e.toString());

	 

	        }

	 

	    }

先ほどの手順のCallBackActivityクラスのonCreate関数の最後部に 以下の行を追記します。

	        Button button = (Button)findViewById(R.id.button2);

	        button.setOnClickListener(new OnClickListener() {

	 

	            

	 

	            @Override

	 

	            public void onClick(View v) {

	 

	                Time time = new Time("Asia/Tokyo");

	 

	                time.setToNow();

	 

	                String date = time.year + "年" + (time.month+1) + "月" + time.monthDay + "日 "

	 

	                + time.hour + "時" + time.minute + "分" + time.second + "秒";

	 

	                tweet("とーこーてすと。  " + date);

	 

	                

	 

	            }

	 

	        });

onClick関数の中でtweet関数に文字列を渡すことで つぶやきを実現しています。
引数を変えることで任意の文字をつぶやくことが可能です。
なお、今回紹介した方法では、アプリの起動毎に認証が必要になっています。
これを解決する手段としてはSharedPrederenceに認証状態を書きこんでおき、
この状態によって認証するか、直接つぶやきを行うか分岐させる方法が考えられます。

以上の方法により、つぶやきまでを実現することが出来ました。
参考にさせて頂いたサイトの運営者に感謝いたします。

・参考サイト (OAuth認証)
http://techbooster.jpn.org/andriod/mashup/5040/#more-5040 http://techbooster.jpn.org/andriod/mashup/5301/

(つぶやき)
http://garlicg.blog92.fc2.com/blog-entry-2.html
PR
COMMENT FORM
NAME
URL
MAIL
PASS
TITLE
COMMENT
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
TRACKBACK
TRACKBACK URL > 
カレンダー
06 2017/07 08
S M T W T F S
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
ブログ内検索
最新CM
プロフィール
HN:
rel@zx
職業:
ゲームプログラマー
自己紹介:
2012年より念願のプログラマ修行を開始いたしました。
クマグラマーとして勉強会、Game Jamに出没注意!
Twitter
ゲーマータグ
アクセス解析
DoCrystal

Powerd By DoCrystal
忍者ブログ [PR]
"rel@zx" WROTE ALL ARTICLES.
PRODUCED BY SHINOBI.JP @ SAMURAI FACTORY INC.