java - Android - Spinner 异步下载文件不保存

标签 java android pdf download spinner

我有一些代码需要一组 url,并且我有一个用于文件名的代码。 URL 被输入到异步下载任务中,文件名应该是它们在 SD 卡上的命名和保存方式。我相信它会尝试下载从微调器中选择的文件,但它们根本没有保存在 SD 卡上。另外,我的进度条似乎没有填充,它显示但保持为零。我假设它尝试下载的唯一原因是它在文件进度条上停留的时间长度,有的长有的短。

这是代码:

public class SpinnerActivity extends Activity {

public static final int DIALOG_DOWNLOAD_PROGRESS = 0;
private ProgressDialog mProgressDialog;

Spinner spDownloadFrom;
private ArrayAdapter<CharSequence> spinnerArrayAdapter;
String url[] = {"http://www.becker.cl/bases.pdf",
        "http://www.pitt.edu/documents/campusmap0607.pdf", "http://www.aara.ca/reg3317/web_page_doc.pdf",
        "www.dataprotection.ie/documents/guidance/GuidanceFinance.pdf", "http://www.fmbb2012.com/JumpingQualifica1.pdf",
        "http://www.consulatdumaroc.ca/coloniefh22012.pdf", "http://www.rgrdlaw.com/media/cases/140_Complaint.pdf" };
String name[] = {"bases.pdf", "campusmap0607.pdf", "web_page_doc.pdf", "GuidanceFinance.pdf",
        "JumpingQualifica1.pdf", "coloniefh22012.pdf", "140_Complaint.pdf", };

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mProgressDialog = new ProgressDialog(SpinnerActivity.this);
    mProgressDialog.setMessage("Please be patient, file downloading...");
    mProgressDialog.setIndeterminate(false);
    mProgressDialog.setMax(100);
    mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

    spDownloadFrom = (Spinner) findViewById(R.id.Spinner01);

    spinnerArrayAdapter = new ArrayAdapter<CharSequence>(this,
            android.R.layout.simple_spinner_item, name);
    spinnerArrayAdapter
            .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spDownloadFrom.setAdapter(spinnerArrayAdapter);

    spDownloadFrom.setOnItemSelectedListener(new SpinnerListener(
            spDownloadFrom));
}

public class SpinnerListener implements OnItemSelectedListener {
    Spinner sp;

    public SpinnerListener(View v) {
        sp = (Spinner) findViewById(v.getId());
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View v, int arg2,
            long arg3) {
        // Call to download class
        startDownload(arg2);


    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub

    }
}

private void startDownload(int position) {
    DownloadFile downloadFile = new DownloadFile();
    downloadFile.execute(url[position]);
}

class DownloadFile extends AsyncTask<String, Integer, String> { // put your
                                                                // download
                                                                // code

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        mProgressDialog.show();
    }

    @Override
    protected void onProgressUpdate(Integer... progress) {
        super.onProgressUpdate(progress);
        mProgressDialog.setProgress(progress[0]);
    }

    @Override
    protected String doInBackground(String... aurl) {
        try {

            URL url = new URL(aurl[0]);
            URLConnection connection = url.openConnection();

            connection.connect();
            int fileLength = connection.getContentLength();
            int tickSize = 2 * fileLength / 100;
            int nextProgress = tickSize;

            Log.d(

            "ANDRO_ASYNC", "Lenght of file: " + fileLength);

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

            String path = Environment.getExternalStorageDirectory()
                    + "/Android/Data/"
                    + getApplicationContext().getPackageName() + "/files/" + name;
            File file = new File(path);
            file.mkdirs();
            File outputFile = file;

            OutputStream output = new FileOutputStream(outputFile);

            byte data[] = new byte[1024 * 1024];
            long total = 0;
            int count;
            while ((count = input.read(data)) != -1) {
                total += count;
                if (total >= nextProgress) {
                    nextProgress = (int) ((total / tickSize + 1) * tickSize);
                    this.publishProgress((int) (total * 100 / fileLength));
                }
                output.write(data, 0, count);
            }

            output.flush();
            output.close();
            input.close();
            mProgressDialog.dismiss();

        } catch (Exception e) {
        }
        return null;
    }

    protected void onProgressUpdate(String... progress) {
        Log.d("Downloading", progress[0]);

    }

    @Override
    protected void onPostExecute(String unused) {

        mProgressDialog.dismiss();

        File file = new File(Environment.getExternalStorageDirectory()
                + "/Android/Data/"
                + getApplicationContext().getPackageName()
                + "/files/" + name);
        Intent testIntent = new Intent(Intent.ACTION_VIEW);
        testIntent.setType("application/pdf");
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        Uri uri = Uri.fromFile(file);
        intent.setDataAndType(uri, "application/pdf");
        try {
            startActivity(intent);
        } catch (ActivityNotFoundException e) {
            Toast.makeText(SpinnerActivity.this,
                    "No Application Available to View PDF",
                    Toast.LENGTH_LONG).show();
        }
    }
}
}

