2012-09-24 3 views
0

У меня проблемы с установкой APK, сохраненной в Cache для Android. Нет проблем с сохранением файла в External Storage или External Cache с использованием context.getExternalCacheDir().Установить .APK из Android Cache

Но если я пытаюсь использовать 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 будет доступен пользователю, и я не хочу этого.

Что можно сохранить файл во внутреннем кеше?

Благодаря

ответ

3

Похоже, внутренний кэш Безразлично 't позволить APK быть правильно прочитанным.

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

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

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

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

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

+0

Но я вижу, что Google Play использует внутренний кэш для сохранения .apks, поэтому я предполагаю, что это возможно в некотором роде. «Дело в том, что если файл сохранен на внешнем хранилище или внешнем кеше, APK будет доступен для пользователя, и я не хочу этого». Сказав это, я имел в виду, что я не хочу, чтобы .APK отображался на внешнем хранении даже нерасширенных устройств, но очевидно, что apk нужно где-то хранить, чтобы установить его. – Mariux

+0

@Mariux: Имейте в виду, что Google Play является частью операционной системы, а ваше приложение - нет. – CommonsWare

+0

Если я хочу использовать подход Internal Storage, как я могу прочитать файл из него? – Mariux

0

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

chmod 777 /data/data/*** or chmod 644 /data/data/*** 
+0

В лучшем случае это может быть сделано только на корневом устройстве и не является особенно яркой идеей по соображениям безопасности. – CommonsWare

Смежные вопросы