【问题标题】:Android DownloadManager not working when redirected重定向时Android DownloadManager不工作
【发布时间】:2012-10-31 02:50:18
【问题描述】:

我正在开发一个应用程序,该应用程序将在通过 oAuth 2 进行身份验证后通过 Rails Heroku 服务器下载存储在 Amazon S3 上的 zip 文件。流程如下:

  1. 请求通过运行在 Heroku 上的服务器进行身份验证 oAuth2。
  2. 接收 oAuth2 访问令牌。
  3. 请求从服务器下载 zip 文件(通过 oAuth 令牌作为承载)。
  4. 服务器授权请求并重定向到 Amazon S3 包含过期签名的 URL(以阻止任何人下载 内容未经身份验证)。

此时,我希望 DownloadManager 遵循重定向并从 S3 获取 zip 文件,但它失败了。有什么办法可以解决这个问题吗?还是仅仅是 DownloadManager 的限制?

我是 Android 新手,还没有完全掌握最好的调试方法,所以我没有太多的输出可以向您展示。但是,DownloadManager.COLUMN_STATUS == DownloadManager.STATUS_FAILEDDownloadManager.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);

}   

【问题讨论】:

  • 使用 Log 类记录事件并再次检查您的步骤。你是如何实现 oAuth2 的?可能有问题,我想获取亚马逊的网址。我有 oAuth2+AmazonS3+DownloadManager 在项目中一起工作。
  • 您好,感谢您的回复 :) 我使用了 Log 并检查了 Heroku 日志以确认 oAuth 部分工作正常。服务器肯定会将下载管理器重定向到带有过期令牌的 S3 URL。但是,经理似乎在重定向后遇到了问题。我将编辑我的问题以包含代码,以便您查看是否有任何错误。

标签: android download download-manager


【解决方案1】:

我在Download Manager sources(第 500 行)中找到了:

3xx:重定向(下载管理器不使用)

目前还不支持。

在我当前的项目中,下载分两步进行:

  1. 通过 oAuth2 从我们自己的服务器获取 Amazon url
  2. 使用 Amazon url 将 DownloadManager 加入队列。

如果你不喜欢这两个步骤的过程,我不喜欢,然后看看RoboSpice 项目,它与 DownloadManager 的理念相似。

【讨论】:

    【解决方案2】:

    只回答这个问题的一部分。之所以将原因作为“占位符”字符串,是因为原因列是整数,而不是字符串。见Android DownloadManager: Download fails, but COLUMN_REASON only returns “placeholder”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-03
      • 2013-09-20
      相关资源
      最近更新 更多