- Fehler vom Typ „Cleartext HTTP traffic not permitted“ (Klartext-HTTP-Traffic nicht zulässig) beheben
- Fehler „SSLHandshakeException“, „CertPathValidatorException“ und „ERR_CERT_AUTHORITY_INVALID“ beheben
- Warum können einige Media-Dateien nicht gesucht werden?
- Warum ist die Suche in einigen MP3-Dateien ungenau?
- Warum ist das Vorspulen in meinem Video so langsam?
- Warum können einige MPEG‑TS-Dateien nicht abgespielt werden?
- Warum werden in einigen MPEG-TS-Dateien keine Untertitel gefunden?
- Warum werden einige MP4-/FMP4-Dateien nicht richtig wiedergegeben?
- Warum schlagen einige Streams mit dem HTTP-Antwortcode 301 oder 302 fehl?
- Warum schlagen einige Streams mit „UnrecognizedInputFormatException“ fehl?
- Warum funktioniert „setPlaybackParameters“ auf einigen Geräten nicht richtig?
- Was bedeuten Fehler vom Typ „Player is accessed on the wrong thread“?
- Wie kann ich den Fehler „Unerwartete Statuszeile: ICY 200 OK“ beheben?
- Wie kann ich abfragen, ob es sich bei dem wiedergegebenen Stream um einen Livestream handelt?
- Wie kann ich Audioinhalte weiter abspielen, wenn meine App im Hintergrund ausgeführt wird?
- Warum unterstützt ExoPlayer meine Inhalte, die ExoPlayer Cast-Bibliothek aber nicht?
- Warum können Inhalte nicht abgespielt werden, obwohl keine Fehlermeldung angezeigt wird?
- Wie kann ich eine Decodierungsbibliothek laden und für die Wiedergabe verwenden?
- Kann ich YouTube-Videos direkt mit ExoPlayer abspielen?
- Die Videowiedergabe ruckelt
- Instabile API-Lint-Fehler
Fehler vom Typ „Cleartext HTTP traffic not permitted“ beheben
Dieser Fehler tritt auf, wenn Ihre App Cleartext-HTTP-Traffic (d. h. http://
anstelle von https://
) anfordert, obwohl dies in der Netzwerksicherheitskonfiguration nicht zulässig ist. Wenn Ihre App auf Android 9 (API‑Level 28) oder höher ausgerichtet ist, ist HTTP-Traffic im Klartext in der Standardkonfiguration deaktiviert.
Wenn Ihre App mit HTTP-Traffic im Klartext arbeiten muss, benötigen Sie eine Network Security Configuration, die dies zulässt. Weitere Informationen finden Sie in der Dokumentation zur Netzwerksicherheit von Android. Wenn Sie den gesamten HTTP-Traffic im Klartext aktivieren möchten, können Sie einfach android:usesCleartextTraffic="true"
dem application
-Element der AndroidManifest.xml
Ihrer App hinzufügen.
Die ExoPlayer-Demo-App verwendet die Standardkonfiguration für die Netzwerksicherheit und lässt daher keinen HTTP-Datenverkehr im Klartext zu. Sie können sie anhand der Anleitung oben aktivieren.
Fehler „SSLHandshakeException“, „CertPathValidatorException“ und „ERR_CERT_AUTHORITY_INVALID“ beheben
SSLHandshakeException
, CertPathValidatorException
und ERR_CERT_AUTHORITY_INVALID
weisen alle auf ein Problem mit dem SSL-Zertifikat des Servers hin. Diese Fehler sind nicht ExoPlayer-spezifisch. Weitere Informationen finden Sie in der SSL-Dokumentation für Android.
Warum kann bei einigen Mediendateien nicht gesucht werden?
Standardmäßig unterstützt ExoPlayer keine Suchvorgänge in Medien, bei denen die einzige Methode zum Ausführen genauer Suchvorgänge darin besteht, dass der Player die gesamte Datei scannt und indexiert. ExoPlayer betrachtet solche Dateien als nicht suchbar. Die meisten modernen Media-Containerformate enthalten Metadaten für die Suche (z. B. einen Sample-Index), haben einen genau definierten Suchalgorithmus (z. B. interpolierte Bisektionssuche für Ogg) oder geben an, dass ihr Inhalt eine konstante Bitrate hat. In diesen Fällen sind effiziente Suchvorgänge möglich und werden von ExoPlayer unterstützt.
Wenn du die Suche benötigst, aber nicht suchbare Medien hast, empfehlen wir, deine Inhalte in ein geeigneteres Containerformat zu konvertieren. Bei MP3-, ADTS- und AMR-Dateien können Sie auch das Suchen aktivieren, sofern die Dateien eine konstante Bitrate haben. Weitere Informationen
Warum ist die Suche in einigen MP3-Dateien ungenau?
MP3-Dateien mit variabler Bitrate (VBR) sind grundsätzlich für Anwendungsfälle ungeeignet, die eine genaue Suche erfordern. Dafür gibt es zwei Gründe:
- Für die genaue Suche sollte ein Containerformat idealerweise eine genaue Zeit-zu-Byte-Zuordnung in einem Header bereitstellen. Diese Zuordnung ermöglicht es einem Player, eine angeforderte Suchzeit dem entsprechenden Byte-Offset zuzuordnen und Medien ab diesem Offset anzufordern, zu parsen und abzuspielen. Die Header, die für die Angabe dieser Zuordnung in MP3 verfügbar sind (z. B. XING-Header), sind leider oft ungenau.
- Bei Containerformaten, die keine genaue Zeit-zu-Byte-Zuordnung (oder überhaupt keine Zeit-zu-Byte-Zuordnung) bieten, ist es dennoch möglich, eine genaue Suche durchzuführen, wenn der Container absolute Sample-Zeitstempel im Stream enthält. In diesem Fall kann ein Player die Suchzeit einem Schätzwert des entsprechenden Byte-Offsets zuordnen, Medien ab diesem Offset anfordern, den ersten absoluten Sample-Zeitstempel parsen und effektiv eine geführte binäre Suche in den Medien durchführen, bis er das richtige Sample findet. Leider enthält MP3 keine absoluten Sample-Zeitstempel im Stream, daher ist dieser Ansatz nicht möglich.
Aus diesen Gründen ist die einzige Möglichkeit, eine genaue Suche in einer VBR-MP3-Datei durchzuführen, die gesamte Datei zu scannen und manuell eine Zeit-zu-Byte-Zuordnung im Player zu erstellen. Diese Strategie kann mit FLAG_ENABLE_INDEX_SEEKING
aktiviert werden, das mit setMp3ExtractorFlags
für ein DefaultExtractorsFactory
festgelegt werden kann. Bei großen MP3-Dateien kann es zu Problemen kommen, insbesondere wenn der Nutzer kurz nach Beginn der Wiedergabe versucht, zum Ende des Streams zu springen. In diesem Fall muss der Player warten, bis der gesamte Stream heruntergeladen und indexiert wurde, bevor er den Sprung ausführen kann. In ExoPlayer haben wir uns in diesem Fall für die Geschwindigkeit und gegen die Genauigkeit entschieden. FLAG_ENABLE_INDEX_SEEKING
ist daher standardmäßig deaktiviert.
Wenn Sie die abgespielten Medien selbst steuern, empfehlen wir dringend, ein geeigneteres Containerformat wie MP4 zu verwenden. Uns sind keine Anwendungsfälle bekannt, in denen MP3 das beste Mediaformat ist.
Warum ist das Suchen in meinem Video so langsam?
Wenn der Player in einem Video zu einer neuen Wiedergabeposition springt, sind zwei Schritte erforderlich:
- Lade die Daten, die der neuen Wiedergabeposition entsprechen, in den Puffer. Das ist möglicherweise nicht erforderlich, wenn diese Daten bereits gepuffert sind.
- Spülen Sie den Videodecoder und beginnen Sie mit der Decodierung ab dem I-Frame (Keyframe) vor der neuen Wiedergabeposition. Das liegt an der Intra-Frame-Codierung, die von den meisten Videokomprimierungsformaten verwendet wird. Damit die Suche genau ist (d. h., die Wiedergabe beginnt genau an der Suchposition), müssen alle Frames zwischen dem vorherigen I-Frame und der Suchposition decodiert und sofort verworfen werden (ohne auf dem Bildschirm angezeigt zu werden).
Die durch (1) verursachte Latenz kann entweder durch Erhöhen der Menge an Daten, die vom Player im Arbeitsspeicher gepuffert werden, oder durch Vorab-Caching der Daten auf der Festplatte verringert werden.
Die durch (2) verursachte Latenz kann entweder durch Verringern der Genauigkeit der Suche mit ExoPlayer.setSeekParameters
oder durch erneutes Codieren des Videos mit häufigeren I-Frames (was zu einer größeren Ausgabedatei führt) verringert werden.
Warum können einige MPEG‑TS-Dateien nicht abgespielt werden?
Einige MPEG-TS-Dateien enthalten keine Zugriffseinheitstrennzeichen (Access Unit Delimiters, AUDs). Standardmäßig verwendet ExoPlayer AUDs, um Framegrenzen kostengünstig zu erkennen. Einige MPEG-TS-Dateien enthalten keine IDR-Keyframes. Standardmäßig sind dies die einzigen Keyframes, die von ExoPlayer berücksichtigt werden.
ExoPlayer bleibt im Pufferungsstatus hängen, wenn eine MPEG-TS-Datei ohne AUDs oder IDR-Schlüsselbilder wiedergegeben werden soll. Wenn Sie solche Dateien abspielen möchten, können Sie dazu FLAG_DETECT_ACCESS_UNITS
bzw. FLAG_ALLOW_NON_IDR_KEYFRAMES
verwenden. Diese Flags können mit setTsExtractorFlags
für ein DefaultExtractorsFactory
oder mit dem Konstruktor für ein DefaultHlsExtractorFactory
festgelegt werden.
Die Verwendung von FLAG_DETECT_ACCESS_UNITS
hat keine anderen Nebenwirkungen als die, dass sie im Vergleich zur AUD-basierten Erkennung von Frame-Grenzen rechenintensiv ist. Die Verwendung von FLAG_ALLOW_NON_IDR_KEYFRAMES
kann bei der Wiedergabe einiger MPEG-TS-Dateien zu vorübergehenden visuellen Fehlern zu Beginn der Wiedergabe und unmittelbar nach dem Suchen führen.
Warum werden in einigen MPEG‑TS-Dateien keine Untertitel gefunden?
Einige MPEG-TS-Dateien enthalten CEA-608-Tracks, deklarieren sie aber nicht in den Containermetadaten, sodass ExoPlayer sie nicht erkennen kann. Sie können Untertitel-Tracks manuell angeben, indem Sie der DefaultExtractorsFactory
eine Liste der erwarteten Untertitelformate bereitstellen, einschließlich der Barrierefreiheitskanäle, die zur Identifizierung im MPEG-TS-Stream verwendet werden können:
Kotlin
val extractorsFactory = DefaultExtractorsFactory() .setTsSubtitleFormats( listOf( Format.Builder() .setSampleMimeType(MimeTypes.APPLICATION_CEA608) .setAccessibilityChannel(accessibilityChannel) // Set other subtitle format info, such as language. .build() ) ) val player: Player = ExoPlayer.Builder(context, DefaultMediaSourceFactory(context, extractorsFactory)).build()
Java
DefaultExtractorsFactory extractorsFactory = new DefaultExtractorsFactory() .setTsSubtitleFormats( ImmutableList.of( new Format.Builder() .setSampleMimeType(MimeTypes.APPLICATION_CEA608) .setAccessibilityChannel(accessibilityChannel) // Set other subtitle format info, such as language. .build())); Player player = new ExoPlayer.Builder(context, new DefaultMediaSourceFactory(context, extractorsFactory)) .build();
Warum werden einige MP4-/FMP4-Dateien nicht richtig wiedergegeben?
Einige MP4-/FMP4-Dateien enthalten Bearbeitungslisten, die den Media-Zeitablauf durch Überspringen, Verschieben oder Wiederholen von Sample-Listen neu schreiben. ExoPlayer unterstützt das Anwenden von Bearbeitungslisten nur teilweise. So können beispielsweise Gruppen von Samples ab einem Synchronisations-Sample verzögert oder wiederholt werden. Audiomuster werden jedoch nicht gekürzt und es wird kein Preroll für Bearbeitungen durchgeführt, die nicht mit einem Synchronisations-Sample beginnen.
Wenn Sie feststellen, dass ein Teil der Media unerwartet fehlt oder wiederholt wird, versuchen Sie, Mp4Extractor.FLAG_WORKAROUND_IGNORE_EDIT_LISTS
oder FragmentedMp4Extractor.FLAG_WORKAROUND_IGNORE_EDIT_LISTS
festzulegen. Dadurch werden Bearbeitungslisten vom Extractor vollständig ignoriert. Diese können für eine DefaultExtractorsFactory
mit setMp4ExtractorFlags
oder setFragmentedMp4ExtractorFlags
festgelegt werden.
Warum schlagen einige Streams mit dem HTTP-Antwortcode 301 oder 302 fehl?
Die HTTP-Antwortcodes 301 und 302 weisen beide auf eine Weiterleitung hin. Kurzbeschreibungen finden Sie auf Wikipedia. Wenn ExoPlayer eine Anfrage stellt und eine Antwort mit dem Statuscode 301 oder 302 empfängt, folgt es normalerweise der Weiterleitung und startet die Wiedergabe wie gewohnt. Die einzige Ausnahme, bei der dies nicht standardmäßig geschieht, sind protokollübergreifende Weiterleitungen. Bei einer protokollübergreifenden Weiterleitung wird von HTTPS zu HTTP oder umgekehrt weitergeleitet (oder seltener zwischen einem anderen Protokollpaar). So können Sie mit dem wget-Befehlszeilentool testen, ob eine URL eine protokollübergreifende Weiterleitung verursacht:
wget "https://yourserver.example.com/test.mp3" 2>&1 | grep Location
Die Ausgabe sollte in etwa so aussehen:
Location: https://secondserver.example.net/test.mp3 [following]
Location: http://thirdserver.example.org/test.mp3 [following]
In diesem Beispiel gibt es zwei Weiterleitungen. Die erste Weiterleitung erfolgt von https://yourserver.example.com/test.mp3
zu https://secondserver.example.net/test.mp3
. Beide sind HTTPS, daher handelt es sich nicht um eine protokollübergreifende Weiterleitung. Die zweite Weiterleitung erfolgt von https://secondserver.example.net/test.mp3
zu http://thirdserver.example.org/test.mp3
. Hier wird von HTTPS zu HTTP weitergeleitet, also eine protokollübergreifende Weiterleitung. ExoPlayer folgt dieser Weiterleitung in der Standardkonfiguration nicht, was bedeutet, dass die Wiedergabe fehlschlägt.
Bei Bedarf können Sie ExoPlayer so konfigurieren, dass protokollübergreifende Weiterleitungen beim Instanziieren von DefaultHttpDataSource.Factory
-Instanzen in Ihrer Anwendung berücksichtigt werden. Weitere Informationen zum Auswählen und Konfigurieren des Netzwerk-Stacks
Warum schlagen einige Streams mit „UnrecognizedInputFormatException“ fehl?
Diese Frage bezieht sich auf Wiedergabefehler des folgenden Typs:
UnrecognizedInputFormatException: None of the available extractors
(MatroskaExtractor, FragmentedMp4Extractor, ...) could read the stream.
Für diesen Fehler gibt es zwei mögliche Ursachen. Die häufigste Ursache ist, dass Sie versuchen, DASH- (mpd), HLS- (m3u8) oder SmoothStreaming-Inhalte (ism, isml) abzuspielen, der Player aber versucht, sie als progressiven Stream wiederzugeben. Wenn Sie solche Streams abspielen möchten, müssen Sie das entsprechende ExoPlayer-Modul verwenden. Wenn der Stream-URI nicht mit der Standarddateiendung endet, können Sie auch MimeTypes.APPLICATION_MPD
, MimeTypes.APPLICATION_M3U8
oder MimeTypes.APPLICATION_SS
an setMimeType
von MediaItem.Builder
übergeben, um den Streamtyp explizit anzugeben.
Der zweite, weniger häufige Grund ist, dass ExoPlayer das Containerformat der Medien, die Sie wiedergeben möchten, nicht unterstützt. In diesem Fall funktioniert der Fehler wie vorgesehen. Sie können jedoch gerne einen Feature-Antrag in unserer Problemverfolgung einreichen, der Details zum Containerformat und einen Teststream enthält. Bitte suchen Sie nach einer vorhandenen Funktionsanfrage, bevor Sie eine neue einreichen.
Warum funktioniert „setPlaybackParameters“ auf einigen Geräten nicht richtig?
Wenn Sie einen Debug-Build Ihrer App unter Android M und niedriger ausführen, kann es bei Verwendung der setPlaybackParameters
API zu einer ruckeligen Leistung, hörbaren Artefakten und einer hohen CPU-Auslastung kommen. Das liegt daran, dass eine für diese API wichtige Optimierung für Debug-Builds, die auf diesen Android-Versionen ausgeführt werden, deaktiviert ist.
Wichtig: Dieses Problem betrifft nur Debug-Builds. Dies hat keine Auswirkungen auf Release-Builds, für die die Optimierung immer aktiviert ist. Die Releases, die Sie Endnutzern zur Verfügung stellen, sollten daher nicht von diesem Problem betroffen sein.
Was bedeuten Fehler vom Typ „Player is accessed on the wrong thread“?
Weitere Informationen finden Sie auf der Seite „Erste Schritte“ im Abschnitt Hinweis zu Threads.
Wie kann ich den Fehler „Unexpected status line: ICY 200 OK“ beheben?
Dieses Problem kann auftreten, wenn die Serverantwort eine ICY-Statuszeile anstelle einer HTTP-konformen Statuszeile enthält. ICY-Statuszeilen sind veraltet und sollten nicht verwendet werden. Wenn Sie den Server steuern, sollten Sie ihn so aktualisieren, dass er eine HTTP-konforme Antwort liefert. Wenn das nicht möglich ist, kann das Problem durch die Verwendung der ExoPlayer OkHttp-Bibliothek behoben werden, da sie ICY-Statuszeilen korrekt verarbeiten kann.
Wie kann ich abfragen, ob es sich bei dem wiedergegebenen Stream um einen Livestream handelt?
Sie können die isCurrentWindowLive
-Methode des Spielers abfragen. Außerdem können Sie in isCurrentWindowDynamic
nachsehen, ob das Fenster dynamisch ist, d. h. ob es sich im Laufe der Zeit noch aktualisiert.
Wie kann ich Audioinhalte weiter abspielen, wenn meine App im Hintergrund ausgeführt wird?
So sorgst du dafür, dass die Audiowiedergabe fortgesetzt wird, wenn sich deine App im Hintergrund befindet:
- Sie benötigen einen laufenden Dienst im Vordergrund. Dadurch wird verhindert, dass das System Ihren Prozess beendet, um Ressourcen freizugeben.
- Sie benötigen eine
WifiLock
und eineWakeLock
. Dadurch wird sichergestellt, dass das WLAN-Funkmodul und die CPU aktiv bleiben. Das ist ganz einfach, wenn SieExoPlayer
verwenden. Rufen Sie dazusetWakeMode
auf. Die erforderlichen Sperren werden dann automatisch zur richtigen Zeit abgerufen und freigegeben.
Es ist wichtig, dass Sie die Sperren lösen (wenn Sie setWakeMode
nicht verwenden) und den Dienst beenden, sobald keine Audioinhalte mehr wiedergegeben werden.
Warum unterstützt ExoPlayer meine Inhalte, die ExoPlayer Cast-Bibliothek aber nicht?
Möglicherweise ist der Inhalt, den du abspielen möchtest, nicht für CORS aktiviert. Das Cast-Framework erfordert, dass Inhalte für CORS aktiviert sind, damit sie wiedergegeben werden können.
Warum können Inhalte nicht abgespielt werden, obwohl kein Fehler angezeigt wird?
Möglicherweise unterstützt das Gerät, auf dem Sie die Inhalte wiedergeben, ein bestimmtes Media-Sample-Format nicht. Sie können das ganz einfach überprüfen, indem Sie Ihrem Player ein EventLogger
als Listener hinzufügen und in Logcat nach einer Zeile suchen, die dieser ähnelt:
[ ] Track:x, id=x, mimeType=mime/type, ... , supported=NO_UNSUPPORTED_TYPE
NO_UNSUPPORTED_TYPE
bedeutet, dass das Gerät das vom mimeType
angegebene Media-Beispielformat nicht decodieren kann. Informationen zu unterstützten Beispielformaten finden Sie in der Android-Dokumentation zu Media-Formaten. Wie kann ich eine Decodierungsbibliothek laden und für die Wiedergabe verwenden?
Wie kann ich eine Decodierungsbibliothek laden und für die Wiedergabe verwenden?
- Die meisten Decoderbibliotheken erfordern manuelle Schritte zum Auschecken und Erstellen der Abhängigkeiten. Achten Sie also darauf, dass Sie die Schritte in der README-Datei für die entsprechende Bibliothek ausgeführt haben. Für die ExoPlayer-FFmpeg-Bibliothek müssen Sie beispielsweise der Anleitung in libraries/decoder_ffmpeg/README.md folgen und Konfigurationsflags übergeben, um Decoder für alle Formate zu aktivieren, die Sie abspielen möchten.
- Achten Sie bei Bibliotheken mit nativem Code darauf, dass Sie die richtige Version des Android NDK verwenden, wie in der README-Datei angegeben. Achten Sie außerdem auf Fehler, die während der Konfiguration und des Builds auftreten. Nachdem Sie die Schritte in der README-Datei ausgeführt haben, sollten für jede unterstützte Architektur
.so
-Dateien im Unterverzeichnislibs
des Bibliothekspfads angezeigt werden. - Informationen zum Testen der Wiedergabe mit der Bibliothek in der Demoanwendung finden Sie unter Gebündelte Decoder aktivieren. Eine Anleitung zur Verwendung der Bibliothek in Ihrer eigenen App finden Sie in der README-Datei der Bibliothek.
- Wenn Sie
DefaultRenderersFactory
verwenden, sollte in Logcat eine Logzeile auf Informationsebene wie „Loaded FfmpegAudioRenderer“ angezeigt werden, wenn der Decoder geladen wird. Wenn das fehlt, muss die Anwendung eine Abhängigkeit von der Decodierungsbibliothek haben. - Wenn Sie in Logcat Logs auf Warnungsebene von
LibraryLoader
sehen, bedeutet das, dass das Laden der nativen Komponente der Bibliothek fehlgeschlagen ist. Wenn das passiert, prüfen Sie, ob Sie die Schritte in der README-Datei der Bibliothek korrekt ausgeführt haben und ob bei der Ausführung der Anleitung Fehler ausgegeben wurden.
Wenn Sie weiterhin Probleme mit Dekodierungsbibliotheken haben, sehen Sie in der Problemverfolgung von Media3 nach, ob es relevante aktuelle Probleme gibt. Wenn Sie ein neues Problem melden müssen, das sich auf das Erstellen des nativen Teils der Bibliothek bezieht, fügen Sie bitte die vollständige Befehlszeilenausgabe aus der Ausführung der README-Anleitung hinzu, damit wir das Problem besser diagnostizieren können.
Kann ich YouTube-Videos direkt mit ExoPlayer abspielen?
Nein, mit ExoPlayer können keine Videos von YouTube wiedergegeben werden, z. B. URLs der Form https://www.youtube.com/watch?v=...
. Stattdessen solltest du die YouTube IFrame Player API verwenden, die offizielle Methode zum Abspielen von YouTube-Videos auf Android.
Videowiedergabe ruckelt
Das Gerät kann die Inhalte möglicherweise nicht schnell genug decodieren, wenn z. B. die Bitrate oder Auflösung der Inhalte die Geräteleistung übersteigt. Möglicherweise müssen Sie Inhalte in geringerer Qualität verwenden, um auf solchen Geräten eine gute Leistung zu erzielen.
Wenn bei der Videowiedergabe auf einem Gerät mit einer Android-Version von Android 6.0 (API-Level 23) bis einschließlich Android 11 (API-Level 30) Ruckler auftreten, insbesondere bei der Wiedergabe von DRM-geschützten Inhalten oder Inhalten mit hoher Bildrate, können Sie die asynchrone Pufferwarteschlange aktivieren.
Instabile API-Lint-Fehler
Media3 garantiert die binäre Kompatibilität für einen Teil der API-Oberfläche. Die Teile, die keine binäre Kompatibilität garantieren, sind mit @UnstableApi
gekennzeichnet. Um diesen Unterschied deutlich zu machen, wird bei der Verwendung instabiler API-Symbole ein Lint-Fehler generiert, sofern sie nicht mit @OptIn
annotiert sind.
Die Anmerkung @UnstableApi
sagt nichts über die Qualität oder Leistung einer API aus, sondern nur, dass sie nicht „API-frozen“ ist.
Sie haben zwei Möglichkeiten, mit instabilen API-Lint-Fehlern umzugehen:
- Wechseln Sie zu einer stabilen API, die dasselbe Ergebnis liefert.
- Verwenden Sie die instabile API weiterhin und annotieren Sie die Verwendung mit
@OptIn
, wie später gezeigt.
Fügen Sie die Annotation @OptIn
hinzu.
Android Studio kann Ihnen dabei helfen, die Annotation hinzuzufügen:

Sie können auch bestimmte Verwendungsstellen in Kotlin manuell mit Anmerkungen versehen:
import androidx.annotation.OptIn
import androidx.media3.common.util.UnstableApi
@OptIn(UnstableApi::class)
fun functionUsingUnstableApi() { ... }
Und auch in Java:
import androidx.annotation.OptIn;
import androidx.media3.common.util.UnstableApi;
@OptIn(markerClass = UnstableApi.class)
private void methodUsingUnstableApis() { ... }
Sie können ganze Pakete aktivieren, indem Sie eine package-info.java
-Datei hinzufügen:
@OptIn(markerClass = UnstableApi.class)
package name.of.your.package;
import androidx.annotation.OptIn;
import androidx.media3.common.util.UnstableApi;
Ganze Projekte können aktiviert werden, indem der spezifische Lint-Fehler in der Datei lint.xml
unterdrückt wird:
<?xml version="1.0" encoding="utf-8"?>
<lint>
<issue id="UnsafeOptInUsageError">
<option name="opt-in" value="androidx.media3.common.util.UnstableApi" />
</issue>
</lint>
Es gibt auch eine kotlin.OptIn
-Annotation, die nicht verwendet werden sollte. Es ist wichtig, die Annotation androidx.annotation.OptIn
zu verwenden.