-1

アプリにURLからビデオをダウンロードさせたい。今のところ、ファイルをSDカードに書き込みダウンロードします。

android.os.NetworkOnMainThreadExceptionいくつかの異なるスクリプトを試しましたが、例外はありません。しかし、私のアプリケーションはクラッシュします。 Androidでプログラム的にファイルをダウンロードするAndroidで プログラム的にネットからファイルをダウンロードする最良の方法は何ですか?

誰かが実用的なメソッドを作成する方法を知っていますか?この例外を解決するには、非同期タスクである必要があります。

public static void downloadFile(String url, File outputFile) {
        try {
              URL u = new URL(url);
              URLConnection conn = u.openConnection();
              int contentLength = conn.getContentLength();

              DataInputStream stream = new DataInputStream(u.openStream());

                byte[] buffer = new byte[contentLength];
                stream.readFully(buffer);
                stream.close();

                DataOutputStream fos = new DataOutputStream(new FileOutputStream(outputFile));
                fos.write(buffer);
                fos.flush();
                fos.close();
          } catch(Exception e) {
              Log.e("theple", "" + e);
          } 
    }

ログ:

03-14 12:09:46.535: E/theple(6987): android.os.NetworkOnMainThreadException
4

2 に答える 2

0

私はそれを機能させました、とにかく助けのためにthx。

私のコード:

public class FileDownloader extends AsyncTask<String, Integer, String>
{

    @Override
    protected String doInBackground(String... params)
    {
        try {
              URL u = new URL(params[0]);
              URLConnection conn = u.openConnection();
              int contentLength = conn.getContentLength();

              DataInputStream stream = new DataInputStream(u.openStream());

                byte[] buffer = new byte[contentLength];
                stream.readFully(buffer);
                stream.close();

                DataOutputStream fos = new DataOutputStream(new FileOutputStream(new File(params[1])));
                fos.write(buffer);
                fos.flush();
                fos.close();
          } catch(Exception e) {
              Log.e("theple", "" + e);
          } 
        return null;
    }
}
于 2013-03-14T12:04:56.687 に答える
0

ダウンロードを実行する方法はたくさんありますが、そのためのメソッドを作成するにもかかわらず、「スレッド、非同期クラスまたはサービス」を使用する必要があります。そのエラー「メインスレッドのネットワークはプロセスに時間がかかっているために発生します」。

非同期タスクサービスの使用例を示しています

*

*class DownloadFile extends AsyncTask<String, Integer, String> {
    @Override
    protected String doInBackground(String... sUrl) {
        try {
            URL url = new URL(sUrl[0]);
            URLConnection connection = url.openConnection();
            connection.connect();
            // this will be useful so that you can show a typical 0-100% progress bar
            int fileLength = connection.getContentLength();
            // download the file
            InputStream input = new BufferedInputStream(url.openStream());
            OutputStream output = new FileOutputStream("/sdcard/file_name.extension");
            byte data[] = new byte[1024];
            long total = 0;
            int count;


            while ((count = input.read(data)) != -1) {
                total += count;
                // publishing the progress....
                publishProgress((int) (total * 100 / fileLength));
                output.write(data, 0, count);
            }
            output.flush();
            output.close();
            input.close();
        } catch (Exception e) {
        }
        return null;
    }** 


And With Service 

you can use : 



   class DownloadService extends IntentService {
        public static final int UPDATE_PROGRESS = 8344;
        public DownloadService() {
            super("DownloadService");
        }
        @Override
        protected void onHandleIntent(Intent intent) {
            String urlToDownload = intent.getStringExtra("url");
            ResultReceiver receiver = (ResultReceiver) intent.getParcelableExtra("receiver");
            try {
                URL url = new URL(urlToDownload);
                URLConnection connection = url.openConnection();
                connection.connect();
                // this will be useful so that you can show a typical 0-100% progress bar
                int fileLength = connection.getContentLength();
                // download the file
                InputStream input = new BufferedInputStream(url.openStream());
                OutputStream output = new FileOutputStream("/sdcard/BarcodeScanner-debug.apk");
                byte data[] = new byte[1024];
                long total = 0;
                int count;
                while ((count = input.read(data)) != -1) {
                    total += count;
                    // publishing the progress....
                    Bundle resultData = new Bundle();
                    resultData.putInt("progress" ,(int) (total * 100 / fileLength));
                    receiver.send(UPDATE_PROGRESS, resultData);
                    output.write(data, 0, count);
                }
                output.flush();
                output.close();
                input.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            Bundle resultData = new Bundle();
            resultData.putInt("progress" ,100);
            receiver.send(UPDATE_PROGRESS, resultData);
        }
    }

これがお役に立てば幸いです。

于 2014-01-23T05:37:58.820 に答える