2

私は、oAuth 2を介して認証した後、RailsHerokuサーバーを介してAmazonS3に保存されているzipファイルをダウンロードするアプリに取り組んでいます。フローは次のとおりです。

  1. oAuth2を介してHerokuで実行されているサーバーで認証を要求します。
  2. oAuth2アクセストークンを受け取ります。
  3. サーバーからzipファイルをダウンロードするように要求します(oAuthトークンをベアラーとして渡します)。
  4. サーバーはリクエストを承認し、期限切れの署名を含むAmazon S3 URLにリダイレクトします(認証されずにコンテンツをダウンロードするのを防ぐため)。

この時点で、DownloadManagerがリダイレクトに従い、S3からzipファイルを取得するようにしたいのですが、失敗します。これを回避する方法はありますか?それとも、DownloadManagerの単なる制限ですか?

私はAndroidを初めて使用しますが、まだ完全に最良のデバッグ方法を理解しているわけではないので、表示する出力はあまりありません。しかし、それは「プレースホルダー」を返しDownloadManager.COLUMN_STATUS == DownloadManager.STATUS_FAILEDているようです!DownloadManager.COLUMN_REASON

編集-これが私が使用しているコードです。クライアントなどを非表示にするように編集...

    @Override
public void onListItemClick(ListView l, View v, int position, long id) {
    Log.i("ChapterListActivity", "Item clicked: " + id);


    final DownloadManager downloadManager = (DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE);

    Uri uri = Uri.parse("http://myapphere.herokuapp.com/api/v1/volumes/2.zip");

    DownloadManager.Request request = new Request(uri);

    String accessToken = getSharedPreferences("keyhere", MODE_PRIVATE).getString("access_token", null); 

    Log.i("SLEChapterListActivity", "Getting file with access token... " + accessToken);

    request.addRequestHeader("Authorization", "Bearer " + accessToken);
    long reference = downloadManager.enqueue(request);

    IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);

    BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            long downloadReference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
            Log.i("ChapterListActivity", "Download completed");


            Query query = new Query();
            query.setFilterById(downloadReference);

            Cursor cur = downloadManager.query(query);

            if (cur.moveToFirst()) {
            int columnIndex = cur.getColumnIndex(DownloadManager.COLUMN_STATUS);
            if (DownloadManager.STATUS_SUCCESSFUL == cur.getInt(columnIndex)) {
                String uriString = cur.getString(cur.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));

                File mFile = new File(Uri.parse(uriString).getPath());

            } else if (DownloadManager.STATUS_FAILED == cur.getInt(columnIndex)){
                String statusResult = cur.getString(cur.getColumnIndex(DownloadManager.COLUMN_REASON));
                Toast.makeText(context, "FAILED " + statusResult, Toast.LENGTH_SHORT).show();
            } else if (DownloadManager.ERROR_TOO_MANY_REDIRECTS == cur.getInt(columnIndex)){
                String statusResult = cur.getString(cur.getColumnIndex(DownloadManager.COLUMN_REASON));
                Toast.makeText(context, "TOO MANY REDIRS " + statusResult, Toast.LENGTH_SHORT).show();
            }
        }
        }
    };

    registerReceiver(receiver, filter);

}   
4

2 に答える 2

4

ダウンロードマネージャーのソース(500行目)で見つけました:

3xx:リダイレクト(ダウンロードマネージャーでは使用されません)

まだサポートされていません。

私の現在のプロジェクトでは、ダウンロードは2つのステップで行われます。

  1. oAuth2を介して独自のサーバーからAmazonのURLを取得します
  2. DownloadManagerをAmazonURLでエンキューします。

2段階のプロセスが気に入らない場合は、気に入らないので、RoboSpiceプロジェクトを見てください。DownloadManagerと同様の哲学があります。

于 2012-11-03T20:03:15.510 に答える
1
于 2013-05-09T19:08:28.397 に答える