无论应用程序状态如何,如何在后台下载文件?

时间:2016-11-23 11:54:38

标签: java c# android unity3d plugins

有关Unity问题的couple times已被问过,但从未接听过。

我需要做的就是创建一个Android pluugin,从给定的网址下载少量文件,并在通知面板中显示下载进度。即使我的Unity应用程序没有聚焦,下载也应该继续。

http://www.cuelogic.com/blog/wp-content/uploads/2013/10/downloadmanager_31230_l.png

以下是我现在的代码:

void DownloadFiles(string[] urls)
{
    foreach(var url in urls)
    {
        StartCoroutine(DownloadFile_CR(url));
    }
}

IEnumerator DownloadFile_CR(string url)
{
    WWW www = new WWW(url);
    while(!www.isDone)
    {
        yield return null;
    }
    if(www.error == null)
    {            
        //file downloaded. do something...
    }
}

这些是一些纹理文件。那么如何从原生的android代码中获取纹理结果?

感谢任何帮助之王。

2 个答案:

答案 0 :(得分:2)

如果你想让它继续,即使团结不在焦点,那么你不能在Unity中使用WWW类在C#中进行。

如果我想这样做,我可能会写一个原生Android插件,开始下载服务

来自官方谷歌文档:

  

服务是一个可以执行长时间运行的应用程序组件   在后台运行,它不提供用户   接口。另一个应用程序组件可以启动服务   即使用户切换到后台,也会继续在后台运行   另一个申请。

服务并不复杂,您可以像使用某项活动一样使用Intent启动它们,并且此类服务有很多在线示例。

以下是有关服务的官方Android文档:https://developer.android.com/guide/components/services.html

答案 1 :(得分:2)

我遇到了同样的问题。起初,我使用了一个在后台运行的服务并下载了我需要的文件,包括计算进度和完整事件。

然后,我使我的插件更简单易用。您创建Java对象的实例,为其提供响应的GameObject名称和方法名称。我使用json来序列化和反序列化java和C#对象,因为只有字符串可以在Unity的MonoBehaviour对象和java对象之间传递。

以下是android插件中downnload的外观:

            Uri Download_Uri = Uri.parse(url);
            DownloadManager.Request request = new DownloadManager.Request(Download_Uri);

            //Restrict the types of networks over which this download may proceed.
            request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);
            //Set whether this download may proceed over a roaming connection.
            request.setAllowedOverRoaming(true);
            //Set the local destination for the downloaded file to a path within the application's external files directory
            String[] split = url.split("/");
            request.setDestinationInExternalFilesDir(activity, null, split[split.length-1]);
            //Set the title of this download, to be displayed in notifications (if enabled).
            request.setTitle("Downloading " + title);
            //Set a description of this download, to be displayed in notifications (if enabled)
            request.setDescription("Downloading " + name);

            request.setVisibleInDownloadsUi(false);

            //Enqueue a new download and get the reference Id
            long downloadReference = downloadManager.enqueue(request);

然后您可以将参考ID发送回统一,这样您就可以获得进度,并在重新启动应用程序后检查文件是否仍在下载(使用SharedPreferences \ PlayerPrefs存储它们)