Как установить APK, хранящийся в приватном хранилище приложения для Android? - PullRequest
3 голосов
/ 16 июня 2011

Из моего приложения для Android я загружаю apk из Интернета, сохраняя его в личном хранилище приложения (openFileOutput(FILENAME, Context.MODE_PRIVATE))

и пытается вызвать установщик пакета Android для этого скачанного apk,
intent.setDataAndType(Uri.fromFile(f), "application/vnd.android.package-archive");<br> startActivity(intent);

но я получаю сообщение об ошибке
Unable to open zip: /data/data/com.test/files/abc.apk : Permission denied
в LogCat

и
Parse Error: There is a problem parsing the package
на экране телефона.

Это происходит потому, что файл apk находится в личном хранилище приложения, поэтому установщик пакета Android не может получить к нему доступ? Если да, возможно ли каким-то образом установить apk (с разрешения пользователя, конечно)? Или я что-то не так делаю?

PS: Пожалуйста, не думайте, что телефон рутирован.

Ответы [ 3 ]

3 голосов
/ 16 июня 2011

В дополнение к комментарию Марка Аллисона, мой GUESS заключается в том, что, поскольку у вас есть файл, сохраненный в частном хранилище с помощью mode_private, только ваше приложение имеет разрешение на чтение / запись.Но вы пытаетесь, чтобы установщик пакета прочитал его, а это означает, что файл должен быть доступен для внешнего приложения и поэтому должен быть либо MODE_WORLD_READABLE, либо MODE_WORLD_WRITEABLE.

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

0 голосов
/ 20 мая 2013

MODE_WORLD_READABLE действительно говорит, что к нему может получить доступ весь «мир по телефону», так что другие приложения могут получить его, в том числе исследователи файлов. Некоторые программы, такие как es-file manager, позволяют вам просматривать содержимое в личном хранилище устройства, даже если вы не root, но не позволяете изменять эти файлы. Почему бы вам просто не удалить файл apk сразу после установки? Кроме того, поскольку вы загружаете файл apk в свое приложение, я предполагаю, что вы не хотите использовать Play Store, но если это не проблема, см. Параметры лицензирования для вашего приложения по адресу: http://developer.android.com/google/play/licensing/overview.html, так как, возможно, есть вариант использования, который покрывает ваши требования.

0 голосов
/ 17 июня 2011

Хорошо, сейчас я нашел обходной путь (и это помогло мне также подтвердить точную проблему - проблема была в том, что установщик не мог получить доступ к файлу apk ). Теперь я использую MODE_WORLD_READABLE вместо MODE_PRIVATE при сохранении файла во внутреннем хранилище, и установщик Android может получить доступ к apk и установить его без каких-либо ошибок. На самом деле, для меня основная цель использования внутреннего хранилища состояла в том, чтобы пользователи не могли напрямую копировать файл apk (предполагая простую модель угрозы, при которой у пользователя нет рутированного телефона, но он может просматривать SD-карту, чтобы найти apk и скопировать его). Хотя я все еще не уверен, виден ли файл пользователю сейчас или нет? Я имею в виду, что я (почти) в порядке, если к загруженному apk можно получить доступ из приложения в телефоне, но пользователь не может скопировать его напрямую.

Было бы полезно, если бы кто-то, зная точную область действия MODE_WORLD_READABLE, мог уточнить то же самое, в частности, можно ли просматривать файл, сохраненный в этом режиме, в (нерутированном) телефоне. Кроме того, возможно ли иметь лучшую стратегию для защиты apk, в то же время позволяя установщику получить к нему доступ?

...