1

Я получаю нарушение директивы политики безопасности контента при попытке воспроизвести mp3 из кодированной в base64 строки.Как играть в кодированный base64 mp3 из строки в приложении Chrome для Chrome на Android?

Контекст: Я разрабатываю приложение Chrome, которое я конвертирую в приложение для Android с помощью Apache Cordova. При запуске Chrome App на моем компьютере все работает как шарм, но при запуске приложения под Android я вижу следующее сообщение об ошибке в консоли:

Refused to load media from 'data:audio/mp3;base64,//tQxAAAAA…AAAAD/' because it violates the following Content Security Policy directive: "media-src *". 

Код довольно прост:

var sound = 'data:audio/mp3;base64,//tQxAAAAAAAAAAAAAA…AAD/'; 
new Audio(sound).play(); 

Насколько я вижу, я не могу ослабить ограничение «media-src *». Я добавил это к моему index.html:

<meta http-equiv="Content-Security-Policy" content="media-src *"> 

И это (только для тестирования) на мой config.xml:

<allow-navigation href="*"/> 
<allow-intent href="*"/> 

Но нет успеха ...

Я также попробовал то, что был описан here.

function onSuccess() {         
    console.log('success', arguments);      
}              
function onError() {          
    console.log('error', arguments);      
}              
function onStatus() {         
    console.log('status', arguments);      
}              
var player = new Media(sound, onSuccess, onError, onStatus); 
console.log('Using cca Media');       
player.play() 

Выход:

Using cca Media 
status { 0: 1 } 
error { 0: { code: 1 } } 

Так что это не кажется, подходит для воспроизведения музыки из строки base64, потому что я вижу это, когда проверка LogCat:

I/MediaPlayerService(28744): [setDataSource] setDataSource(/storage/sdcard0/data:audio/mp3;base64,//tQxAAAAAA…bR+0Ne 
D/MediaPlayerFactory(28744): getPlayerType(): using url, check for DRM protected midi. 
D/DrmMtkUtil/DrmUtil(28744): checkDcf ----> path [/storage/sdcard0/data:audio/mp3;base64,//tQxAAAAAA…t5A2r/ 
V/DrmMtkUtil/DrmUtil(28744): checkExistence ----> [/storage/sdcard0/data:audio/mp3;base64,//tQxAAAAAA…Vt5A2r 
E/DrmMtkUtil/DrmUtil(28744): checkExistence failed, reason [File name too long] 
E/DrmMtkUtil/DrmUtil(28744): checkDcf: file does not exist. 
D/MediaPlayerService(28744): player type = 4 
E/DrmMtkUtil(28744): [ERROR]isDcf() : failed to dup fd, reason [File name too long] 
I/MediaPlayerService(28744): [setDataSource] setDataSource(/storage/sdcard0/data:audio/mp3;base64,//tQxAAAAAAA…txIbR+0Ne 
I/MediaPlayerService(28744): [prepareAsync] [45] prepareAsync 
D/NuPlayer(28744): kWhatPrepare, source type = 0 
E/  (28744): Failed to open file '/storage/sdcard0/data:audio/mp3;base64,//tQxAAAAA…5A2r/ 

Это предполагает источник это имя файла. Я также ничего не нашел в документации, чтобы заставить его интерпретировать его как URI данных.

На самом деле this question был мой самый горячий свинец, но разрешение не совсем понятно для меня, так как это выглядит он (в конечном счете) успешно делает это именно так, как я безуспешно пытался его ...

Итак, что является правильным способом воспроизведения звука из кодированной в base64 строки в Android?

+0

Важные строки выглядят как 'E/DrmMtkUtil/DrmUtil (28744): checkExistence failed, reason [Имя файла слишком длинное]' и 'E/DrmMtkUtil (28744): [ERROR] isDcf(): не удалось выполнить дуплекс fd, Причина [Имя файла слишком длинная] ', посмотрите на преобразование _Base64_ в _Blob_, генерируя _Object URL_ из _Blob_ (этот URL-адрес будет намного короче, потому что это всего лишь хэш для файла на диске), играя файл в _Object URL_ –

+0

Это может сработать, но что-то по-прежнему не так: '[ERROR] isDcf(): не удалось выполнить команду fd, reason [Нет такого файла или каталога]' и более конкретно 'Не удалось открыть файл '/ storage/sdcard0/blob: file% 3A /// 4cdb5ef6-db62-4bd1-bb2b-0eafd8303a62' . (Нет такого файла или каталога) 'URL, который я создаю, это' blob: file% 3A /// 4cdb5ef6-db62-4bd1-bb2b-0eafd8303a62'. Мне кажется, что префикс (выполняемый функцией Media где-то в этом процессе) с '/ storage/sdcard0 /' вызывает проблемы здесь или должен быть таким? – Heye

+0

Связанный вопрос использует mimetype «audio/mpeg» для URL-адреса данных (не «audio/mp3»), подкрепленный этим вопросом на [Какой тип mime я должен использовать для mp3] (http://stackoverflow.com/questions/10688588 /, который-мим-типа должен-я-использование-для-mp3). – traktor53

ответ

2

Вы пытались добавить data: в media src? * не охватывает все значения, как вы думаете.

+0

Ahh okay, теперь я попробовал' '. Это правильно интерпретируется при запуске приложения Chrome на моем настольном компьютере. Но при развертывании на моем телефоне он все еще говорит, что он нарушает директиву «media-src *». Так что на моем телефоне идет другая директива. – Heye