2012-05-05 6 views
0

urlの配列をとるコードをいくつか持っていますが、ファイル名には1つあります。 URLは非同期のダウンロードタスクに送られ、ファイル名はSDカードにどのように命名され、保存されるのかということになっています。私はスピナーから選択されたファイルをダウンロードしようとしますが、SDカードにはまったく保存されません。また、私の進捗バーには表示されませんが表示されますが、ゼロにとどまります。私がそれをダウンロードしようとしていると仮定している唯一の理由は、ファイルのプログレスバー上にある時間の長さのためです。ここでLogCatに印刷例外を除いてAndroid - Spinner Asyncのダウンロードファイルは保存されません

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

必要な権限を使用しましたか?ログキャットに例外がありますか? –

+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はファイル名の配列で、1つのファイル名が必要です。必要なのはをDownloadFileコンストラクタ経由で渡すことです。このようなもの:

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私はあなたを助けてうれしいです:) –

関連する問題