2012-04-23 6 views
1

Я пытаюсь установить файл apk, присутствующий во внутреннем/внешнем хранилище. Это мой код:Установка apk в каталоге данных

final String fileuri = "file://" + absolutePath; 
Log.v("FILE_BROWSER", "File to be installed: " + Uri.parse(fileuri).getPath()); 
final Intent promptInstall = new Intent(Intent.ACTION_VIEW); 
promptInstall.setDataAndType(Uri.parse(fileuri), "application/vnd.android.package-archive"); 
promptInstall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(promptInstall); 

АПК файл успешно установлен, если файл присутствует на внешнем накопителе. Например. /mnt/sdcard/MyApp.apk

Но если файл apk присутствует во внутренней памяти (например. /data/data/com.myapp/files/MyApp.apk), то установка завершается с ошибкой. Сообщение об ошибке: Parse Error: There is a problem parsing the package

Одним из решений может быть копирование файла на SDCARD, а затем его установка. Но в сценарии, где SDCARD недоступен, этот трюк не будет работать.

Любая помощь по этому парню? Как установить apk во внутренний каталог хранения, если SDCARD недоступен?

+0

Убедитесь, что ваш .apk-файл размещен во внутреннем хранилище t и у него есть разрешение WORLD_READABLE. – user370305

+0

Я использую эквивалентное приложение браузера файлов. И если мое приложение может увидеть файл, то файл WORLD_READABLE я предполагаю. –

+1

Нет, его не нужно. Если ваше приложение записывает файл в режиме PRIVATE, то только ваше приложение может его читать и писать. Ни одна сторонняя или другая заявка не делает этого. – user370305

ответ

4

Для этого ваш .apk-файл должен соответствовать Context.MODE_WORLD_READABLE.

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

String outFileName = path+"/<Application_Name>.apk"; 
OutputStream myOutput = openFileOutput("<Application_Name>.apk", Context.MODE_WORLD_READABLE); 

А затем установить его,

Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setDataAndType(Uri.fromFile(new File(path+"/<Application_Name>.apk")), "application/vnd.android.package-archive"); 
startActivity(intent); 

Здесь путь path = getFilesDir().getAbsolutePath();

И это работает отлично в моем случае.

+1

Сначала я попытался установить разрешение файла на MODE_WORLD_READABLE, как первоначально было предложено пользователем370305. Тогда не получилось. После этого я изменил Uri.parse ("file: //" + absolutePath) 'на' Uri.fromFile (новый файл (absolutePath)) ', и теперь он отлично работает. Большое спасибо. –

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