除了打印到 LogCat 之外,以下是收到的错误:

05-06 00:23:39.087: E/Spinner(13841): exception
05-06 00:23:39.087: E/Spinner(13841): java.io.FileNotFoundException:     /mnt/sdcard/Android/Data/com.hellospinner/files/[Ljava.lang.String;@40517468 (Is a     directory)
05-06 00:23:39.087: E/Spinner(13841):   at     org.apache.harmony.luni.platform.OSFileSystem.open(Native Method)
05-06 00:23:39.087: E/Spinner(13841):   at     dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:232)
05-06 00:23:39.087: E/Spinner(13841):   at java.io.FileOutputStream.<init>    (FileOutputStream.java:94)
05-06 00:23:39.087: E/Spinner(13841):   at java.io.FileOutputStream.<init>    (FileOutputStream.java:66)
05-06 00:23:39.087: E/Spinner(13841):   at     com.hellospinner.SpinnerActivity$DownloadFile.doInBackground(SpinnerActivity.java:    131)
05-06 00:23:39.087: E/Spinner(13841):   at     com.hellospinner.SpinnerActivity$DownloadFile.doInBackground(SpinnerActivity.java:    1)
05-06 00:23:39.087: E/Spinner(13841):   at     android.os.AsyncTask$2.call(AsyncTask.java:185)
05-06 00:23:39.087: E/Spinner(13841):   at     java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
05-06 00:23:39.087: E/Spinner(13841):   at     java.util.concurrent.FutureTask.run(FutureTask.java:138)
05-06 00:23:39.087: E/Spinner(13841):   at     java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
05-06 00:23:39.087: E/Spinner(13841):   at     java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
05-06 00:23:39.087: E/Spinner(13841):   at java.lang.Thread.run(Thread.java:1019)

固定代码:

public class SpinnerActivity extends Activity {

public static final int DIALOG_DOWNLOAD_PROGRESS = 0;
private ProgressDialog mProgressDialog;

Spinner spDownloadFrom;
private ArrayAdapter<CharSequence> spinnerArrayAdapter;
String url[] = {
        "http://www.becker.cl/bases.pdf",
        "http://www.pitt.edu/documents/campusmap0607.pdf",
        "http://www.aara.ca/reg3317/web_page_doc.pdf",
        "http://www.dataprotection.ie/documents/guidance/GuidanceFinance.pdf",
        "http://www.fmbb2012.com/JumpingQualifica1.pdf",
        "http://www.consulatdumaroc.ca/coloniefh22012.pdf",
        "http://www.rgrdlaw.com/media/cases/140_Complaint.pdf" };
String name[] = { "bases.pdf", "campusmap0607.pdf", "web_page_doc.pdf",
        "GuidanceFinance.pdf", "JumpingQualifica1.pdf",
        "coloniefh22012.pdf", "140_Complaint.pdf", };

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mProgressDialog = new ProgressDialog(SpinnerActivity.this);
    mProgressDialog.setMessage("Please be patient, file downloading...");
    mProgressDialog.setIndeterminate(false);
    mProgressDialog.setMax(100);
    mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

    spDownloadFrom = (Spinner) findViewById(R.id.Spinner01);

    spinnerArrayAdapter = new ArrayAdapter<CharSequence>(this,
            android.R.layout.simple_spinner_item, name);
    spinnerArrayAdapter
            .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spDownloadFrom.setAdapter(spinnerArrayAdapter);

    spDownloadFrom.setOnItemSelectedListener(new SpinnerListener(
            spDownloadFrom));
}

public class SpinnerListener implements OnItemSelectedListener {
    Spinner sp;

