我正在开发一个应用程序,在通过oauth 2认证后,它将通过rails heroku服务器下载存储在amazon s3上的zip文件。流程如下:
请求通过
非统组织2。
接收OAuth2访问令牌。
请求从服务器下载zip文件(传递
作为承载者的OAuth令牌)。
服务器授权请求并重定向到amazon s3
包含过期签名的URL(以阻止任何人下载
内容未经验证)。
在这一点上,我希望downloadmanager只遵循重定向并从s3获取zip文件,但是它失败了。我有办法解决这个问题吗?或者只是下载管理器的一个限制?
我是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);
}
最佳答案
我在Download Manager sources中发现(第500行):
3xx:重定向(下载管理器未使用)
现在还不支持。
在我当前的项目中,下载分为两个步骤:
通过oauth2从我们自己的服务器获取amazon url
使用amazon url将downloadmanager排队。
如果你不喜欢这两个步骤的过程,我不喜欢,那么看看RoboSpice项目,它与downloadmanager有着相似的理念。
关于android - 重定向时Android DownloadManager无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13150587/