LoginSignup
9
10

More than 5 years have passed since last update.

Android TV向けのFTPサーバアプリを作ってみた

Last updated at Posted at 2016-01-17

AndroidTVにデータを転送したい!

  • 動画ファイルを入れれば、AndroidTVで再生できる!
  • スマホで使っているアプリからapkを抽出すれば、TV用でないアプリもAndroidTVにインストールできる!
    • (使えるとは限らないけど……)

というわけで、AndroidTVにデータを送りたいわけですが、直接PCとUSB接続してファイルを転送するくらいしか方法がありません。
スマホなどからデータを転送する場合も不便です。

AndroidTV用のFTPサーバアプリを開発しました

FTP Server for Android TV

スマホ用FTPサーバはいっぱいありますが、インストールしてもUI的にAndroidTVではほとんど使えません……
このアプリを使えば、簡単にPCやスマホからデータを転送することができます。

開発過程

ライブラリの導入

最初はポートで受け付けて、そのあとは規定されたプロトコルに従ってデータを送れば……とか考えてましたが、ライブラリがありました。

Apache FtpServer

Gradleに次のような形で書けば使えます。

build.gradle
android {
    // ...
    packagingOptions {
        pickFirst 'META-INF/NOTICE'
        pickFirst 'META-INF/LICENSE'
    }
}

dependencies {
    // ...
    compile 'org.apache.ftpserver:ftpserver-core:1.0.6'
    compile 'org.slf4j:slf4j-android:1.7.13'
}

FtpServerのログ出力に関する警告がうるさかったので、二つ目のライブラリも入れました。
そしたらMETA-INFが衝突したので、最初のを採用するようにしました。

メソッド数問題

FtpServerにはたくさんのメソッドが詰め込まれているらしく、ビルドできなかったので、Multi-dex Supportを使いました。

Gradleに次のような形で書きます。

build.gradle
android {
    // ...
    defaultConfig {
        // ...
        multiDexEnabled true
    }
}

dependencies {
    // ...
    compile 'com.android.support:multidex:1.0.1'
}

さらに、ManifestでApplicationの指定をします。

AndroidManifest.xml
<manifest ...>
    ...
    <application
        android:name="android.support.multidex.MultiDexApplication"
        ...>
        ...
    </application>
    ...
</manifest>

簡単にFTPサーバを立てられる

ここまで準備できればあとは簡単で、ユーザが入力した情報をもとにライブラリをたたくだけです。

MainActivity.java
FtpServerFactory serverFactory = new FtpServerFactory();
ListenerFactory listenerFactory = new ListenerFactory();
listenerFactory.setPort(ポート);
serverFactory.addListener("default", listenerFactory.createListener());

ConnectionConfigFactory connectionConfigFactory = new ConnectionConfigFactory();
connectionConfigFactory.setAnonymousLoginEnabled(匿名ログインを許可するか);
serverFactory.setConnectionConfig(connectionConfigFactory.createConnectionConfig());

PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory();
userManagerFactory.setPasswordEncryptor(new SaltedPasswordEncryptor());
UserManager userManager = userManagerFactory.createUserManager();

BaseUser user = new BaseUser();
user.setName(ユーザ名);
user.setPassword(パスワード);
user.setHomeDirectory("/");
if (書き込みを許可するか) {
    List<Authority> authorities = new ArrayList<>();
    Authority authority = new WritePermission();
    authorities.add(authority);
    user.setAuthorities(authorities);
}
try {
    userManager.save(user);
    serverFactory.setUserManager(userManager);
    server = serverFactory.createServer();
    server.start();
} catch (FtpServerConfigurationException | FtpException e) {
    e.printStackTrace();
}

問題点

  • Service化するとうまく動かない
    • しょうがなくActivityで実装した
    • FTP立てっぱなしにするには、ホームボタンを押してアプリをキルしないようにする
  • ホームディレクトリをいじるとうまく動かない
  • USBメモリや外付けHDDにアクセスできない
    • ちょっと難しそう

ひとまず自分は満足してしまったので、この辺の問題はアプリのダウンロード数が伸びたら考えたいと思います。

他に何かいい方法(そもそもみんなどうやってAndroidTVにデータを転送しているんだろう?)があれば教えていただけると大変嬉しいです!

9
10
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10