【发布时间】:2012-10-31 02:50:18
【问题描述】:
我正在开发一个应用程序,该应用程序将在通过 oAuth 2 进行身份验证后通过 Rails Heroku 服务器下载存储在 Amazon S3 上的 zip 文件。流程如下:
- 请求通过运行在 Heroku 上的服务器进行身份验证 oAuth2。
- 接收 oAuth2 访问令牌。
- 请求从服务器下载 zip 文件(通过 oAuth 令牌作为承载)。
- 服务器授权请求并重定向到 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);
}
【问题讨论】:
-
使用 Log 类记录事件并再次检查您的步骤。你是如何实现 oAuth2 的?可能有问题,我想获取亚马逊的网址。我有 oAuth2+AmazonS3+DownloadManager 在项目中一起工作。
-
您好,感谢您的回复 :) 我使用了 Log 并检查了 Heroku 日志以确认 oAuth 部分工作正常。服务器肯定会将下载管理器重定向到带有过期令牌的 S3 URL。但是,经理似乎在重定向后遇到了问题。我将编辑我的问题以包含代码,以便您查看是否有任何错误。
标签: android download download-manager