AndroidTVにデータを転送したい!
- 動画ファイルを入れれば、AndroidTVで再生できる!
- スマホで使っているアプリからapkを抽出すれば、TV用でないアプリもAndroidTVにインストールできる!
- (使えるとは限らないけど……)
というわけで、AndroidTVにデータを送りたいわけですが、直接PCとUSB接続してファイルを転送するくらいしか方法がありません。
スマホなどからデータを転送する場合も不便です。
AndroidTV用のFTPサーバアプリを開発しました
スマホ用FTPサーバはいっぱいありますが、インストールしてもUI的にAndroidTVではほとんど使えません……
このアプリを使えば、簡単にPCやスマホからデータを転送することができます。
開発過程
ライブラリの導入
最初はポートで受け付けて、そのあとは規定されたプロトコルに従ってデータを送れば……とか考えてましたが、ライブラリがありました。
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に次のような形で書きます。
android {
// ...
defaultConfig {
// ...
multiDexEnabled true
}
}
dependencies {
// ...
compile 'com.android.support:multidex:1.0.1'
}
さらに、ManifestでApplicationの指定をします。
<manifest ...>
...
<application
android:name="android.support.multidex.MultiDexApplication"
...>
...
</application>
...
</manifest>
簡単にFTPサーバを立てられる
ここまで準備できればあとは簡単で、ユーザが入力した情報をもとにライブラリをたたくだけです。
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にデータを転送しているんだろう?)があれば教えていただけると大変嬉しいです!