Activity Lifecycle, Saving Activity State, Managing Tasks, Intent, Intent Filter
-
sanu0074
- Сообщения: 80
- Зарегистрирован: 30 июн 2013, 20:42
-
Контактная информация:
Сообщение
sanu0074 » 30 июл 2013, 19:37
Здравсвуйте, пытаюсь загрузить файл из сети (это файл приложения *.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);
}
-
sanu0074
- Сообщения: 80
- Зарегистрирован: 30 июн 2013, 20:42
-
Контактная информация:
Сообщение
sanu0074 » 30 июл 2013, 20:18
Я хочу после
запустить файл....
-
klblk
- Сообщения: 1097
- Зарегистрирован: 18 окт 2012, 11:17
- Откуда: г. Красноярск
Сообщение
klblk » 31 июл 2013, 06:28
setData в качестве параметра на сколько я знаю принимает Uri. Получить Uri из файла можно так "Uri uri = Uri.fromFile(file);". И, если я правильно понял, то file приходит в качестве параметра в onPostExecute.
-
sanu0074
- Сообщения: 80
- Зарегистрирован: 30 июн 2013, 20:42
-
Контактная информация:
Сообщение
sanu0074 » 31 июл 2013, 13:52
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)
-
sanu0074
- Сообщения: 80
- Зарегистрирован: 30 июн 2013, 20:42
-
Контактная информация:
Сообщение
sanu0074 » 31 июл 2013, 14:12
Так сделал, пишет "Сбой разбора пакета":
Код: Выделить всё
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);
}
-
sanu0074
- Сообщения: 80
- Зарегистрирован: 30 июн 2013, 20:42
-
Контактная информация:
Сообщение
sanu0074 » 31 июл 2013, 14:39
Еще раз переделал, всеравно сбой разбора пакета:
Код: Выделить всё
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);
}
-
klblk
- Сообщения: 1097
- Зарегистрирован: 18 окт 2012, 11:17
- Откуда: г. Красноярск
Сообщение
klblk » 01 авг 2013, 07:58
сам File скачивается? из file managera можно запустить?
-
sanu0074
- Сообщения: 80
- Зарегистрирован: 30 июн 2013, 20:42
-
Контактная информация:
Сообщение
sanu0074 » 01 авг 2013, 08:05
спасибо) уже подправил) работает)