Конвертировать HttpResponse в файл .apk - PullRequest
2 голосов
/ 04 января 2010

Проблема заключается в следующем:

Я подключаюсь к Интернету по некоторому URL и получаю HttpResponse с app_example.apk.

Тогда я хочу создать файл (.apk) в SDCard с этими данными, чтобы это загруженное приложение может быть установлен позже.

Как я могу преобразовать HttpResponse в файл .apk?

Давайте проясним некоторые детали:

  • Я должен получить этот apk-файл через интернет-соединение с моим сервером
  • Я не хочу устанавливать это приложение, которое я получаю на SDCard
  • Все это должно быть сделано в моем коде, я не могу использовать Android Market

Я сейчас пишу в этот файл.

То, что я делаю, это преобразование HttpResponse в байт [],

затем этот байт [] записывается в файл (.apk) с использованием ObjectOutputStream.

Как это:

    // byte[] appByteArray - already has the internet response converted in bytes

    try {
    file = new File(Environment.getExternalStorageDirectory()+"/"+appName+".apk");

    file.createNewFile();

    FileOutputStream stream = null;

    stream = new FileOutputStream(file, false);

    ObjectOutputStream objectOut =
        new ObjectOutputStream(new BufferedOutputStream(stream));

    objectOut.writeObject(appByteArray);

    objectOut.close();

    } catch (Exception e) {
        e.printStackTrace();
    }

В конце концов файл создан и имеет полученный контент.

Когда я пытаюсь установить его, через намерение VIEW (используя установщик по умолчанию) Я получаю сообщение об ошибке разбора о том, что не удалось найти AndroidManifest.xml.

Я думаю, что на каком-то этапе полученные данные будут повреждены.

У вас есть другой способ решить эту проблему?

Большое спасибо

Ответы [ 3 ]

5 голосов
/ 05 января 2010
  1. Не используйте ObjectOutputStream, байтовый массив сериализуется как Object, а не записывается как необработанные данные.
  2. Вы уверены, что у вас есть разрешение на запись на SD-карту? android.permission.WRITE_EXTERNAL_STORAGE
  3. Не записывать в корневой каталог SD-карты. Количество файлов в корневом каталоге может быть ограничено. Вместо этого создайте подкаталог вашего приложения на SD-карте.

У меня работает этот код:

    try {
        String filePath = Environment.getExternalStorageDirectory()
                + "/myappdir/" + appName + ".apk";

        File file = new File(filePath);
        file.getParentFile().mkdirs();
        file.createNewFile();

        BufferedOutputStream objectOut = new BufferedOutputStream(
                new FileOutputStream(file));

        objectOut.write(appByteArray);

        objectOut.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
1 голос
/ 05 января 2010

Посмотрите на ответ Павла П.

Кроме того, я хотел бы отметить, что ваша идея установить APK с помощью намеренного действия VIEW работает, поскольку я проверял эту технику в прошлом.

Однако , если пользователь явно не зашел в Настройки & rarr; Приложения и выбранное «Разрешить приложения, не относящиеся к маркету», ваша установка не удастся, и пользователь просто увидит экран, сообщающий им, что по соображениям безопасности установка была заблокирована.

По сути, вам действительно нужно полагаться на достаточно технически подкованных пользователей, которые готовы пропустить страшное предупреждение безопасности и пойти и отключить этот параметр.

1 голос
/ 05 января 2010

Это может быть не основной проблемой, но я не думаю, что вы хотите обернуть stream в ObjectOutputStream, так как это используется для сериализации объектов. Возможно, он добавляет дополнительные данные в файл, чтобы его можно было десериализовать с помощью ObjectInputStream.

Я бы попробовал вытащить apk с эмулятора (или устройства) и проверить его MD5 по сравнению с файлом на сервере, чтобы убедиться, что биты записываются правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...