有没有一种方法可以在Flutter中控制系统音乐?

3

我希望在Flutter应用程序中控制播放不同应用程序(如Spotify / Youtube Music等)正在播放的音乐,例如暂停/播放和跳过。有没有办法实现这个功能?

提前感谢!

1个回答

1

据我所知,目前没有适用于此的软件包。我有一个仅支持 Android 的应用程序,我正在尝试让它正常工作,解决方法是创建一个平台通道,然后执行某些操作。

package com.example.myapp

import android.content.Context
import android.content.Intent
import android.media.AudioManager
import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.KeyEvent
import androidx.annotation.RequiresApi
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.BinaryMessenger
import io.flutter.plugin.common.MethodChannel

class MainActivity: FlutterActivity() {
  private val METHOD_CHANNEL_NAME = "com.example.myapp/media_control"
  private var methodChannel: MethodChannel? = null
  private var audioManager: AudioManager? = null;

  @RequiresApi(Build.VERSION_CODES.O)
  override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
      super.configureFlutterEngine(flutterEngine)

      setupChannels(this, flutterEngine.dartExecutor.binaryMessenger)
  }

  @RequiresApi(Build.VERSION_CODES.O)
  override fun onCreate(savedInstanceState: Bundle?) {
      audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
      super.onCreate(savedInstanceState)
  }

  @RequiresApi(Build.VERSION_CODES.O)
  private fun setupChannels(mainActivity: MainActivity, binaryMessenger: BinaryMessenger) {
      methodChannel = MethodChannel(binaryMessenger, METHOD_CHANNEL_NAME)
      methodChannel!!.setMethodCallHandler { call, result ->
            if(call.method == "pause") {
                sendMediaButton(KeyEvent.KEYCODE_MEDIA_PAUSE)
                result.success("Success");
            }
            else if (call.method == "play") {
                sendMediaButton(KeyEvent.KEYCODE_MEDIA_PLAY)
                result.success("Success");
            }
            else if (call.method == "skipNext") {
                sendMediaButton(KeyEvent.KEYCODE_MEDIA_NEXT)
                result.success("Success");
            }
            else if (call.method == "skipPrevious") {
                sendMediaButton(KeyEvent.KEYCODE_MEDIA_PREVIOUS)
                result.success("Success");
            }
      }
  }

    private fun sendMediaButton(keyCode: Int) {
        var keyEvent = KeyEvent(KeyEvent.ACTION_DOWN, keyCode)
        audioManager!!.dispatchMediaKeyEvent(keyEvent)

        keyEvent = KeyEvent(KeyEvent.ACTION_UP, keyCode)
        audioManager!!.dispatchMediaKeyEvent(keyEvent)
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接