Есть локальное приложение, которое просто скачивает обновленные апк и переустанавливает программу.
С переустановкой я разобрался, а вот самой закачки апк файла, есть сложности. Почти на все свои вопросы
я нашел ответы, ниже, код готовый код, который должен делать загрузку и переустановку файла.
Но скачанный файл постоянно битый. Его полный объем 2 мб, а скачивается 4 кб, 100 кб и так далее.
Насколько я понимаю, ошибка вот в этом - byte[] buffer = new byte[4096]. Иногда я видел примеры,
где в скобках писали значение целой переменной, полученное из - HttpURLConnection.getContentLength().
Но у меня это значение равно -1, или просто падает приложение.
Мне также написали, такое:
Create a MIME-TYPE mapping of apk to application/vnd.android.package-archive. How you do this will vary on your web server.
Но насколько я понимаю, это зависит от сервера, или это нужно встроить мне, в своем приложении.
Может кто поделился бы прямой ссылкой на файл, с прописанными параметрами на серверами МИМ Тайп,
что бы протестировать работу своего кода. В любом случае спасибо за внимание. Буду рад любой помощи.
Код:
Код: Выделить всё
public class UpdateApp extends AsyncTask<String,Void,Void> {
private Context context;
private String LOG_UPDATE = "Update";
private FragmentManager fragmentManager;
public void setContext(Context _context, FragmentManager fragmentManager){
context = _context;
this.fragmentManager = fragmentManager;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
fragmentManager.beginTransaction()
.replace(R.id.container, new ProgressFragment())
.commit();
}
@Override
protected Void doInBackground(String... arg0) {
try {
String PATH = Environment.getExternalStorageDirectory().getPath();
Log.d(LOG_UPDATE, "-----------------------");
URL url = new URL(arg0[0]);
HttpURLConnection c = (HttpURLConnection) url.openConnection();
c.setRequestMethod("GET");
c.setDoOutput(true);
c.connect();
File file = new File(PATH);
file.mkdirs();
Log.d(LOG_UPDATE, "Get MKDIRS and PATH with: " + PATH);
File outputFile = new File(file, "update.apk");
if(outputFile.exists()){
outputFile.delete();
}
FileOutputStream fos = new FileOutputStream(outputFile);
InputStream is = c.getInputStream();
Log.d(LOG_UPDATE, "Creating and Starting OutputStream with byte");
byte[] buffer = new byte[4096];
int len1 = 0;
while ((len1 = is.read(buffer)) != -1) {
fos.write(buffer, 0, len1);
}
fos.close();
is.close();
Log.d(LOG_UPDATE, "Close OutputStream");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(PATH + "update.apk")), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Log.d(LOG_UPDATE, "Starting new Intent!.......");
context.startActivity(intent);
} catch (FileNotFoundException e) {
Log.e("FileNotFoundException",e+"");
} catch (IOException e) {
Log.e("IOException",e+"");
}
catch (Exception e){
Log.e("Exception", e+"");
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
fragmentManager
.beginTransaction()
.add(R.id.container, new FragmentAddShop())
.commit();
}
}