Android:如何检测所选音频正在 Android Studio 中播放

Posted

技术标签:

【中文标题】Android:如何检测所选音频正在 Android Studio 中播放【英文标题】:Android : How to detect that the selected audio is being played in Android Studio 【发布时间】:2018-08-28 19:30:45 【问题描述】:

我正在尝试制作一个音频播放器应用程序,所有这些应用程序都通过使用活动和服务顺利运行。但是当您选择音频并播放它时会有一个限制。 当前播放音频时,在选择相同音频时,我让它从头开始。

问题: 如何检测所选音频正在播放。如果所选音频与正在播放的音频不同,它将从头开始播放,但如果相同,则不会执行任何操作。

在我的活动中:

//connect to the service
  private ServiceConnection serviceConnection = new ServiceConnection()

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) 
            Services.MediaBinder binder = (Services.MediaBinder) service;
            //get service
            services = binder.getService();
            mediaBound = true;
        

        @Override
        public void onServiceDisconnected(ComponentName name) 
            mediaBound = false;
        
    ;

    @Override
    protected void onStart() 
        super.onStart();
        if(playIntent==null)
            playIntent = new Intent(this, Services.class);
            playIntent.putExtra("url", String.valueOf(urlRaw));
            bindService(playIntent, serviceConnection, Context.BIND_AUTO_CREATE);
            startService(playIntent);
        
    

在服务中: 使用 onBind 获取变量:

@Override
public IBinder onBind(Intent intent) 
    urlMedia = intent.getStringExtra("url");
    return mediaBinder; // private final IBinder mediaBinder

我在 onStartCommand 中使用来播放选定的音频。

@Override
    public int onStartCommand(Intent intent, int flags, int startId) 
        try 
            //An audio file is passed to the service through putExtra();

            if(isPng())
                mPlayer.release();
            

            mPlayer = MediaPlayer.create(getApplicationContext(), getResources().getIdentifier(String.valueOf(urlMedia),"raw",getPackageName()));
            mPlayer.start();
         catch (NullPointerException e) 
            stopSelf();
        

        if (mPlayer != null)
            initMusicPlayer();

        return START_STICKY;
    

【问题讨论】:

【参考方案1】:

使用另一个变量将新传递的url 保留在onBind() 方法中。然后检查新的url是否与旧的不同。

// On Bind
@Override
public IBinder onBind(Intent intent) 
    newUrlMedia = intent.getStringExtra("url");
    return mediaBinder; 


// On Start Command
@Override
public int onStartCommand(Intent intent, int flags, int startId) 
    try 
        if (newUrlMedia.equals(urlMedia)) 
            // Same url is passes
            return START_STICKY;
         else 
            // Different url 
            urlMedia = newUrlMedia;
            if(isPng())
                mPlayer.release();
            

            mPlayer = MediaPlayer.create(getApplicationContext(), getResources().getIdentifier(String.valueOf(urlMedia),"raw",getPackageName()));
            mPlayer.start();
        
     catch (NullPointerException e) 
        stopSelf();
    

    if (mPlayer != null)
        initMusicPlayer();

    return START_STICKY;

【讨论】:

【参考方案2】:

您正在使用绑定服务,因此您可以在服务中创建一个方法,例如

private String currentUrl;

public void playAudio(Sting url)
  if(currentUrl.equals(url)) return;
  this.currentUrl = url;
  //Do other stuff.

当服务连接时,你可以使用这个公共方法。

@Override
        public void onServiceConnected(ComponentName name, IBinder service) 
            Services.MediaBinder binder = (Services.MediaBinder) service;
            //get service
            services = binder.getService();
            services.playAudio("url");
            mediaBound = true;
        

【讨论】:

以上是关于Android:如何检测所选音频正在 Android Studio 中播放的主要内容,如果未能解决你的问题,请参考以下文章

检测未添加到 DOM 的音频元素

如何显示音频文件的预览?

使用霍夫变换opencv android进行矩形文档检测

如何检测其他应用程序是不是正在播放背景音频?

ExtAudioRecorder:“写入失败:EBADF(错误文件描述符)”将音频录制到 WAV 文件 - Android Studio

在 Windows 上使用音频检测进程