Страница 1 из 1

Загрузка файла из сети, и его выполнение

Добавлено: 30 июл 2013, 19:37
sanu0074
Здравсвуйте, пытаюсь загрузить файл из сети (это файл приложения *.apk), и после загрузки сразу его запустить.
Вот то что накодил, тут есть ошибка в onPostExecute(), в setData()...
До этого пробовал передать file в интент, но нифига не вышло, ошибка вылетала...
Посмотрите, что тут надо подправить?

Код: Выделить всё

	private void downloadFile(String url) {
		  final ProgressDialog progressDialog = new ProgressDialog(this);
		 
		  new AsyncTask<String, Integer, File>() {
		   private Exception m_error = null;
		 
		   @Override
		   protected void onPreExecute() {
		    progressDialog.setMessage("Downloading ...");
		    progressDialog.setCancelable(false);
		    progressDialog.setMax(100);
		    progressDialog
		      .setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
		 
		    progressDialog.show();
		   }
		 
		   @Override
		   protected File doInBackground(String... params) {
		    URL url;
		    HttpURLConnection urlConnection;
		    InputStream inputStream;
		    int totalSize;
		    int downloadedSize;
		    byte[] buffer;
		    int bufferLength;
		 
		    File file = null;
		    FileOutputStream fos = null;
		 
		    try {
		     url = new URL(params[0]);
		     urlConnection = (HttpURLConnection) url.openConnection();
		 
		     urlConnection.setRequestMethod("GET");
		     urlConnection.setDoOutput(true);
		     urlConnection.connect();
		 
		     file = File.createTempFile("Mustachify", "download");
		     fos = new FileOutputStream(file);
		     inputStream = urlConnection.getInputStream();
		 
		     totalSize = urlConnection.getContentLength();
		     downloadedSize = 0;
		 
		     buffer = new byte[1024];
		     bufferLength = 0;
		 
		     // читаем со входа и пишем в выход, 
		     // с каждой итерацией публикуем прогресс
		     while ((bufferLength = inputStream.read(buffer)) > 0) {
		      fos.write(buffer, 0, bufferLength);
		      downloadedSize += bufferLength;
		      publishProgress(downloadedSize, totalSize);
		     }
		 
		     fos.close();
		     inputStream.close();
		 
		     return file;
		    } catch (MalformedURLException e) {
		     e.printStackTrace();
		     m_error = e;
		    } catch (IOException e) {
		     e.printStackTrace();
		     m_error = e;
		    }
		 
		    return null;
		   }
		 
		   // обновляем progressDialog
		   protected void onProgressUpdate(Integer... values) {
		    progressDialog
		      .setProgress((int) ((values[0] / (float) values[1]) * 100));
		   };
		 
		   @Override
		   protected void onPostExecute(File file) {
		    // отображаем сообщение, если возникла ошибка
		    if (m_error != null) {
		     m_error.printStackTrace();
		     return;
		    }
		    // закрываем прогресс и удаляем временный файл
		    progressDialog.hide();
		  	//file.delete();


		    File sdDir = new File(Environment.getExternalStorageDirectory().getPath());
		    File testDir = new File(sdDir.getAbsolutePath() + "/myDIR");
		    testDir.mkdir();
		    try {
				File.createTempFile("proga", "apk", testDir);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		    
		    Intent promptInstall = new Intent(Intent.ACTION_VIEW)
		    .setData(File)
		    .setType("application/vnd.android.package-archive");
		    startActivity(promptInstall);
		    
		   }
		  }.execute(url);
		 }

Re: Загрузка файла из сети, и его выполнение

Добавлено: 30 июл 2013, 20:18
sanu0074
Я хочу после

Код: Выделить всё

 progressDialog.hide();
запустить файл....

Re: Загрузка файла из сети, и его выполнение

Добавлено: 31 июл 2013, 06:28
klblk
setData в качестве параметра на сколько я знаю принимает Uri. Получить Uri из файла можно так "Uri uri = Uri.fromFile(file);". И, если я правильно понял, то file приходит в качестве параметра в onPostExecute.

Re: Загрузка файла из сети, и его выполнение

Добавлено: 31 июл 2013, 13:52
sanu0074
klblk писал(а):setData в качестве параметра на сколько я знаю принимает Uri. Получить Uri из файла можно так "Uri uri = Uri.fromFile(file);". И, если я правильно понял, то file приходит в качестве параметра в onPostExecute.
Пределал, теперь ошибка: unfortunately has stopped

код:

Код: Выделить всё

	
	private void downloadFile(String url) {
		  final ProgressDialog progressDialog = new ProgressDialog(this);
		 
		  new AsyncTask<String, Integer, File>() {
		   private Exception m_error = null;
		 
		   @Override
		   protected void onPreExecute() {
		    progressDialog.setMessage("Downloading ...");
		    progressDialog.setCancelable(false);
		    progressDialog.setMax(100);
		    progressDialog
		      .setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
		 
		    progressDialog.show();
		   }
		 
		   @SuppressLint("SdCardPath")
		@Override
		   protected File doInBackground(String... params) {
		    URL url;
		    HttpURLConnection urlConnection;
		    InputStream inputStream;
		    int totalSize;
		    int downloadedSize;
		    byte[] buffer;
		    int bufferLength;
		 
		    //File file = null;
		    
		    File file = new File("/sdcard/mysdfile.apk");
		    try {
				file.createNewFile();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		    
		    FileOutputStream fos = null;
		 
		    try {
		     url = new URL(params[0]);
		     urlConnection = (HttpURLConnection) url.openConnection();
		 
		     urlConnection.setRequestMethod("GET");
		     urlConnection.setDoOutput(true);
		     urlConnection.connect();
		 
		     file = File.createTempFile("Mustachify", "download");
		     fos = new FileOutputStream(file);
		     inputStream = urlConnection.getInputStream();
		 
		     totalSize = urlConnection.getContentLength();
		     downloadedSize = 0;
		 
		     buffer = new byte[1024];
		     bufferLength = 0;
		 
		     // читаем со входа и пишем в выход, 
		     // с каждой итерацией публикуем прогресс
		     while ((bufferLength = inputStream.read(buffer)) > 0) {
		      fos.write(buffer, 0, bufferLength);
		      downloadedSize += bufferLength;
		      publishProgress(downloadedSize, totalSize);
		     }
		 
		     fos.close();
		     inputStream.close();
		 
		     return file;
		    } catch (MalformedURLException e) {
		     e.printStackTrace();
		     m_error = e;
		    } catch (IOException e) {
		     e.printStackTrace();
		     m_error = e;
		    }
		 
		    return null;
		   }
		 
		   // обновляем progressDialog
		   protected void onProgressUpdate(Integer... values) {
		    progressDialog
		      .setProgress((int) ((values[0] / (float) values[1]) * 100));
		   };
		 
		   @SuppressLint("SdCardPath")
		@Override
		   protected void onPostExecute(File file) {
		    // отображаем сообщение, если возникла ошибка
		    if (m_error != null) {
		     m_error.printStackTrace();
		     return;
		    }
		    // закрываем прогресс 
		    progressDialog.hide();


		    
		    Intent promptInstall = new Intent(Intent.ACTION_VIEW)
		    .setData(Uri.parse("/sdcard/mysdfile.apk"))
		    .setType("application/vnd.android.package-archive");
		    startActivity(promptInstall);
		    
		   }
		  }.execute(url);
		 }
		
	
	
Лог:

Код: Выделить всё

07-31 10:42:57.852: I/Choreographer(1022): Skipped 40 frames!  The application may be doing too much work on its main thread.
07-31 10:43:00.323: D/dalvikvm(1022): GC_CONCURRENT freed 48K, 4% free 5452K/5656K, paused 115ms+59ms, total 402ms
07-31 10:43:00.393: W/System.err(1022): java.io.IOException: open failed: EACCES (Permission denied)
07-31 10:43:00.433: W/System.err(1022): 	at java.io.File.createNewFile(File.java:948)
07-31 10:43:00.493: W/System.err(1022): 	at com.net.homeandroid.AppActivity$1.doInBackground(AppActivity.java:115)
07-31 10:43:00.673: I/Choreographer(1022): Skipped 32 frames!  The application may be doing too much work on its main thread.
07-31 10:43:01.543: W/System.err(1022): 	at com.net.homeandroid.AppActivity$1.doInBackground(AppActivity.java:1)
07-31 10:43:01.543: W/System.err(1022): 	at android.os.AsyncTask$2.call(AsyncTask.java:287)
07-31 10:43:01.633: W/System.err(1022): 	at java.util.concurrent.FutureTask.run(FutureTask.java:234)
07-31 10:43:01.664: W/System.err(1022): 	at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
07-31 10:43:01.767: W/System.err(1022): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
07-31 10:43:01.893: W/System.err(1022): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
07-31 10:43:01.997: W/System.err(1022): 	at java.lang.Thread.run(Thread.java:856)
07-31 10:43:02.363: W/System.err(1022): Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied)
07-31 10:43:02.553: W/System.err(1022): 	at libcore.io.Posix.open(Native Method)
07-31 10:43:02.553: W/System.err(1022): 	at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
07-31 10:43:02.553: W/System.err(1022): 	at java.io.File.createNewFile(File.java:941)
07-31 10:43:02.647: W/System.err(1022): 	... 8 more
07-31 10:44:04.982: D/dalvikvm(1022): GC_CONCURRENT freed 883K, 16% free 5464K/6464K, paused 118ms+51ms, total 575ms
07-31 10:45:06.507: D/dalvikvm(1022): GC_CONCURRENT freed 965K, 17% free 5398K/6480K, paused 4ms+7ms, total 419ms
07-31 10:46:06.023: D/dalvikvm(1022): GC_CONCURRENT freed 874K, 17% free 5399K/6480K, paused 211ms+116ms, total 543ms
07-31 10:46:52.253: D/AndroidRuntime(1022): Shutting down VM
07-31 10:46:52.293: W/dalvikvm(1022): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
07-31 10:46:52.403: E/AndroidRuntime(1022): FATAL EXCEPTION: main
07-31 10:46:52.403: E/AndroidRuntime(1022): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW typ=application/vnd.android.package-archive }
07-31 10:46:52.403: E/AndroidRuntime(1022): 	at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1622)
07-31 10:46:52.403: E/AndroidRuntime(1022): 	at android.app.Instrumentation.execStartActivity(Instrumentation.java:1417)
07-31 10:46:52.403: E/AndroidRuntime(1022): 	at android.app.Activity.startActivityForResult(Activity.java:3370)
07-31 10:46:52.403: E/AndroidRuntime(1022): 	at android.app.Activity.startActivityForResult(Activity.java:3331)
07-31 10:46:52.403: E/AndroidRuntime(1022): 	at android.app.Activity.startActivity(Activity.java:3566)
07-31 10:46:52.403: E/AndroidRuntime(1022): 	at android.app.Activity.startActivity(Activity.java:3534)
07-31 10:46:52.403: E/AndroidRuntime(1022): 	at com.net.homeandroid.AppActivity$1.onPostExecute(AppActivity.java:189)
07-31 10:46:52.403: E/AndroidRuntime(1022): 	at com.net.homeandroid.AppActivity$1.onPostExecute(AppActivity.java:1)
07-31 10:46:52.403: E/AndroidRuntime(1022): 	at android.os.AsyncTask.finish(AsyncTask.java:631)
07-31 10:46:52.403: E/AndroidRuntime(1022): 	at android.os.AsyncTask.access$600(AsyncTask.java:177)
07-31 10:46:52.403: E/AndroidRuntime(1022): 	at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
07-31 10:46:52.403: E/AndroidRuntime(1022): 	at android.os.Handler.dispatchMessage(Handler.java:99)
07-31 10:46:52.403: E/AndroidRuntime(1022): 	at android.os.Looper.loop(Looper.java:137)
07-31 10:46:52.403: E/AndroidRuntime(1022): 	at android.app.ActivityThread.main(ActivityThread.java:5041)
07-31 10:46:52.403: E/AndroidRuntime(1022): 	at java.lang.reflect.Method.invokeNative(Native Method)
07-31 10:46:52.403: E/AndroidRuntime(1022): 	at java.lang.reflect.Method.invoke(Method.java:511)
07-31 10:46:52.403: E/AndroidRuntime(1022): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-31 10:46:52.403: E/AndroidRuntime(1022): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-31 10:46:52.403: E/AndroidRuntime(1022): 	at dalvik.system.NativeStart.main(Native Method)
07-31 10:47:03.142: I/Process(1022): Sending signal. PID: 1022 SIG: 9
07-31 10:47:04.812: E/Trace(1644): error opening trace file: No such file or directory (2)

