0

Я создаю приложение для пользовательского обновления, я нашел много помощи отсюда, но не для этого вопроса.Обновление программного обеспечения, запуск apk, FATAL EXCEPTION: активность не найдена для обработки намерения (Работа с префиксным файлом: //), проблема с использованием getExternalFilesDir

можно скачать update.apk используя AsyncTask так:

output = new FileOutputStream(context.getFilesDir()+"/update.apk"); 

Скачать завершает успешно, то попробуйте запустить APK для обновления программного обеспечения, как это:

EDIT: Эта часть корректируют Лиги предложил. ("файл: //")

Intent promptInstall = new Intent(Intent.ACTION_VIEW) 
    .setDataAndType(Uri.parse("file://"+context.getFilesDir()+"/update.apk"), 
          "application/vnd.android.package-archive"); 

promptInstall.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
promptInstall.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
context.startActivity(promptInstall); 

App разбился с ошибкой выше, перед тем добавлен префикс.

FATAL EXCEPTION: main 
android.content.ActivityNotFoundException: 
    No Activity found to handle Intent { 
     act=android.intent.action.VIEW dat=/data/data/com.my.app/files/update.apk 
     typ=application/vnd.android.package-archive flg=0x10000001 
    } 

EDIT:

Как было предложено, я пытаюсь сделать это так и получаю ошибку:

/strorage/emulated/0/Android/data/com.my.app/файлы Не удалось открыть: EISDIR

String PATH = context.getExternalFilesDir(null) + "/"; 
File file = new File(PATH); 
file.mkdirs(); 
File outputFile = new File(file, "update.apk"); 
output = new FileOutputStream(file); 

И попытаться начать установку, как предложено

File file = new File(context.getExternalFilesDir(null) + "/update.apk"); 
file.setReadable(true, false); 
Intent promptInstall = new Intent(Intent.ACTION_VIEW); 
promptInstall.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); 
promptInstall.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
promptInstall.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
context.startActivity(promptInstall); 

Что я делаю неправильно?

EDIT: РЕШЕНИЕ

Я забыл добавить разрешение на чтение из внешнего хранилища, добавили эту строку в

AndroidManifest.xml

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

AsyncTask

@Override 
protected String doInBackground (String...sUrl){ 
    ...... 
    File sd = Environment.getExternalStorageDirectory(); 
    File outputFile = new File(sd, "/download/update.apk"); 
    output = new FileOutputStream(outputFile); 
    ...... 
} 


@Override 
protected void onPostExecute(String result) { 
    ...... 
    File sd = Environment.getExternalStorageDirectory(); 
    File inputFile = new File(sd, "/download/update.apk"); 

    Intent promptInstall = new Intent(Intent.ACTION_VIEW); 
    promptInstall.setDataAndType(Uri.fromFile(inputFile), "application/vnd.android.package-archive"); 

    promptInstall.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
    promptInstall.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(promptInstall); 
    ...... 
} 
+0

Ваша деятельность хорошо известна в манифесте? – arodriguezdonaire

+0

Деятельность хорошо декларирована в манифесте, да. – EspeH

ответ

1

Во-первых, использовать Uri.fromFile() для файлов, не Uri.parse(), чтобы избежать проблемы file:/// схемы, которые цитирует Ligi.

Во-вторых, установщик не может получить доступ к APK, потому что вы положили его на внутреннее хранилище. Вы должны поместить файл APK на внешнее хранилище (например, getExternalFilesDir()).

+0

Does getExternalFilesDir означает, что у меня есть SD-карта, смонтированная на устройстве? Почему-то я не могу заставить его работать[email protected] – EspeH

+0

Я получаю эту ошибку при попытке использовать ** getExternalFilesDir ** '/ strorage/emulated/0/Android/data/com.my.app/files' ** open failed: EISDIR ** – EspeH

+1

@EspeH:« Делает getExternalFilesDir означает, что у меня должна быть установлена ​​SD-карта на устройстве? " - [внешнее хранилище] (https://commonsware.com/blog/2014/04/08/storage-situation-external-storage.html) не является [сменным хранилищем] (https://commonsware.com/blog/ 2014/04/09/storage-situation-removable-storage.html) на большинстве устройств. «open failed: EISDIR» - 'getExternalFilesDir()' - это каталог, а не файл. – CommonsWare

3

вам нужно префикс схемы (файл: //)

+0

Отлично, теперь он начинает обновление, но есть некоторые проблемы с разбором, говорит установщик. Произошла ошибка при разборе пакета, в чем проблема? Файл Apk правильно сгенерирован, и я могу использовать приложение istall при ручной загрузке файла и установке. – EspeH

+1

вы должны задать этот вопрос как отдельный вопрос и принять его – ligi