0

ファイルが存在しない場合にファイルを作成するphpスクリプトがあります。php スクリプトは、作成後にファイルを送信します。今、phpファイルが新しいファイルを作成しているときに、ダウンロードクラスがダウンロードできないという問題があります(正確な理由はわかりません)。ただし、php スクリプトがキャッシュされたファイルを送信する場合、ダウンロードは機能します。PHPスクリプトの実行が完了するまでAndroidを待機させる方法はありますか?

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

import org.json.JSONObject;

import android.os.AsyncTask;
import android.os.Environment;
import android.os.Looper;
import android.provider.ContactsContract.Directory;
import android.util.Log;

public class DownloadMP3 extends AsyncTask<String, Integer, String> {
    private OnTaskRunning listener;
    public DownloadMP3(OnTaskRunning listener){
        this.listener=listener;
    }

    @Override
    protected String doInBackground(String... url) {
        int count;
        try {
            Log.d("Info", "create file");
            Download down = new Download();
            JSONObject jObject = new JSONObject(down.JSON(conf.d + "convert.php?v=" + url[0]));
            Log.d("Info","json file: " + jObject.get("fle"));

            URL u = new URL(conf.d + "convert.php?v=" + jObject.get("fle"));
            Log.d("Info", "dl u");
            URLConnection conexion = u.openConnection();
            Log.d("Info", "dl op");
            conexion.connect();
            Log.d("Info", "dl co");
            File directory = new File(Environment.getExternalStorageDirectory() + "/Music/VBT Splash/");
            Log.d("Info", "dl di");
            if (!directory.exists() || !directory.isDirectory()){
                directory.mkdirs();
            }



            InputStream input = new BufferedInputStream(u.openStream());

            String filename = conexion.getHeaderField("Content-Disposition");

            String file = filename.substring(filename.indexOf("\"")+1, filename.lastIndexOf("\""));

            OutputStream output = new FileOutputStream(Environment.getExternalStorageDirectory() + "/Music/VBT Splash/" + file);

            int lenghtOfFile = conexion.getContentLength();
            byte data[] = new byte[4096];

            long total = 0;

            listener.onTaskStarted();
            while ((count = input.read(data)) != -1) {
                total += count;
                output.write(data, 0, count);
                publishProgress((int) (total * 100 / lenghtOfFile));
            }
            Log.d("Info", "dl done");
            listener.onTaskDone();
            output.flush();
            output.close();
            input.close();
        } catch (Exception e) {
        }
        return null;
    }

    protected void onProgressUpdate(Integer... progress) {
        listener.onTaskProgress(progress[0]);
    }

    protected void onPostExecute(int result) {

    }
}
4

1 に答える 1

1

クライアントコードにリダイレクトを伝える必要があります。フルファイルパスのURLをヒットしただけで、それが存在しない場合、ダウンロードされません。したがって、代わりに、最初にスクリプトからダウンロードURLを取得します。(存在しない場合は新しいものが作成されます)次に、そのURLをダウンロードします。これにより、サーバーに対して合計2つのリクエストが作成されます。

于 2013-01-26T10:37:11.740 に答える