Fetch ist eine einfache, leistungsstarke und anpassbare Datei-Download-Manager-Bibliothek für Android.
Einfache und benutzerfreundliche API.
Kontinuierlicher Download im Hintergrund.
Unterstützung für gleichzeitiges Herunterladen.
Möglichkeit, Downloads anzuhalten und fortzusetzen.
Legen Sie die Priorität eines Downloads fest.
Netzwerkspezifische Download-Unterstützung.
Möglichkeit, fehlgeschlagene Downloads erneut zu versuchen.
Möglichkeit, Downloads zu gruppieren.
Einfache Fortschritts- und Statusverfolgung.
Laden Sie die Restzeitberichte (ETA) herunter.
Laden Sie Geschwindigkeitsberichte herunter.
Download-Informationen jederzeit speichern und abrufen.
Benachrichtigungsunterstützung.
Storage Access Framework, Content Provider und URI-Unterstützung.
Und mehr...
Wenn Sie Downloads außerhalb der Sandbox Ihrer Anwendung speichern, müssen Sie dem Manifest Ihrer Anwendung die folgenden Speicherberechtigungen hinzufügen. Für Android SDK Version 23(M) und höher müssen Sie diese Berechtigungen auch explizit vom Benutzer anfordern.
Außerdem nutzen Sie das Internet zum Herunterladen von Dateien. Wir müssen die Internetzugriffsberechtigungen im Manifest hinzufügen.
Die Verwendung von Fetch ist einfach! Fügen Sie einfach die Gradle-Abhängigkeit zur build.gradle-Datei Ihrer Anwendung hinzu.
Implementierung „com.tonyodev.fetch2:fetch2:3.0.12“
Androidx-Nutzung:
Implementierung „androidx.tonyodev.fetch2:xfetch2:3.1.6“
Rufen Sie als Nächstes eine Instanz von Fetch ab und fordern Sie einen Download an.
öffentliche Klasse TestActivity erweitert AppCompatActivity { private Fetch fetch; @Override protected void onCreate(@Nullable Bundle savingInstanceState) { super.onCreate(savedInstanceState); FetchConfiguration fetchConfiguration = new FetchConfiguration.Builder(this) .setDownloadConcurrentLimit(3) .bauen(); fetch = Fetch.Impl.getInstance(fetchConfiguration); String url = "http:www.example.com/test.txt"; String file = "/downloads/test.txt"; final Request request = new Request(url, file); request.setPriority(Priority.HIGH); request.setNetworkType(NetworkType.ALL); request.addHeader("clientKey", "SD78DF93_3947&MVNGHE1WONG"); fetch.enqueue(request, updateRequest -> { //Anfrage wurde erfolgreich zum Download in die Warteschlange gestellt. }, error -> { //Beim Einreihen der Anfrage in die Warteschlange ist ein Fehler aufgetreten. }); } }
Mit Fetch ist es sehr einfach, den Fortschritt und Status eines Downloads zu verfolgen. Fügen Sie Ihrer Fetch-Instanz einfach einen FetchListener hinzu, und der Listener wird benachrichtigt, wenn sich der Status oder Fortschritt eines Downloads ändert.
FetchListener fetchListener = new FetchListener() { @Override public void onQueued(@NotNull Download download, boolean waitingOnNetwork) { if (request.getId() == download.getId()) { showDownloadInList(download); } } @Override public void onCompleted(@NotNull Download download) { } @Override public void onError(@NotNull Download download) { Fehler error = download.getError(); } @Override public void onProgress(@NotNull Download download, long etaInMilliSeconds, long subscriptiondBytesPerSecond) { if (request.getId() == download.getId()) { updateDownload(download, etaInMilliSeconds); } int progress = download.getProgress(); } @Override public void onPaused(@NotNull Download herunterladen) { } @Override public void onResumed(@NotNull Download herunterladen) { } @Override public void onCancelled(@NotNull Download download) { } @Override public void onRemoved(@NotNull Download herunterladen) { } @Override public void onDeleted(@NotNull Download herunterladen) { } };fetch.addListener(fetchListener);//Listener entfernen, wenn fertig.fetch.removeListener(fetchListener);
Fetch unterstützt das Anhalten und Fortsetzen von Downloads mithilfe der ID der Anfrage. Die ID einer Anfrage ist eine eindeutige Kennung, die eine Anfrage einem Fetch-Download zuordnet. Ein von Fetch zurückgegebener Download hat eine ID, die mit der Anforderungs-ID übereinstimmt, die den Download gestartet hat.
Anfrage request1 = new Request(url, file);Request request2 = new Request(url2, file2);fetch.pause(request1.getId()); ...fetch.resume(request2.getId());
Sie können Fetch auf verschiedene Arten nach Download-Informationen abfragen.
//Alle Downloads abfragenfetch.getDownloads(new Func>() { @Override public void call(List erweitert Download> Downloads) { //Hier auf alle Downloads zugreifen } });//Alle Downloads mit einem Status abrufenfetch.getDownloadsWithStatus(Status.DOWNLOADING, new Func
>() { @Override public void call(List erweitert Download> downloads) { //Auf Downloads zugreifen die gerade heruntergeladen werden } });// Sie können auch auf gruppierte Downloads zugreifenint groupId = 52687447745;fetch.getDownloadsInGroup(groupId, new Func
>() { @Override public void call(List erweitert Download> downloads) { / /Auf gruppierte Downloads zugreifen } });
Wenn Sie mit einer Instanz von Fetch fertig sind, geben Sie sie einfach frei.
//workfetch.close();//mehr Arbeit erledigen
Standardmäßig verwendet Fetch den HttpUrlConnection-Client über den HttpUrlConnectionDownloader, um Anforderungen herunterzuladen. Fügen Sie die folgende Gradle-Abhängigkeit zum build.gradle Ihrer Anwendung hinzu, um stattdessen den OkHttp Downloader zu verwenden. Bei Bedarf können Sie Ihre benutzerdefinierten Downloader erstellen. Weitere Informationen finden Sie in den Java-Dokumenten.
Implementierung „com.tonyodev.fetch2okhttp:fetch2okhttp:3.0.12“
Androidx-Nutzung:
Implementierung „androidx.tonyodev.fetch2okhttp:xfetch2okhttp:3.1.6“
Legen Sie den zu verwendenden OkHttp-Downloader für Fetch fest.
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();FetchConfiguration fetchConfiguration = new FetchConfiguration.Builder(this) .setDownloadConcurrentLimit(10) .setHttpDownloader(neuer OkHttpDownloader(okHttpClient)) .build();Fetch fetch = Fetch.Impl.getInstance(fetchConfiguration);
Wenn Sie bei der Verwendung von Fetch die RxJava2-Funktionen nutzen möchten, fügen Sie der build.gradle-Datei Ihrer Anwendung die folgende Gradle-Abhängigkeit hinzu.
Implementierung „com.tonyodev.fetch2rx:fetch2rx:3.0.12“
Androidx-Nutzung:
Implementierung „androidx.tonyodev.fetch2rx:xfetch2rx:3.1.6“
RxFetch macht es ganz einfach, Download-Anfragen in die Warteschlange zu stellen und Downloads mithilfe der funktionalen Methoden von rxJava2 abzufragen.
FetchConfiguration fetchConfiguration = new FetchConfiguration.Builder(this).build();Rxfetch rxFetch = RxFetch.Impl.getInstance(fetchConfiguration);rxFetch.getDownloads() .asFlowable() .subscribe(new Consumer>() { @Override public void Accept(List
downloads) throws Exception { //Zugriff auf Ergebnisse } }, new Consumer () { @Override public void Accept(Throwable throwable) throws Exception { //Es ist ein Fehler aufgetreten final Error error = FetchErrorUtils.getErrorFromThrowable(throwable); } });
Vorstellung des FetchFileServers. Der FetchFileServer ist ein kompakter TCP-Dateiserver, der sich wie ein HTTP-Dateiserver verhält, der speziell für die gemeinsame Nutzung von Dateien zwischen Android-Geräten entwickelt wurde. Sie können Dateiressourcen mit dem FetchFileServer auf einem Gerät hosten und müssen Download-Dateien vom Server auf einem anderen Gerät abrufen. Weitere Informationen finden Sie in der Beispiel-App. Wiki auf FetchFileServer wird in den kommenden Tagen hinzugefügt.
Beginnen Sie mit der Verwendung von FetchFileServer, indem Sie die Gradle-Abhängigkeit zur build.gradle-Datei Ihrer Anwendung hinzufügen.
Implementierung „com.tonyodev.fetch2fileserver:fetch2fileserver:3.0.12“
Androidx-Nutzung:
Implementierung „androidx.tonyodev.fetch2fileserver:xfetch2fileserver:3.1.6“
Starten Sie eine FetchFileServer-Instanz und fügen Sie Ressourcendateien hinzu, die sie verbundenen Clients bereitstellen kann.
öffentliche Klasse TestActivity erweitert AppCompatActivity { FetchFileServer fetchFileServer; @Override protected void onCreate(@Nullable Bundle savingInstanceState) { super.onCreate(savedInstanceState); fetchFileServer = new FetchFileServer.Builder(this) .bauen(); fetchFileServer.start(); //auf Clientverbindungen warten File file = new File("/downloads/testfile.txt"); FileResource fileResource = new FileResource(); fileResource.setFile(file.getAbsolutePath()); fileResource.setLength(file.length()); fileResource.setName("testfile.txt"); fileResource.setId(UUID.randomUUID().hashCode()); fetchFileServer.addFileResource(fileResource); } @Override protected void onDestroy() { super.onDestroy(); fetchFileServer.shutDown(false); } }
Das Herunterladen einer Datei von einem FetchFileServer mithilfe von Fetch ist einfach.
öffentliche Klasse TestActivity erweitert AppCompatActivity { Fetch fetch; @Override protected void onCreate(@Nullable Bundle savingInstanceState) { super.onCreate(savedInstanceState); FetchConfiguration fetchConfiguration = new FetchConfiguration.Builder(this) .setFileServerDownloader(new FetchFileServerDownloader()) //muss den Dateiserver-Downloader festlegen .bauen(); fetch = Fetch.Impl.getInstance(fetchConfiguration); fetch.addListener(fetchListener); String file = "/downloads/sample.txt"; String-URL = new FetchFileServerUrlBuilder() .setHostInetAddress("127.0.0.1", 6886) //IP und Port des Dateiservers .setFileResourceIdentifier("testfile.txt") //Name oder ID der Dateiressource .erstellen(); Anfrage request = new Request(url, file); fetch.enqueue(request, request1 -> { //Anfrage zum Download in die Warteschlange gestellt }, Fehler -> { //Fehler beim Einreihen des Downloads in die Warteschlange }); } @Override protected void onResume() { super.onResume(); fetch.addListener(fetchListener); } @Override protected void onPause() { super.onPause(); fetch.removeListener(fetchListener); } @Override protected void onDestroy() { super.onDestroy(); fetch.close(); } private FetchListener fetchListener = new AbstractFetchListener() { @Override public void onProgress(@NotNull Download download, long etaInMilliSeconds, long subscriptiondBytesPerSecond) { super.onProgress(download, etaInMilliSeconds, downloadBytesPerSecond); Log.d("TestActivity", "Progress: " + download.getProgress()); } @Override public void onError(@NotNull Download download) { super.onError(download); Log.d("TestActivity", "Error: " + download.getError().toString()); } @Override public void onCompleted(@NotNull Download download) { super.onCompleted(download); Log.d("TestActivity", "Completed"); } }; }
Migrieren Sie Downloads mit dem Migrationsassistenten von Fetch1 nach Fetch2. Fügen Sie der build.gradle-Datei Ihrer Anwendung die folgende Gradle-Abhängigkeit hinzu.
Implementierung „com.tonyodev.fetchmigrator:fetchmigrator:3.0.12“
Androidx-Nutzung:
Implementierung „androidx.tonyodev.fetchmigrator:xfetchmigrator:3.1.6“
Führen Sie dann den Migrator aus.
if (!didMigrationRun()) { //Migration muss in einem Hintergrundthread ausgeführt werden new Thread(new Runnable() { @Override public void run() { try { final ListtransferDownloads = FetchMigrator.migrateFromV1toV2(getApplicationContext() , APP_FETCH_NAMESPACE); //TODO: externe Referenzen von IDs aktualisieren für (DownloadTransferPair transferiertDownload: transferDownloads) { Log.d("newDownload", transferedDownload.getNewDownload().toString()); Log.d("oldId in Fetch v1", transferedDownload.getOldID() + ""); } FetchMigrator.deleteFetchV1Database(getApplicationContext()); setMigrationDidRun(true); //Einrichten und Ausführen von Fetch2 nach der Migration } Catch (SQLException e) { e.printStackTrace(); } } }).Start(); } else { //Fetch2 normal einrichten und ausführen }
Fetch kann nur besser werden, wenn Sie Codebeiträge leisten. Einen Fehler gefunden? Berichten Sie. Haben Sie eine Idee für eine Funktion, die Sie gerne in Fetch sehen würden? Tragen Sie zum Projekt bei!
Copyright (C) 2017 Tonyo Francis. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.