2016-11-23 4 views
1

これはUnity Questionsのcoupletimesと尋ねましたが、決して答えられませんでした。アプリケーションの状態に関係なく、バックグラウンドでファイルをダウンロードする方法は?

私がする必要があるのは、指定されたURLから少数のファイルをダウンロードし、通知パネルにダウンロードの進行状況を示すAndroidプラグインです。 Unityアプリケーションのフォーカスが外れていても、ダウンロードは続行する必要があります。ここで

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

私が今持っているコードのpeiceです:

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... 
    } 
} 

これらは、いくつかのテクスチャファイルです。だから、ネイティブのアンドロイドコードからテクスチャの結果を戻すにはどうすればいいですか?

いずれかの王様が歓迎されます。

答えて

2

私は同じ問題を抱えていました。最初は、バックグラウンドで作業し、必要なファイルをダウンロードしたサービスを使用しました。これには進捗状況と完全なイベントの計算が含まれていました。

次に、プラグインを少しシンプルに使いやすくしました。 Javaオブジェクトのインスタンスを作成し、応答の名前とメソッド名をGameObjectに付けます。 UnityのMonoBehaviourオブジェクトとjavaオブジェクトの間で文字列だけを渡すことができるため、jsonを使用してjavaおよびC#オブジェクトを直列化および逆シリアル化しました。ここで

はdownnloadは、Androidのプラグインでどのように見えるかです:

  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を使用して保存します)

+0

私が心に留めていたものに近いようです。しかし、私は1つ以上のファイルのために行く方法を知りたい。たとえば、ダウンロードするイメージファイルが500あります。また、通知パネルに500個のダウンロードプログレスバー(同時ファイルをダウンロードできる場合)を洪水させたくありません。何とか集団進歩を示すことは可能ですか? Unityでは、ファイルカウントを使用して進捗状況を計算します(100/500ファイルのダウンロード= 20%完了)。最後に、Unityのダウンロードしたファイルにストレージからアクセスする方法はありますか?私はネイティブdevまたはプラグインで多くの経験を持っていないのでnooby質問のお詫び: –

+0

'request.setNotificationVisibility(false)'を追加して、進捗状況を示すあなた自身の通知を入れてください。 – gilgil28

2

ユニティにフォーカスがない場合でも継続したい場合は、WWWクラスのUnityでC#で行うことはできません。

もし私がこれをやりたいのであれば、ダウンロードサービスを開始するネイティブAndroidプラグインを書いているはずです。公式のGoogleドキュメントから

Aサービスは、バックグラウンドで長時間実行 操作を行うことができるアプリケーション・コンポーネントであり、それはユーザ インターフェースを提供しません。別のアプリケーションコンポーネントはサービスを開始することができ、別のアプリケーション に切り替えても、 はバックグラウンドで実行を継続します。は、その複雑ではありません

サービス、あなたはちょうどあなたが活動と同じようにインテントでそれらを起動して、このタイプのサービスのためのオンライン例がたくさんあります。ここで

は、サービスに関する公式のAndroidのドキュメントです:https://developer.android.com/guide/components/services.html

関連する問題