0

Android 側で Download Manager を使用して、さまざまなソースからファイルをダウンロードしています。次に、このアプリケーションのサーバー側を作成する必要があります。

まず、Android 側の簡単なコードを次に示します。

private DownloadManager mgr = null;
private long lastDownload = -1L;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mgr = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
    registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
    registerReceiver(onNotificationClick, new IntentFilter(DownloadManager.ACTION_NOTIFICATION_CLICKED));
}

@Override
public void onDestroy() {
    super.onDestroy();

    unregisterReceiver(onComplete);
    unregisterReceiver(onNotificationClick);

}

public void startDownload(View v) {
    // Uri uri = Uri.parse("http://commonsware.com/misc/test.mp4");
    Uri uri = Uri.parse("http://xxx.xxx.xxx.xxx:8080/FileUpload/asd.mp3");

    Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).mkdirs();

    lastDownload = mgr.enqueue(new DownloadManager.Request(uri)
            .setAllowedNetworkTypes(
                    DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE)
            .setAllowedOverRoaming(false).setTitle("Demo")
            .setDescription("Something useful. No, really.")
            .setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "test.mp4"));

    v.setEnabled(false);
    findViewById(R.id.query).setEnabled(true);
}

public void queryStatus(View v) {
    Cursor c = mgr.query(new DownloadManager.Query().setFilterById(lastDownload));

    if (c == null) {
        Toast.makeText(this, "Download not found!", Toast.LENGTH_LONG).show();
    } else {
        c.moveToFirst();

        Log.d(getClass().getName(),
                "COLUMN_ID: " + c.getLong(c.getColumnIndex(DownloadManager.COLUMN_ID)));
        Log.d(getClass().getName(),
                "COLUMN_BYTES_DOWNLOADED_SO_FAR: "
                        + c.getLong(c.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)));
        Log.d(getClass().getName(),
                "COLUMN_LAST_MODIFIED_TIMESTAMP: "
                        + c.getLong(c.getColumnIndex(DownloadManager.COLUMN_LAST_MODIFIED_TIMESTAMP)));
        Log.d(getClass().getName(),
                "COLUMN_LOCAL_URI: " + c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)));
        Log.d(getClass().getName(),
                "COLUMN_STATUS: " + c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)));
        Log.d(getClass().getName(),
                "COLUMN_REASON: " + c.getInt(c.getColumnIndex(DownloadManager.COLUMN_REASON)));

        Toast.makeText(this, statusMessage(c), Toast.LENGTH_LONG).show();
    }
}

public void viewLog(View v) {
    startActivity(new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS));
}

private String statusMessage(Cursor c) {
    String msg = "???";

    switch (c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS))) {
    case DownloadManager.STATUS_FAILED:
        msg = "Download failed!";
        break;

    case DownloadManager.STATUS_PAUSED:
        msg = "Download paused!";
        break;

    case DownloadManager.STATUS_PENDING:
        msg = "Download pending!";
        break;

    case DownloadManager.STATUS_RUNNING:
        msg = "Download in progress!";
        break;

    case DownloadManager.STATUS_SUCCESSFUL:
        msg = "Download complete!";
        break;

    default:
        msg = "Download is nowhere in sight";
        break;
    }

    return (msg);
}

BroadcastReceiver onComplete = new BroadcastReceiver() {
    public void onReceive(Context ctxt, Intent intent) {
        findViewById(R.id.start).setEnabled(true);
    }
};

BroadcastReceiver onNotificationClick = new BroadcastReceiver() {
    public void onReceive(Context ctxt, Intent intent) {
        Toast.makeText(ctxt, "Ummmm...hi!", Toast.LENGTH_LONG).show();
    }
};

使ってみたのはご覧の通り。いくつかのファイルをWebProject -> WebContent *に入れると、ダウンロードできます*。しかし、サーバー コンピューター内のすべてのファイルにアクセスする必要があります。(ダウンロード マネージャーの要求を処理でき、何らかの方法でファイルをアップロードできるサーブレットを使用する必要があると思いますが、よくわかりません。) Android のダウンロード マネージャーは、 HTTP と HTTPSしか処理できません。

サーバー側を実装したいと思いますが、その方法が本当にわからないので、問題は次のとおりです。ダウンロード マネージャーの要求に対応できる適切なサーバー側を実装するにはどうすればよいでしょうか。

お手数ですが、よろしくお願いいたします。

4

2 に答える 2

0

私の問題に対する簡単な解決策を見つけましたが、あなたの答えに感謝したいと思います!

簡単な解決策:

    File f = new File("d:\\....");
    int length = 0;
    ServletOutputStream op = response.getOutputStream();
    ServletContext context = getServletConfig().getServletContext();
    String mimetype = context.getMimeType("d:\\Zene\\WakaWaka.mp3");

    //
    // Set the response and go!
    //
    //
    response.setContentType((mimetype != null) ? mimetype : "application/octet-stream");
    response.setContentLength((int) f.length());
    response.setHeader("Content-Disposition", "attachment; filename=\"" + "seven-eurotura.cd1.avi" + "\"");

    //
    // Stream to the requester.
    //
    byte[] bbuf = new byte[100];
    DataInputStream in = new DataInputStream(new FileInputStream(f));

    while ((in != null) && ((length = in.read(bbuf)) != -1)) {
        op.write(bbuf, 0, length);
    }
于 2013-04-07T21:14:16.460 に答える
0

Web サービスを作成します。Jerseyのようなフレームワークを使用して、ダウンロード要求を処理できます。リクエストには、クライアントが必要とするファイルをサービスが判断するのに役立つパス / クエリ パラメータを含めることができます。また、いくつかの方法で認証を提供できます。

バックエンドに関しては、信頼性が問題にならない場合は、ファイルを共通のディスクに保存できます。または、ネットワーク ストレージ デバイスを使用してファイルを保存することもできます。Amazon S3などのサードパーティにアップロードして、ファイルのダウンロード リンクをクライアントに提供することもできます。そのため、このサービスはダウンロード リンクを発見する手段として機能します。ファイル自体をホストしません。

好きなのを選びな。

于 2013-04-06T08:40:42.783 に答える