IntentConverterの開発 2

Google Readerから渡されるURLが長いので、TinyURLでURL短縮する。


    public static String shortenUrl(String urlStr) {
    	String shortenedUrlStr = urlStr;

    	String shorterServiceUrtStr = "http://tinyurl.com/api-create.php?url=";
    	HttpURLConnection connection = null;
    	InputStream is = null;
    	byte[] buffer = null;
    	ByteArrayOutputStream baos = null;

    	try {
    		URL url = new URL(shorterServiceUrtStr + urlStr);
    		connection = (HttpURLConnection)url.openConnection();
    		connection.setRequestMethod("GET");
    		connection.connect();
    		is = connection.getInputStream();
    		baos = new ByteArrayOutputStream();
    		buffer = new byte[256];
    		int len = is.read(buffer);
    		while (len > 0) {
    			baos.write(buffer, 0, len);
    			len = is.read(buffer);
    		}
    		baos.close();
    		is.close();

        	shortenedUrlStr = baos.toString();
    	} catch (Exception e) {
    		if (baos != null) {
    			try {
    				baos.close();
    			} catch (IOException ioe) {

    			}
    		}
    		if (is != null) {
    			try {
    				is.close();
    			} catch (IOException ioe) {

    			}
    		}
    	}

    	return shortenedUrlStr;
    }

■参考

IntentConverterの開発

Androidアプリで、Google公式のGoogle Readerから、「Send」コマンドでTwitterに投稿する際、記事の「URL」しか投稿できない。

記事の「タイトル + URL」で投稿したかったので、Intentの変換アプリ(Intent Converter)を開発することに決定。

開発までの流れをメモ的エントリー。

■調査

Google Readerアプリの「SEND」コマンドで、Emailを選択すると、Emailの件名に「記事のタイトル」、本文に「記事のURL」が入っているので、このソースコードが参考になると判断。よって、

  1. Emailのソースコード見て、IntentFilterの記述と、データの受け取り方を調べる
  2. 「記事のタイトル + URL」をSENDアクションのデータとして、TwitterクライアントにSENDし直す

ことに決定。

■実装

まず、Emailのmanifest。

[platform/packages/apps/Email.git] / AndroidManifest.xml

IntentFilterの記述と、データを受け取るActivity名が判明。IntentFilterの記述は以下。


<intent-filter>
	<action android:name="android.intent.action.SEND" />
	<data android:mimeType="text/plain" />
	<category android:name="android.intent.category.DEFAULT" />
</intent-filter>

次、データの受け取りのソースコード。

[platform/packages/apps/Email.git] / src / com / android / email / activity / MessageCompose.java

以下のコードでインテントのデータを取得できる。


Intent receivedIntent = getIntent();
String subject = receivedIntent.getStringExtra(Intent.EXTRA_SUBJECT);
String text = receivedIntent.getStringExtra(Intent.EXTRA_TEXT);

よって、全体としては、以下のコードでOK。


public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);

	// インテントの受信
	Intent receivedIntent = getIntent();
	if (receivedIntent != null) {
		String action = receivedIntent.getAction();
		// 通常起動
		if (action.equals(Intent.ACTION_MAIN)) {
	        setContentView(R.layout.main);
		}
		// アクションがSENDの場合
		else if (action.equals(Intent.ACTION_SEND)) {
			String subject = receivedIntent.getStringExtra(Intent.EXTRA_SUBJECT);
			String text = receivedIntent.getStringExtra(Intent.EXTRA_TEXT);
			// つぶやき本文の構築
			String value = "";
			if (subject != null) {
				value += subject + " ";
			}
			if (text != null) {
				value += text;
			}
			// 中継インテントの発行
			Intent invokeIntent = new Intent();
			invokeIntent.setAction(Intent.ACTION_SEND);
			invokeIntent.setType("text/plain");
			invokeIntent.putExtra(Intent.EXTRA_TEXT, value);
			startActivity(invokeIntent);
			// アプリの終了
			finish();
		}
	}
}

■参考文献

http://developer.android.com/intl/ja/reference/android/content/Intent.html