Android DownloadManager 重定向时不工作

标签 android download download-manager

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

  1. 请求通过 Heroku 上运行的服务器进行身份验证 oAuth2。
  2. 接收 oAuth2 访问 token 。
  3. 请求从服务器下载 zip 文件(传递 oAuth token 作为承载)。
  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);

}   

最佳答案

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

3xx: redirects (not used by the download manager)

尚不支持。

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

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

如果您不喜欢这两个步骤,我也不喜欢,那么请查看 RoboSpice项目,它与 DownloadManager 具有相似的理念。

关于Android DownloadManager 重定向时不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13150587/

相关文章:

java - 使用 urlConnection.getOutputStream() 获取主机时出现问题;在我的真实设备上

android - 如何通过java代码触发上拉刷新并显示其加载动画?

java - Android - 如何判断 db.execSQL 在 onCreate 上是否成功

asp.net-mvc - ASP.NET MVC 3 文件下载 : Not Working in IE8

Android WebView 无法在 UIDAI/Aadhaar 网站上的 DownloadStart 上下载文件

android - 覆盖 Android 上的硬件按钮

php - 使用 PHP 下载文件。如何获取文件名?

asp.net - 在 ASP.NET 中下载文件而不弹出窗口

android - 在 Android 的 DownloadManager 中设置请求正文?

javascript - 将下载链接从网络浏览器传递到第三方应用程序