这是我的问题。我正试图通过Asynctask使用download manager intent从服务器下载文件。在我的asynctask类的doInBackground中,我调用download manager intent,当下载完成(成功或失败)时,doInBackground将返回布尔值。这是我的密码
protected Boolean doInBackground(String... f_url) {
boolean flag = true;
boolean downloading =true;
try{
DownloadManager mManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
Request mRqRequest = new Request(
Uri.parse("http://"+model.getDownloadURL()));
long idDownLoad=mManager.enqueue(mRqRequest);
DownloadManager.Query query = null;
query = new DownloadManager.Query();
Cursor c = null;
if(query!=null) {
query.setFilterByStatus(DownloadManager.STATUS_FAILED|DownloadManager.STATUS_PAUSED|DownloadManager.STATUS_SUCCESSFUL|
DownloadManager.STATUS_RUNNING|DownloadManager.STATUS_PENDING);
} else {
return flag;
}
c = mManager.query(query);
if(c.moveToFirst()) {
int status =c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
while (downloading)
{ Log.i ("FLAG","Downloading");
if (status==DownloadManager.STATUS_SUCCESSFUL)
{ Log.i ("FLAG","done");
downloading = false;
flag=true;
break;
}
if (status==DownloadManager.STATUS_FAILED)
{Log.i ("FLAG","Fail");
downloading = false;
flag=false;
break;
}
c.moveToFirst();
}
}
return flag;
}
catch (Exception e)
{
flag = false;
return flag;
}
}
但DownloadManager状态永远不会跳到DownloadManager上。状态\u成功或下载管理器。你失败了。
以异步方式下载管理器下载文件。所以不需要将下载管理器放入Asynasks中。
如果下载完成,您可以使用接收器获取下载管理器的状态。
public class CheckDownloadComplete extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String action = intent.getAction();
if (action.equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE))
{
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterById(intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0));
DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
Cursor cursor = manager.query(query);
if (cursor.moveToFirst()) {
if (cursor.getCount() > 0) {
int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
Long download_id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID,0);
// status contain Download Status
// download_id contain current download reference id
if (status == DownloadManager.STATUS_SUCCESSFUL)
{
String file = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
//file contains downloaded file name
// do your stuff here on download success
}
}
}
cursor.close();
}
}
}
别忘了在舱单中添加收件人
<receiver
android:name=".CheckDownloadComplete"
android:enabled="true"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
</intent-filter>
</receiver>
您必须重新询问下载管理器。即使数据发生变化,光标也保持不变。试着这样做:
protected Boolean doInBackground(String... f_url) {
boolean flag = true;
boolean downloading =true;
try{
DownloadManager mManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
Request mRqRequest = new Request(
Uri.parse("http://"+model.getDownloadURL()));
long idDownLoad=mManager.enqueue(mRqRequest);
DownloadManager.Query query = null;
query = new DownloadManager.Query();
Cursor c = null;
if(query!=null) {
query.setFilterByStatus(DownloadManager.STATUS_FAILED|DownloadManager.STATUS_PAUSED|DownloadManager.STATUS_SUCCESSFUL|DownloadManager.STATUS_RUNNING|DownloadManager.STATUS_PENDING);
} else {
return flag;
}
while (downloading) {
c = mManager.query(query);
if(c.moveToFirst()) {
Log.i ("FLAG","Downloading");
int status =c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
if (status==DownloadManager.STATUS_SUCCESSFUL) {
Log.i ("FLAG","done");
downloading = false;
flag=true;
break;
}
if (status==DownloadManager.STATUS_FAILED) {
Log.i ("FLAG","Fail");
downloading = false;
flag=false;
break;
}
}
}
return flag;
}catch (Exception e) {
flag = false;
return flag;
}
}
不需要Async任务或同步查询。DownloadManager已经是异步的。您应该为ACTION_DOWNLOAD_COMPLETE注册一个BroadcastRecencer,以便在下载完成(或失败)时收到通知。
http://blog.vogella.com/2011/06/14/android-downloadmanager-example有一个很好的例子
我对API请求有一个奇怪的问题。问题是使用或浏览器时,我使用的url工作正常。但使用异步服务程序时,URL会失败并返回状态代码404。 下面是我的代码:我已经构建了一个异步下载函数: 注意:令牌将过期。 使用很好。但使用我自己的函数会产生: 使用my功能下载其他内容也很好。 那么有人知道为什么服务器在尝试异步访问时返回404吗? 我之前的问题被关闭了,因为你们中的一些人认为这是一个类似的问题:但是
因此,在下载和打开文件之间的某个位置,我需要一个if语句来检查它是应该继续还是等待文件。
我正在尝试下载一个文件到目录,可以根据用户选择的任何目录变化。我将当前目录存储在一个file对象中,现在正在尝试下载该文件。文件下载,但它不下载指定的目录。那么,我可以做什么来获得所选目录中的文件。 传递给文件构造函数的名为url的字符串包含url。只是用它来检索文件名。 更新:我刚找到文件。它在手机里而不是sd卡里。它就在这个文件夹里,存储\仿真\00。不知道为什么?另外,我得到的绝对路径是St
比如说,我正在开发一个聊天应用程序,可以与其他人共享任何类型的文件(没有mimetype限制):比如图像、视频、文档,但也可以共享压缩文件,比如zip、rar、apk,或者更不常见的文件类型,比如photoshop或autocad文件。 在Android9或更低版本中,我直接将这些文件下载到下载目录,但在Android10中,如果不向用户显示下载它们的意图,就不可能做到这一点。。。 不可能的但为什
问题内容: 我想从网址下载二进制文件。是否可以使用我在DownloadManager类中找到的Android下载管理器类? 问题答案: 是否可以使用我在这里找到的android下载管理器类 是的,尽管仅从Android API级别9(版本2.3)开始可用。这是一个示例项目,演示的使用。
控制从远程源的文件下载。 进程: 主进程 DownloadItem(下载项)是一个在Electron中展示下载项的EventEmitter 它被用于 Session类中的 will-download事件,并允许用户控制下载项。 1 //主进程中 2 const {BrowserWindow} = require('electron') 3 let win = new BrowserWindow