    public SpinnerListener(View v) {
        sp = (Spinner) findViewById(v.getId());
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View v, int arg2,
            long arg3) {
        // Call to download class
        startDownload(arg2);

    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub

    }
}

private void startDownload(int position) {
    DownloadFile downloadFile = new DownloadFile(position);
    downloadFile.execute(url[position]);
}

class DownloadFile extends AsyncTask<String, Integer, String> { // put your
                                                                // download
                                                                // code
    private int position;

    public DownloadFile(int position) {
        this.position = position;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        mProgressDialog.show();
    }

    @Override
    protected void onProgressUpdate(Integer... progress) {
        super.onProgressUpdate(progress);
        mProgressDialog.setProgress(progress[0]);
    }

    @Override
    protected String doInBackground(String... aurl) {
        try {

            URL url = new URL(aurl[0]);
            URLConnection connection = url.openConnection();

            connection.connect();
            int fileLength = connection.getContentLength();
            int tickSize = 2 * fileLength / 100;
            int nextProgress = tickSize;

            Log.d(

            "ANDRO_ASYNC", "Lenght of file: " + fileLength);

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

            String path = Environment.getExternalStorageDirectory()
                    + "/Android/Data/"
                    + getApplicationContext().getPackageName() + "/files/";
            File file = new File(path);
            file.mkdirs();
            File outputFile = new File(file, name[position]);

            OutputStream output = new FileOutputStream(outputFile);

            byte data[] = new byte[1024 * 1024];
            long total = 0;
            int count;
            while ((count = input.read(data)) != -1) {
                total += count;
                if (total >= nextProgress) {
                    nextProgress = (int) ((total / tickSize + 1) * tickSize);
                    this.publishProgress((int) (total * 100 / fileLength));
                }
                output.write(data, 0, count);
            }

            output.flush();
            output.close();
            input.close();
            mProgressDialog.dismiss();

        } catch (Exception e) {
            Log.e("Spinner", "exception", e);
        }
        return null;
    }

    protected void onProgressUpdate(String... progress) {
        Log.d("Downloading", progress[0]);

    }

    @Override
    protected void onPostExecute(String unused) {

        mProgressDialog.dismiss();

        File file = new File(Environment.getExternalStorageDirectory()
                + "/Android/Data/"
                + getApplicationContext().getPackageName() + "/files/"
                + name[position]);
        Intent testIntent = new Intent(Intent.ACTION_VIEW);
        testIntent.setType("application/pdf");
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        Uri uri = Uri.fromFile(file);
        intent.setDataAndType(uri, "application/pdf");
        try {
            startActivity(intent);
        } catch (ActivityNotFoundException e) {
            Toast.makeText(SpinnerActivity.this,
                    "No Application Available to View PDF",
                    Toast.LENGTH_LONG).show();
        }
    }
}
}

最佳答案

问题来自这一行:

String path = Environment.getExternalStorageDirectory()
                + "/Android/Data/"
                + getApplicationContext().getPackageName() + "/files/" + name;
//                                                                         ^

name 是一个文件名数组,而您想要的是单个文件名。您需要的是通过 DownloadFile 构造函数传递 position 。像这样的事情:

private void startDownload(int position) {
    DownloadFile downloadFile = new DownloadFile(position);
    downloadFile.execute(url[position]);
}

class DownloadFile extends AsyncTask<String, Integer, String>
{
    private int position:

    public DownloadFile(int position){this.position = position;}

    // ...

    String path = Environment.getExternalStorageDirectory()
                + "/Android/Data/"
                + getApplicationContext().getPackageName() + "/files/" + name[position];
    // ...
}

关于java - Android - Spinner 异步下载文件不保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10466963/

相关文章:

java - 写入 XML 文件

java - 我的代码中每个商品的数量结果有什么问题?

java - glsl 中的操作 '*' 类型错误?

java - 服务器响应(JSON 格式)到数组转换

Android 从 WCF 获取返回值

java - 截断/紧凑 PDF417 矩阵

asp.net - SharePoint - 在新窗口中打开文档库 PDF

java - 使用 jdbctemplate/jdbc for Hana db 获取按序列生成的主键

android - 3.0内核中的wakelock核心代码和接口(interface)与3.7/3.8有何区别?

javascript - jsPDF输出PDF下载