カテゴリー
未分類

JavaでByte[]とObject(Serializable)を相互変換

意外と使うことが多いのでメモ程度にライブラリを作った。

public final class ByteArray {
    static byte[] fromObject(Object o) throws IOException{
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutput out = new ObjectOutputStream(bos);
        out.writeObject(o);
        byte[] bytes = bos.toByteArray();
        out.close();
        bos.close();
        return bytes;
    }
    static Object toObject(byte[] bytes) throws OptionalDataException, StreamCorruptedException, ClassNotFoundException, IOException{
        return new ObjectInputStream(new ByteArrayInputStream(bytes)).readObject();
    }
}

現在Androidの開発をやっているのですが、AIDLで通信するときにプリミティブ型(byte,int,String,and so on)のデータしか送れない。

本来ならParcelableを使わないといけないらしいのですが、そんなもの守る気はありません←

というわけで上のメソッドを使えば簡単にSerializableを実装しているObjectとByteを相互変換できます。

カテゴリー
未分類

AndroidでSSLSocketを使う

なんか、いろいろ難しい。

HttpsURLConnectionでKeep-Alive?

そんなことするならSSLSocket使って自分で処理します。

 

というわけで今回はAndroidでSSLSocketを使う方法。

javax.net.SocketFactory;
javax.net.ssl.SSLSocketFactory;

とりあえずこいつらを使います。

Socket s = SSLSocketFactory.getDefault().createSocket(host,port);//portは基本443で。

これでおk。はい、めでたしめでたし。

 

そしておまけ。

AndroidでBASE64エンコードするのは

android.util.Base64;

こいつをインポートして、

Base64.encodeToString(“文字”.getBytes(), Base64.DEFAULT);

これでおk。

カテゴリー
未分類

AndroidでTwitterのOAuth認証

どこのページに行ってもOAuthの事に関していろいろ書いてあるけど率直で使いやすいものがあまりみつからない。(俺の頭が悪いだけ)

というわけで今回はAndroidでTwitterのOAuth認証を簡単にできるActivityを作った。

このActivityに飛ばしてあげるだけでOK。

ここではTwitter4j 2.1.8を使っています。

getOAuthRequestTokenメソッドにコールバックを指定するとなぜかエラーで落ちてしまうので、それを回避するように作ってます。

 

onAuthorizedメソッドの引数にAccessTokenとAccessTokenSecretが飛んできますのでご自由にお使いください。

 

以下ソースコード

import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.*;
import android.view.*;
import android.view.View.OnClickListener;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.*;
import twitter4j.*;
import twitter4j.http.*;

public void onAuthorized(String accessToken,String accessTokenSecret){
    //認証後後にやりたいことをここに書く。
    finish();
}

public class TwitterOAuth extends Activity{
    private Display display;
    private Handler handler = new Handler();
    private LinearLayout base,form;
    private EditText verifier;
    private WebView wb;
    private Twitter twitter;
    private AccessToken accToken;
    private RequestToken reqToken;
    private final String CONSUMER_KEY = “xxxxxxxxxxxxxxxxx”; // Consumer key をセット
    private final String CONSUMER_SECRET = “yyyyyyyyyyyyyyyyyyy”; // Consumer secret をセット
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SharedPreferences pref = getPreferences(MODE_PRIVATE);
        if(pref.getString(“AccessToken”,””).equals(“”)||pref.getString(“AccessTokenSecret”,””).equals(“”)){
            display = ((WindowManager)getSystemService(this.WINDOW_SERVICE)).getDefaultDisplay();
            base = new LinearLayout(this);
            base.setOrientation(LinearLayout.VERTICAL);
            form = new LinearLayout(this);
            form.setOrientation(LinearLayout.HORIZONTAL);
            verifier = new EditText(this);
            verifier.setWidth(display.getWidth()-100);
            verifier.setHeight(20);
            Button button = new Button(this);
            button.setText(“OK”);
            button.setHint(“PIN CODE”);
            button.setWidth(100);
            button.setHeight(20);
            button.setOnClickListener(new OnClickListener(){
                @Override
                public void onClick(View v) {
                    handler.post(new Runnable(){
                        public void run(){
                            try {
                                accToken = twitter.getOAuthAccessToken(reqToken,verifier.getText().toString());
                                Editor e = getPreferences(MODE_PRIVATE).edit();
                                String accessToken = accToken.getToken();
                                String accessTokenSecret = accToken.getTokenSecret();
                                e.putString(“AccessToken”,accessToken);
                                e.putString(“AccessTokenSecret”,accessTokenSecret);
                                e.commit();
                                onAuthorized(accessToken,accessTokenSecret);   
                            } catch (TwitterException e) {}
                        }
                    });
                }
            });
            wb =  new WebView(this);
            wb.setWebViewClient(new WebViewClient());
            form.addView(verifier);
            form.addView(button);
            base.addView(form);
            base.addView(wb,new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
            setContentView(base);
            doAuthorize();
        }else{
            Toast.makeText(this,”You are already authorized.”, Toast.LENGTH_LONG).show();
            finish();
        }
    }
   
    public void doAuthorize(){
        twitter = new TwitterFactory().getOAuthAuthorizedInstance(CONSUMER_KEY,CONSUMER_SECRET);
        try{
            reqToken = twitter.getOAuthRequestToken();
            wb.loadUrl(reqToken.getAuthorizationURL().toString());
            wb.requestFocus(View.FOCUS_DOWN);
        }catch(Exception e){Toast.makeText(this, “ERROR.”,Toast.LENGTH_SHORT).show();}
    }

}

カテゴリー
未分類

TwitterのStreaming APIを利用する(Java)

この内容は自分のようなStreaming API?^q^やSSL?’q`な方に向けて書いていきます。

まず大まかな流れ。

1.SSLソケットを作る

2.BASIC認証用のキーを作成する

3.キーを使いリクエストヘッダを作成し送信する

4.データをもらう

これだけ。

 

Javaで書くとソースコードはこんな感じ。

import java.io.*;
import java.net.*;
import javax.net.ssl.*;
import sun.misc.BASE64Encoder;

class test{
    public static void main(String[] args) throws Exception {
        //SSLSocketを作成
        Socket s = HttpsURLConnection.getDefaultSSLSocketFactory().createSocket(“stream.twitter.com”,443);

        //入出力用
        BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
        PrintWriter out = new PrintWriter(s.getOutputStream());

        //filterの場合、track=検索キーワードでキーワード検索の結果をリアルタイムで取得できる。
        out.println(“GET /1/statuses/filter.json?track=axe1lyze HTTP/1.1”);

        //認証キーの作成 ユーザーID:パスワード をBASE64で暗号化
        String key = new String((new BASE64Encoder()).encodeBuffer(“UserID:Password”.getBytes()));
        out.println(“Authorization:Basic “+key);

        //フラッシュしてデータを送信
        out.flush();

        //これでデータを取得し続ける
        String line;
        while((line=in.readLine())!=null){System.out.println(line);}
    }
}

 

取得形式はJSONだけなのかな?XMLもいけるとありがたいんだけども。

BASIC認証が使えるみたい。これはStreaming APIだけかな?

ツイートの投稿もこんな流れでできると幸せになれるんだけどなぁ。

自分が知らないだけでしたら申し訳ありません。