Не удается найти аудиофайлы, подготовленные с использованием источника HTTP (Android MediaPlayer) - PullRequest
0 голосов
/ 11 июня 2019

Итак, я пытаюсь создать своего рода медиаплеер, приложение подготавливает аудио из внешнего источника (HTTP-сервер сидит на другом устройстве), когда пытается найти возврат MediaPlayer «Поток не имеет длительности и поэтому не доступный для поиска "

Примечание. Я видел вопросы об одной и той же ошибке, но они касались живых потоков, это статический файл MP3.

Код с другого устройства (сервер аудиофайлов)

private static void WriteFile(HttpListenerContext ctx, Android.Net.Uri uri, Activity activity)
        {
            var response = ctx.Response;
            Debug.Print(ctx.Request.RemoteEndPoint.ToString());
            using (var file = activity.ContentResolver.OpenInputStream(uri))
            {
                string fileName = "Audio.mp3";
                ICursor cursor = activity.ContentResolver.Query(uri, null, null, null, null);
                try
                {
                    if (cursor != null && cursor.MoveToFirst())
                        fileName = cursor.GetString(cursor.GetColumnIndex(OpenableColumns.DisplayName));
                }
                finally
                {
                    cursor.Close();
                }
                response.SendChunked = false;
                response.ContentType = "audio/mpeg";
                response.AddHeader("Content-disposition", "attachment; filename=" + fileName);

                byte[] buffer = new byte[64 * 1024];
                int read;
                using (BinaryWriter bw = new BinaryWriter(response.OutputStream))
                {
                    while ((read = file.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        bw.Write(buffer, 0, read);
                        bw.Flush();
                    }
                    bw.Close();
                    response.ContentLength64 = bw.BaseStream.Length;
                }

                response.StatusCode = (int)HttpStatusCode.OK;
                response.StatusDescription = "OK";
                response.OutputStream.Close();
            }

1 Ответ

0 голосов
/ 11 июня 2019

Я не уверен, как этот код не генерирует исключение "не удается получить доступ к закрытому потоку":

bw.Close();
response.ContentLength64 = bw.BaseStream.Length;

Но ... получить длину перед закрытием потока:

response.ContentLength64 = bw.BaseStream.Length;
bw.Close();
...