Загрузка и автообновление локальной программы

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
Аватара пользователя
Sk_games
Сообщения: 77
Зарегистрирован: 20 янв 2014, 21:13

Загрузка и автообновление локальной программы

Сообщение Sk_games » 22 май 2015, 17:30

Всем хорошего дня. Значит есть такая проблема, с автообновлением программы (не через гугл маркет).
Есть локальное приложение, которое просто скачивает обновленные апк и переустанавливает программу.
С переустановкой я разобрался, а вот самой закачки апк файла, есть сложности. Почти на все свои вопросы
я нашел ответы, ниже, код готовый код, который должен делать загрузку и переустановку файла.

Но скачанный файл постоянно битый. Его полный объем 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();
    }
}

Ответить