Re: Загрузка файла из сети, и его выполнение

Добавлено: 31 июл 2013, 14:12
sanu0074
Так сделал, пишет "Сбой разбора пакета":

Код: Выделить всё

protected void onPostExecute(File file) {
		    // отображаем сообщение, если возникла ошибка
		    if (m_error != null) {
		     m_error.printStackTrace();
		     return;
		    }
		    // закрываем прогресс и удаляем временный файл
		    progressDialog.hide();
		  	//file.delete();
		    
		    Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(Uri.fromFile(file),
                    "application/vnd.android.package-archive");
            startActivity(intent);
		    
		   }
		  }.execute(url);
		 }

Re: Загрузка файла из сети, и его выполнение

Добавлено: 31 июл 2013, 14:39
sanu0074
Еще раз переделал, всеравно сбой разбора пакета:

Код: Выделить всё

private void downloadFile(String url) {
		  final ProgressDialog progressDialog = new ProgressDialog(this);
		 
		  new AsyncTask<String, Integer, File>() {
		   private Exception m_error = null;
		 
		   @Override
		   protected void onPreExecute() {
		    progressDialog.setMessage("Downloading ...");
		    progressDialog.setCancelable(false);
		    progressDialog.setMax(100);
		    progressDialog
		      .setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
		 
		    progressDialog.show();
		   }
		 
		   @Override
		   protected File doInBackground(String... params) {
		    URL url;
		    HttpURLConnection urlConnection;
		    InputStream inputStream;
		    int totalSize;
		    int downloadedSize;
		    byte[] buffer;
		    int bufferLength;
		 
		    File file = null;
		    FileOutputStream fos = null;
		 
		    try {
		     url = new URL(params[0]);
		     urlConnection = (HttpURLConnection) url.openConnection();
		 
		     urlConnection.setRequestMethod("GET");
		     urlConnection.setDoOutput(true);
		     urlConnection.connect();
		 
		     file = File.createTempFile("aapfromurl", ".apk");
		     fos = new FileOutputStream(file);
		     inputStream = urlConnection.getInputStream();
		 
		     totalSize = urlConnection.getContentLength();
		     downloadedSize = 0;
		 
		     buffer = new byte[1024];
		     bufferLength = 0;
		 
		     // читаем со входа и пишем в выход, 
		     // с каждой итерацией публикуем прогресс
		     while ((bufferLength = inputStream.read(buffer)) > 0) {
		      fos.write(buffer, 0, bufferLength);
		      downloadedSize += bufferLength;
		      publishProgress(downloadedSize, totalSize);
		     }
		 
		     fos.close();
		     inputStream.close();
		 
		     return file;
		    } catch (MalformedURLException e) {
		     e.printStackTrace();
		     m_error = e;
		    } catch (IOException e) {
		     e.printStackTrace();
		     m_error = e;
		    }
		 
		    return null;
		   }
		 
		   // обновляем progressDialog
		   protected void onProgressUpdate(Integer... values) {
		    progressDialog
		      .setProgress((int) ((values[0] / (float) values[1]) * 100));
		   };
		 
		   @Override
		   protected void onPostExecute(File file) {
		    // отображаем сообщение, если возникла ошибка
		    if (m_error != null) {
		     m_error.printStackTrace();
		     return;
		    }
		    // закрываем прогресс и удаляем временный файл
		    progressDialog.hide();
		  	//file.delete();


		    Intent intent = new Intent(Intent.ACTION_VIEW);
		    intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
		    startActivity(intent);
		    
		   }
		  }.execute(url);
		 }

Re: Загрузка файла из сети, и его выполнение

Добавлено: 01 авг 2013, 07:58
klblk
сам File скачивается? из file managera можно запустить?

Re: Загрузка файла из сети, и его выполнение

Добавлено: 01 авг 2013, 08:05
sanu0074
спасибо) уже подправил) работает)