MediaPlayer setDataSource ist fehlgeschlagen mit Status = 0x80000000 für den Klingelton, der über den Dateipfad unter 2.3.4 festgelegt wurde
Titel sagt das meiste.
Meine Anwendung spielt Klingeltöne zeigte uri wie content://media/internal/audio/media/387
oder content://media/external/audio/media/1655
(für benutzerdefinierte Klingeltöne auf der SD-Karte glaube ich) mit beiden setDataSource(fileInfo)
und setDataSource(mContext, Uri.parse(fileInfo))
.
In jedem Fall erhielt ich die Protokolle mit Informationen über setDataSource failed.: status=0x80000000
Ausnahme für Telefone mit Android 4.x (verschiedene Versionen).
Sehen, dass der Fehler passiert nur, um Klingeltöne Spitzen von content-uri, aber nicht auf einzelne Dateien hingewiesen, die von Weg, habe ich beschlossen, Wege für Klingeltöne als auch das problem der oben genannten Handys (während immer noch mit setDataSource(mContext, Uri.parse(fileInfo))
)
Es hat allerdings begann Probleme auf Handys mit Android 2.3.4-2.3.6 (nicht auf meinen 2.3.3):
- Ich empfangen habe einige logs mit Ausnahme:
setDataSource failed.: status=0x80000000
für Dateien mit Pfaden wie/system/media/audio/ringtones/TwirlAway.ogg
- Habe ich auch bekommen ein Protokoll über
MediaPlayer.onErrorListener.onError(int what, int extra)
Aufruf der Methode mitwhat=1
undextra=-2147483648
die, was weiß ich, vorschlagen, entweder, dass die Datei fehlt oder ist beschädigt. Aber ichFile file = new File(fileInfo); if (!file.exists())
check-in eine solche situation und es zurückgegeben, die Datei existiert - ist es beschädigt ist dann? Höchst unwahrscheinlich, dass für die Musik-Datei in den internen Speicher.
Zusammenfassend:
- arbeitet mit
setDataSource("content://media/internal/audio/media/52")
- wirft Ausnahme:
setDataSource failed.: status=0x80000000
fürsetDataSource(mContext, "/system/media/audio/ringtones/TwirlAway.ogg")
Interessant, die ersten paar Zeilen setDataSource(Context context, Uri uri, Headers headers)
Methode, die aufgerufen wird, durch setDataSource(Context context, Uri uri)
sind (von GrepCode Quelle für 2.3.4):
String scheme = uri.getScheme();
if(scheme == null || scheme.equals("file")) {
setDataSource(uri.getPath());
return;
}
So, nachdem alle, es ist einfach fehl setDataSource("/system/media/audio/ringtones/TwirlAway.ogg")
. Ich habe genommen die Pfade zu den Klingeltönen von uris mit:
private static String getRingtonePathFromContentUri(Context context,
Uri contentUri) {
String[] proj = { MediaStore.Audio.Media.DATA };
Cursor ringtoneCursor = context.getContentResolver().query(contentUri,
proj, null, null, null);
ringtoneCursor.moveToFirst();
return ringtoneCursor.getString(ringtoneCursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
}
Irgendwelche Ideen was kann das verursachen Fehler werfen? Vielleicht sind einige Probleme, die durch mangelnde lese-Berechtigungen?
Ich denke, source-code für native setDataSource(String path) - Funktion würde helfen, eine Menge, aber ich war nicht in der Lage, es zu finden.
InformationsquelleAutor der Frage Koger | 2013-05-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Antwort von Lorne unten war sehr hilfreich beim Umgang mit diesem problem.
Für jemand anderes mit ihm zu kämpfen, hier ist der code, den ich schon seit über 6 Monaten mit Fehler fast nicht mehr gemeldet.
fileinfo
kann sowohl von unten (Beispiele):/system/media/audio/alarms/Walk_in_the_forest.ogg
content://media/internal/audio/media/20
InformationsquelleAutor der Antwort Koger
Gab es eine änderung im Verhalten der
setDataSource(String path)
wegen eines bug-fix in Android 4.1.1. In 4.1.1 oder später müssen Sie einen lokalen Pfad (ohne Protokoll). Allerdings auf 4.0.4 und früher, mussten Sie eine URI (z.B. mit file://Protokoll).Hier ist eine unvollständige code-snippet, die illustrieren sollten Sie die Problemumgehung:
InformationsquelleAutor der Antwort Lorne Laliberte
Müssen Sie explizit festlegen der Länge der Datei. Die überladene Methode:
AssetFileDescriptor afd = ctx.getAssets().openFd([your asset name]);
mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
InformationsquelleAutor der Antwort Subtle Fox
Ich hatte den gleichen Fehler, wenn ich versuche zu spielen .wav-Datei. Wir machen ein Beispiel:
Bekam ich auch die status=0x80000000 Fehler. In meinem Fall war die Lösung zu re-codieren der audio-Datei (zum Beispiel 16-BIT-PCM für eine .wav-Datei) und alles funktionierte wie erwartet.
InformationsquelleAutor der Antwort Dennis Allert
Können Sie es nicht tun, weil Vorbereitung wurde gerufen, die erstellen-Funktion, daher können Sie nicht ändern, Audio Stream-Type nach.
Code unten ist funktionierte gut für mich:
InformationsquelleAutor der Antwort Taras Okunev