からくりブログ

株式会社からくり社員のブログです

Android用FlashAirアプリ開発:FlashAir情報の取得

はじめに

今回は前々回前回作成した開発環境を使用してFlashAir開発を行っていきます。
まずは前々回作成したプロジェクトを使用し、FlashAirから情報を取得してみましょう。
環境:nexus5, Windows8.1(64bit)

今後FlashAirのAPIなどを使用し、開発を行っていきますので下記サイトをご参考ください。
参考:FlashAir™ Developers
 


 

1. FlashAirとの接続

1-1. Android Studioを起動し、前々回作成したプロジェクトを開きます。
1-1

1-2. プロジェクトのパッケージで右クリックを押下し、[New] > [Java Class]を選択しクラスを作成します。
 クラス名は[SampleConnection]としました。
1-2

1-3. 作成したクラスに下記のソースコードを追記します。
 内容については[2. ソースコードの説明]で説明していきます。

SampleConnection.java

package jp.kara_kuri.flashairsample;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

public class SampleConnection {

    private static final int MEGA_BYTE = 1048576;

    private static SampleConnection _instance = new SampleConnection();

    private static int _bufferSize = MEGA_BYTE;

    private static String _hostName = "flashair";

    private static String _character = "UTF-8";

    private static int _connTimeout = 30000;

    private SampleConnection() {
    }

    public static SampleConnection getInstance() {
        return _instance;
    }

    public synchronized void setHostName(String hostName) {
        _hostName = hostName;
    }

    public synchronized void setBufferSize(int bufferSize) {
        _bufferSize = bufferSize;
    }

    public synchronized String sendRequest(String command) throws IOException {

        String result = null;
        HttpURLConnection conn = null;
        InputStream is = null;
        BufferedInputStream bis = null;
        ByteArrayOutputStream bos = null;

        try {

            URL url = getUrl(command);
            conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(_connTimeout);
            conn.setInstanceFollowRedirects(false);
            conn.setUseCaches(false);

            checkResponse(conn);

            is = conn.getInputStream();
            bis = new BufferedInputStream(is, _bufferSize);
            bos = new ByteArrayOutputStream();
            byte[] buff = new byte[_bufferSize];

            int tmpSize = 0;
            while ((tmpSize = bis.read(buff)) != -1) {
                bos.write(buff, 0, tmpSize);
            }

            result = bos.toString();
        } finally {
            if (bos != null) bos.close();
            if (bis != null) bis.close();
            if (is != null) is.close();
            if (conn != null) conn.disconnect();
        }

        return result;
    }

    private URL getUrl(String command) throws IOException {

        if (!command.startsWith("/")) {
            command = "/" + command;
        }

        String encodeCmd = URLEncoder.encode(command, _character);
        encodeCmd = encodeCmd.replace("*", "%2a");
        encodeCmd = encodeCmd.replace("-", "%2d");
        encodeCmd = encodeCmd.replace("+", "%20");
        encodeCmd = encodeCmd.replace("%2F", "/");
        return new URL("http://" + _hostName + encodeCmd);
    }

    private void checkResponse(HttpURLConnection conn) throws IOException {

        int resultCode = conn.getResponseCode();
        switch (resultCode) {
            case HttpURLConnection.HTTP_OK:
            case HttpURLConnection.HTTP_PARTIAL:
                break;
            case HttpURLConnection.HTTP_INTERNAL_ERROR:
            case HttpURLConnection.HTTP_NOT_FOUND:
            default:
                throw new IOException("["
                        + String.valueOf(resultCode) + "]"
                        + conn.getResponseMessage());
        }
    }
}

1-4. [AndroidManifest.xml]ファイルに[android.permission.INTERNET]権限を追記します。
1-4

2. ソースコードの説明

2-1. [getUrl(String)]について
 FlashAirに対しリクエストを行う場合、CGIという仕組みを利用し命令を実行するのですが、その際にURIにおいて使用できない文字を使用するためにURLエンコードを行います。
 (例) http://flashair/command.cgi?< パラメータ>
 参考:FlashAir™ Developers:APIガイド

2-2. [checkResponse(HttpURLConnection)]について
 FlashAirに対しリクエストを行った後、レスポンスを返却されます。
 そのレスポンスの中からレスポンスコードを取得し、処理判定しています。

2-3. [sendRequest(String command)]について
 HTTPの機能をサポートとして[HttpURLConnection]を使用しています。
 [conn.setInstanceFollowRedirects(false)]はFlashAirにはリダイレクト機能があるため、想定外のデータを取得しないようにしています。
 [conn.setUseCaches(false)]はキャッシュによるデータの不整合が起こらないようにしています。
 2-2. の判定で成功した場合、[conn.getInputStream()]以降の処理によりデータの取得を行います。
 


 

最後に

お疲れ様でした、FlashAirとの接続は以上となります。
また機会がございましたら今回作成したプログラムを前回作成したデバッグ環境を使用して実行してみたいと思います。

One response to “Android用FlashAirアプリ開発:FlashAir情報の取得”

  1. […]   ※前回作成したクラスのクラス名を選択し、[alt + Enter]を押下するとTestクラスを自動で作成することもできます。 […]

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>