2016-09-05 25 views
5

W moim app mam zwyczaj automatycznego pobrania i zainstalowania APK Działa to takNie znaleziono obsłużyć Intent podczas korzystania FileProvider

// auto register for the complete download 
    activity.registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); 



// Download the file through DownloadManager 
String destination = Environment.getExternalStorageDirectory() + "/"; 
    String fileName = "myfile.apk"; 
    destination += fileName; 
    final Uri uri = Uri.parse("file://" + destination); 
    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(apkUrl)); 
    request.setDescription("description"); 
    request.setTitle("title"); 
    request.setDestinationUri(uri); 
    final DownloadManager manager = (DownloadManager) activity.getSystemService(Context.DOWNLOAD_SERVICE); 
    final long downloadId = manager.enqueue(request); 

onComplete = new BroadcastReceiver() { 
     public void onReceive(Context ctxt, Intent intent) { 

      Intent install = new Intent(Intent.ACTION_VIEW); 
      // BEFORE working doing this 
      //install.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      //install.setDataAndType(uri, 
      // manager.getMimeTypeForDownloadedFile(downloadId)); 

      // Using file provider it doesnt work 
      Uri apkUri = FileProvider.getUriForFile(AutoUpdate.this, 
       "com.myapp", file); 
       install.setDataAndType(apkUri,manager.getMimeTypeForDownloadedFile(downloadId)); 
      activity.startActivity(install); 
      activity.unregisterReceiver(this); 

     } 
    }; 

Android manifeście działalność:

<provider 
      android:name="android.support.v4.content.FileProvider" 
      android:authorities="com.myapp" 
      android:exported="false" 
      android:grantUriPermissions="true"> 
      <meta-data 
       android:name="android.support.FILE_PROVIDER_PATHS" 
       android:resource="@xml/provider_paths"/> 
     </provider> 

Provider_path (przepraszam za niektóre powodem tak tnie tag path)

nazwę zewnętrznego path = "myfolder" path = "" />

Po zakończeniu plik do pobrania onComplete nazywa ale activiy nie uruchamia:

Nie stwierdzono aktywny uchwyt Intent {act = android.intent.action.VIEW dat = zawartość: //com.myapp/myfolder/myfile.apk typ = application/vnd.android.package-archiwum FLG = 0x4000000}

Przy użyciu normalnego pliku: // to działa

Czy istnieje coś, czym jestem brakuje podczas korzystania z dostawcy plików? Czy działanie nie rozpoczyna się, ponieważ plik nie został znaleziony? Czy potrzebuję dodatkowej zgody? (w tej chwili mam INTERNET, ODCZYT i NAPISAMY w pamięci zewnętrznej)

+0

'Czy aktywność nie rozpoczyna się, ponieważ plik nie został znaleziony'. Komunikat jest taki, że działanie nie zostało znalezione. – greenapps

+0

Należy zauważyć, że "jeśli" zastępuję typ MIME przez "*/*", otwiera to wybór aplikacji, ale kiedy wybrałem "menedżer plików", po prostu otwiera go i pozostaje w katalogu głównym. Dlatego zastanawiam się, używając FileProvider plik nie jest faktycznie znaleziony? – Johny19

+0

gdzie zadeklarowałeś zmienną "plik"? – emaillenin

Odpowiedz

12

Instalator pakietów obsługuje tylko schematy content począwszy od systemu Android 7.0. Przed tym — i pomimo dokumentacji przeciwnie — instalator pakietów obsługuje tylko schematy file.

Musisz ustawić swój IntentUri na różny sposób w zależności od tego, czy działa na Androidzie 7.0+ lub nie, na przykład przez rozgałęzienia na Build.VERSION.SDK_INT.

+1

Cholera, google! Dzięki za wskazanie tego! – Johny19

+0

@ Johny19 Czy możesz opublikować działające rozwiązanie? – emaillenin

0

Twój dostawca nie zostanie znaleziony, ponieważ

android:enabled="true" 

brakuje w swoim manifeście.

Ale to nie zadziała ani czytając drugą odpowiedź CW.

+0

Próbowałem tego. i nadal mam ten sam błąd – Johny19

Powiązane problemy