Установите .APK из кэша Android

У меня проблемы с установкой APK, сохраненного во внутреннем кэше Android. Нет проблем с сохранением файла во внешнем хранилище или во внешнем кэше с помощью context.getExternalCacheDir().

Но если я попытаюсь использовать context.getCacheDir(), журнал вернет

/data/data/com.my.package/cache/update.apk: ошибка открытия: EACCES (отказано в доступе)

                File file = context.getCacheDir();

                File outputFile = new File(file, "update.apk");
                if(outputFile.exists()){
                    outputFile.delete();
                }

                FileOutputStream fos = new FileOutputStream(outputFile);


                InputStream is = c.getInputStream();

                byte[] buffer = new byte[1024];
                int len1 = 0;
                while ((len1 = is.read(buffer)) != -1) {
                    fos.write(buffer, 0, len1);
                }
                fos.close();
                is.close();

                Intent intent = new Intent(Intent.ACTION_VIEW);

                //SAVE IN CACHE
                intent.setDataAndType(Uri.fromFile(outputFile), "application/vnd.android.package-archive");

                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // without this flag android returned a intent error!
                context.startActivity(intent);

Похоже, внутренний кеш не позволяет правильно читать APK.

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

Что можно сделать, чтобы сохранить файл во внутреннем кэше?

Спасибо


person Mariux    schedule 24.09.2012    source источник
comment
попробуйте это: stackoverflow.com/a/8784822/6056489   -  person Farshid roohi    schedule 23.12.2019


Ответы (2)


Похоже, внутренний кеш не позволяет правильно читать APK.

Это потому, что у приложения-установщика нет прав на чтение вашего файла.

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

Тогда не устанавливайте его на устройство пользователя. Любой пользователь может скопировать любой APK со своего устройства в любое время после установки, поэтому единственный способ предотвратить доступ пользователя к APK — это вообще не иметь его на устройстве.

Что можно сделать, чтобы сохранить файл во внутреннем кэше?

Наверное, ничего. Если вы переключитесь на openFileOutput(), вы увидите, будет ли MODE_WORLD_READABLE достаточно для продолжения установки. Опять же, это не помешает пользователю получить доступ к файлу APK.

person CommonsWare    schedule 24.09.2012
comment
Но я вижу, что Google Play использует внутренний кеш для сохранения .apks, поэтому я предполагаю, что это каким-то образом возможно. Дело в том, что если файл сохранен на внешнем хранилище или во внешнем кэше, APK будет доступен пользователю, а я этого не хочу. Говоря это, я имел в виду, что я не хочу, чтобы .APK был хорошо виден на внешнем хранилище даже нерутированных устройств, но очевидно, что apk должен где-то храниться, чтобы установить его. - person Mariux; 24.09.2012
comment
@Mariux: имейте в виду, что Google Play является частью операционной системы, а ваше приложение — нет. - person CommonsWare; 24.09.2012
comment
Если я хочу использовать подход внутреннего хранилища, как я могу прочитать файл из него? - person Mariux; 24.09.2012
comment
@Mariux: openFileInput() или getFilesDir(), как сочтешь нужным. - person CommonsWare; 24.09.2012
comment
Получил это, чтобы работать таким образом, спасибо CommonsWare! Считаете ли вы, что использование внутренней памяти является хорошим подходом? - person Mariux; 24.09.2012
comment
@Mariux: В этом подходе нет ничего особенно плохого, если вы это имеете в виду. - person CommonsWare; 25.09.2012

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

 chmod 777 /data/data/*** or chmod 644 /data/data/***
person timonvlad    schedule 24.09.2012
comment
В лучшем случае это можно сделать только на рутированном устройстве, и это не очень хорошая идея по соображениям безопасности. - person CommonsWare; 24.09.2012