首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android音乐流处理器

Android音乐流处理器
EN

Stack Overflow用户
提问于 2017-06-17 13:06:42
回答 0查看 78关注 0票数 0

嗨,我正在构建一个用于音乐流媒体的原生android模块。当我尝试流式播放音乐时,它可以使用我加载的第一个URL,但当我尝试加载另一个URL时,应用程序崩溃。

以下是该模块的代码。

代码语言:javascript
复制
package com.mediaplayer;

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.AsyncTask;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;

import java.io.IOException;

public class MediaPlayerModule extends ReactContextBaseJavaModule {
    String stream = "http://stream.radioreklama.bg:80/radio1rock128";
    boolean prepared = false;
    boolean started = false;

    MediaPlayer mediaPlayer;
    PlayerTask playerTask;

    public MediaPlayerModule(ReactApplicationContext reactContext) {
        super(reactContext);
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    }

    @Override
    public String getName() {
        return "MediaPlayerModule";
    }


    @ReactMethod
    public void play(String url) {
        if(prepared){
            mediaPlayer.reset();
            mediaPlayer.release();
        }
        playerTask = new PlayerTask();
        playerTask.execute(url);
    }


    @ReactMethod
    public void pause() {

        if(mediaPlayer != null){
            mediaPlayer.reset();
            mediaPlayer.release();
            mediaPlayer = null;
        }
    }

    @ReactMethod
    public void resume() {
         if (started) {
            mediaPlayer.start();
         }
    }

    @ReactMethod
    public void destroy() {
         if (prepared) {
            mediaPlayer.release();
             started = false;
         }
    }

    class PlayerTask extends AsyncTask<String, Void, Boolean> {
        @Override
        protected Boolean doInBackground(String... strings) {
            Boolean prepared = false;

                try {
                    mediaPlayer.setDataSource(strings[0]);
                    mediaPlayer.prepare();
                    prepared = true;
                } catch (IOException e) {
                    e.printStackTrace();
                    prepared = false;
                }

            return prepared;
        }

        @Override
        protected void onPostExecute(Boolean aBoolean) {
            super.onPostExecute(aBoolean);
            mediaPlayer.start();
            started = true;

        }
    }
}

有一个包含歌曲和它们的URL的页面。当我在第一页上选择一首歌曲时,它会导航到带有歌曲URL的第二页。下面是第二个页面(播放歌曲的页面)的js代码:

代码语言:javascript
复制
var mp = require('react-native').NativeModules.MediaPlayerModule;

export default class Player extends Component {

    constructor(props) {
        super(props);
        this.state = {
            image: this.props.navigation.state.params.image,
            title: this.props.navigation.state.params.title,
            artistes: this.props.navigation.state.params.artistes,
            mp3Url:this.props.navigation.state.params.mp3Url
        }
    }

    componentDidMount(){
        mp.play(this.state.mp3Url);
    }
}

编辑:这里是logcat:

代码语言:javascript
复制
    --------- beginning of crash
06-17 07:21:28.544 2406-2432/com.downstream E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #3
                                                              Process: com.downstream, PID: 2406
                                                              java.lang.RuntimeException: An error occurred while executing doInBackground()
                                                                  at android.os.AsyncTask$3.done(AsyncTask.java:309)
                                                                  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
                                                                  at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
                                                                  at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                                                  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
                                                                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                                                                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                                                                  at java.lang.Thread.run(Thread.java:818)
                                                               Caused by: java.lang.IllegalStateException
                                                                  at android.media.MediaPlayer.nativeSetDataSource(Native Method)
                                                                  at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1085)
                                                                  at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1046)
                                                                  at com.mediaplayer.MediaPlayerModule$PlayerTask.doInBackground(MediaPlayerModule.java:118)
                                                                  at com.mediaplayer.MediaPlayerModule$PlayerTask.doInBackground(MediaPlayerModule.java:112)
                                                                  at android.os.AsyncTask$2.call(AsyncTask.java:295)
                                                                  at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
                                                                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
                                                                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
                                                                  at java.lang.Thread.run(Thread.java:818) 
06-17 07:21:28.914 2406-2428/com.downstream E/Surface: getSlotFromBufferLocked: unknown buffer: 0xae6b5f10
EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44600985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档