2012-05-05 3 views
0

URL 배열을 사용하는 코드가 하나 있는데 파일 이름이 하나 있습니다. URL은 비동기 다운로드 작업으로 보내지며 파일 이름은 SD 카드에 이름이 지정되고 저장되는 방식으로되어 있습니다. 나는 그들이 회 전자에서 선택한 파일을 다운로드하려고하지만 그들은 전혀 SD 카드에 저장되지 않습니다 믿습니다. 또한 진행률 막대가 채워지지 않고 나타나지만 0으로 유지됩니다. 내가 다운로드를 시도하고 있다고 가정하는 유일한 이유는 파일의 진행률 표시 줄에 약간의 시간이 소요되기 때문입니다. 예외 인쇄와안드로이드 - Spinner 비동기 다운로드 파일 저장 안 함

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

여기에 로그 캣 할 수있는 오류를 받았다 있습니다 :

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은 파일 이름의 배열이며 원하는 것은 단일 파일 이름입니다. 필요한 것은 positionDownloadFile 생성자를 통해 전달하는 것입니다. 다음과 같은 내용 :

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 도와 드리겠습니다. :) –

관련 문제