Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何让Android MediaPlayer运行我的http url?与其他网址,它的工作刚刚好_Java_Node.js_Express_Audio_Android Mediaplayer - Fatal编程技术网

Java 如何让Android MediaPlayer运行我的http url?与其他网址,它的工作刚刚好

Java 如何让Android MediaPlayer运行我的http url?与其他网址,它的工作刚刚好,java,node.js,express,audio,android-mediaplayer,Java,Node.js,Express,Audio,Android Mediaplayer,所以我想建立一个应用程序,从我的后端服务器流音乐。为此,我使用MongoDB创建了一个节点JS Express API。然后我有一个类似这样的url:http://192.168.178.26:3000/stream?id=5dd5065f3b9a2a22149fdb09&format=mp3 当我在浏览器(Opera)中键入此url时,它将按预期播放音乐。邮递员也是这样 然后我用Android Studio为Android编写了一个应用程序,它可以从给定的url流式播放音乐。当我尝试此url时

所以我想建立一个应用程序,从我的后端服务器流音乐。为此,我使用MongoDB创建了一个节点JS Express API。然后我有一个类似这样的url:
http://192.168.178.26:3000/stream?id=5dd5065f3b9a2a22149fdb09&format=mp3

当我在浏览器(Opera)中键入此url时,它将按预期播放音乐。邮递员也是这样

然后我用Android Studio为Android编写了一个应用程序,它可以从给定的url流式播放音乐。当我尝试此url时,效果很好:
https://www.ssaurel.com/tmp/mymusic.mp3
,但不是我的。当我尝试使用我的url时,MediaPlayer在准备时失败。错误如下:
准备失败:状态=0x1
。我搜索了这个错误,发现它的意思是
未知错误

我的后端代码:

const express=require('express');
const dbHandler=require('./src/dbHandler/dbHandler.js');
常数fs=要求('fs');
常量app=express();
app.get('/stream',(req,res)=>{
log(`Got stream request from${req.ip}…`);
dbHandler.getFilePath(req.query.id,req.query.format)。然后((path)=>{
设stat=fs.statSync(path);
res.set({
“内容类型”:“音频/mpeg”,
“内容长度”:stat.size,
“接受范围”:“字节”,
“缓存控制”:“最大年龄=3600”
});
fs.createReadStream(path).pipe(res);
}).catch(错误=>{
资源状态(400).发送(错误)
})
})
app.listen(3000,()=>{
log(`Server正在侦听3000…`);
dbHandler.init();
})
如您所见,当服务器收到流请求时,它会将其打印出来。
dbHandler.getFilePath()
-方法只返回mp3位置的完整路径,如下所示:
D:/Music/song.mp3
。当我和邮递员一起尝试时,服务器收到一个请求并打印它。然后邮递员把音乐流拿回来,我就可以开始播放音乐了

当我在我的智能手机上尝试使用浏览器时,它也起了作用。因此,我可以通过智能手机的浏览器播放音乐,但不能使用我的应用程序

需要注意的是,当我尝试准备MediaPlayer时,服务器没有收到请求。因此,提交请求并不是记录到控制台

这是我的应用程序的代码:

package sharemusic.truerushhunt3r.de.sharemusic.frontend;
导入android.media.AudioManager;
导入android.media.MediaPlayer;
导入android.net.Uri;
导入android.os.AsyncTask;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.view;
导入android.widget.ImageButton;
导入android.widget.Toast;
导入java.io.IOException;
导入sharemusic.truerushhunt3r.de.sharemusic.R;
公共类MainActivity扩展了AppCompatActivity{
//私有GetHandler;
私有布尔isplay=false;
private boolean initialStage=true;
私人媒体播放器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//getHandler=新的getHandler();
player=新媒体播放器();
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
ImageButton playButton=findViewById(R.id.playButton);
playButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
如果(!显示){
Log.d(“共享音乐/按钮”,“按播放”);
Toast.makeText(getApplicationContext(),“Play”,Toast.LENGTH\u SHORT.show();
如果(初始阶段){
//新建播放机()。执行(“https://www.ssaurel.com/tmp/mymusic.mp3");
新建播放机()。执行(“http://192.168.178.26:3000/stream?id=5dd5065f3b9a2a22149fdb09&format=mp3");                    
}否则{
如果(!player.isPlaying()){
player.start();
}
}
isplay=true;
}否则{
Log.d(“共享音乐/按钮”,“暂停按下”);
Toast.makeText(getApplicationContext(),“Pause”,Toast.LENGTH\u SHORT.show();
if(player.isPlaying()){
player.pause();
}
isplay=false;
}
}
});  
}
@凌驾
受保护的void onPause(){
super.onPause();
如果(玩家!=null){
player.reset();
player.release();
player=null;
}
}
类播放器扩展异步任务{
@凌驾
受保护的布尔doInBackground(字符串…字符串){
布尔值=假;
试一试{
setDataSource(getApplicationContext(),Uri.parse(strings[0]);
player.setOnCompletionListener(新的MediaPlayer.OnCompletionListener(){
@凌驾
完成时的公共作废(MediaPlayer mp){
初始阶段=真;
isplay=false;
mp.stop();
mp.reset();
}
});
player.prepare();
准备好=正确;
}捕获(例外e){
Log.e(“ShareMusic”,e.getMessage());
}
准备好报税表;
}
@凌驾
受保护的void onPostExecute(布尔aBoolean){
super.onPostExecute(aBoolean);
if(阿布奥兰语){
player.start();
初始阶段=假;
isplay=false;
}否则{
Toast.makeText(getApplicationConte)