2012-05-05 62 views
0

我有一些代码需要一个url的数组,我有一个文件名。该网址被送入一个异步下载任务,文件名应该是它们如何命名并保存在SD卡上。我相信它试图从微调器中选择下载文件,但它们根本没有保存在SD卡上。此外,看起来我的进度条没有填充,它显示出来但是保持为零。我假设它正在尝试下载的唯一原因是因为它在文件的进度条上的时间长度,有些长度有些短。Android - 微调异步下载文件不保存

下面是代码:

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(); 
     } 
    } 
} 
} 
+0

您是否使用了所需的权限? logcat上是否有任何异常? –

+0

弹出给我的第一件事是,你完全忽略了文件io方法抛出的任何异常。您应该将异常输出到logcat,以便您可以看到错误消息。 – JesusFreke

+0

@ Eng.Fouad - 是的,我有权限,并且对你和@JesusFreke,我收到LogCat中的错误 - 帖子已被编辑。如何更改“[Ljava.lang.String; @ 40517468”只显示xxx.pdf? – user1363871

回答

2

的问题来自此行:

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]; 
    // ... 
} 
+0

没问题,一切都解决了。感谢您的帮助一切都很好 - 为任何有类似问题的人添加了正确的代码。 – user1363871

+0

@ user1363871我很高兴帮助你:) –