4

Androidモバイルからサーバーにビデオ/画像を送信し、処理されたビデオ/画像を受信したい。(たとえば、画像を送信し、この画像をバイナリ画像、グレースケール、またはサイズ変更などとして受信します)それを行うための最良かつ最も簡単な方法は何ですか?Http?ソケット?XML?そしてそれをどのように行うのですか?

ストリームで実行しようとしましたが(Android LogCatで共有ライブラリがエラーを検出しませんでした)、実行方法も管理できませんでした。

前もって感謝します

4

1 に答える 1

5

まず、質問の特定の部分に答える前に、いくつかの一般的なアドバイスを示します。

デバイスでささいなことをしてみてください。画像にマスクを配置したり、画像を回転/サイズ変更したりするだけで、非常に簡単で、デバイス上で実行できます。このように、ユーザーは何もアップロードする必要がなく(そして待つ必要もありません)、サーバーの負荷はそれほど高くありません。

ビデオや写真は大きくなる可能性があります。これを考慮に入れてください。頭に浮かぶアイデアは、ユーザーは画像/ビデオを1回だけアップロードする必要がありますが、最終結果をダウンロードする前に複数の操作を実行できる必要があるということです。そうしないと、待ち時間が長くなり、トラフィックが多くなります。

ユーザーに伝えましょう!自分のサーバーに(おそらく個人的な)写真/ビデオのアップロードを実際に開始する場合は、取得できる最大限のセキュリティを使用していることを確認し(SSLは必須です)、コンテンツをにアップロードすることをユーザーに伝えますあなたのサーバー。また、あなたは彼らにそれを断るオプションを与えるべきです、さもなければ、あなたは訴訟に直面するかもしれません。


さて、その技術的な部分に:

サーバーとの間でファイルをアップ/ダウンロードするためのワークフローは、ほとんどの場合同じです。

  • を使用してサーバーへの接続を開きますSocket
  • ファイルのストリームを取得します(あなたの場合、FileInputStream
  • byte-配列内のバイナリデータのチャンクを読み取ります
  • 読み取りチャンクをソケットからの出力ストリームに書き込みます
  • 完了したら、ストリームを閉じてからソケットを閉じます

サーバーでは、逆の方法でInputStreamから読み取り、コンテンツをに書き込みFileOutputStreamます。

これがどのように見えるかの小さな例を次に示します。

Socket server = new Socket("192.168.178.32", 1337);
OutputStream outputStream = server.getOutputStream();
FileInputStream in = null;
try {
    in = new FileInputStream("/some/path/to/gras.jpeg");
    // Write to the stream:
    byte[] buffer = new byte[1024]; // 1KB buffer size
    int length = 0;
    while ( (length = in.read(buffer, 0, buffer.length)) != -1 ){
        outputStream.write(buffer, 0, length);
    }
    outputStream.flush();
} finally {
    if (in != null) in.close();
    socket.close(); // Will close the outputStream, too.
}

このコードは、ここでスローされる可能性のある例外があるという事実を却下します。それらを適切な方法で処理する必要があります。


考慮すべき点は、ユーザーがモバイルインターネット接続からコンテンツをアップロードする可能性があることです。これは傍受される可能性があります(たとえば、トンネルを通過する場合)。この場合、再開できるようにアップ/ダウンロードを実装する必要があります。

于 2012-06-30T16:45:56.827 に答える