Androidx 蓝牙音乐获取歌词

在现代的音乐播放器应用中,获取当前播放歌曲的歌词是一项非常受用户欢迎的功能。尤其在使用蓝牙耳机或扬声器时,将歌词实时显示出来,能够极大提升用户的听歌体验。本文将介绍如何使用 androidx 库实现蓝牙音乐的歌词获取功能,并附上完整的代码示例和流程图。

一、概述

要实现这个功能,我们需要利用 Android 的蓝牙相关 API 以及音乐播放相关的 API。以下是整个流程的概述:

  1. 连接到蓝牙设备
  2. 确定接收音乐信息(如歌曲名称、歌手等)
  3. 获取歌词
  4. 更新用户界面

二、流程图

以下是整个流程的可视化图示:

flowchart TD
    A[连接蓝牙设备] --> B[获取播放信息]
    B --> C{歌曲信息是否可用?}
    C -->|是| D[提取歌曲名称]
    C -->|否| E[显示错误]
    D --> F[获取歌词]
    F --> G[更新用户界面]

三、实现步骤

1. 连接蓝牙设备

首先,我们需要确保设备能够连接到蓝牙设备。可以使用如下代码片段:

BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter == null) {
    // 设备不支持蓝牙
} else {
    if (!bluetoothAdapter.isEnabled()) {
        Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
    }
}

2. 获取播放信息

通过 MediaSessionMediaController API,我们可以获取当前播放的媒体信息。代码示例如下:

MediaSessionManager mediaSessionManager = (MediaSessionManager) getSystemService(Context.MEDIA_SESSION_SERVICE);
List<MediaController> mediaControllers = mediaSessionManager.getActiveSessions(null);
for (MediaController mediaController : mediaControllers) {
    MediaMetadata metadata = mediaController.getMetadata();
    if (metadata != null) {
        String title = metadata.getString(MediaMetadata.METADATA_KEY_TITLE);
        String artist = metadata.getString(MediaMetadata.METADATA_KEY_ARTIST);
        // 进一步处理数据
    }
}

3. 获取歌词

获取歌词的最佳方式是调用一个公开的歌词 API。以下是如何调用该 API 的一个示例:

private void fetchLyrics(String title, String artist) {
    String url = " + artist + "/" + title;

    RequestQueue queue = Volley.newRequestQueue(this);
    StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
        response -> {
            try {
                JSONObject jsonObject = new JSONObject(response);
                String lyrics = jsonObject.getString("lyrics");
                // 更新UI展示歌词
                updateLyricsView(lyrics);
            } catch (JSONException e) {
                e.printStackTrace();
                // 处理错误
                showError();
            }
        },
        error -> {
            // 处理网络错误
            showError();
        });

    queue.add(stringRequest);
}

4. 更新用户界面

最后,将获取到的歌词更新到用户界面上:

private void updateLyricsView(String lyrics) {
    TextView lyricsTextView = findViewById(R.id.lyricsTextView);
    lyricsTextView.setText(lyrics);
}

四、完整代码示例

结合上面的代码片段,以下是一个功能完整的示例:

public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_ENABLE_BT = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        connectBluetooth();
        getSongInfo();
    }

    private void connectBluetooth() {
        BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if (bluetoothAdapter == null) {
            // 设备不支持蓝牙
        } else {
            if (!bluetoothAdapter.isEnabled()) {
                Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
            }
        }
    }

    private void getSongInfo() {
        MediaSessionManager mediaSessionManager = (MediaSessionManager) getSystemService(Context.MEDIA_SESSION_SERVICE);
        List<MediaController> mediaControllers = mediaSessionManager.getActiveSessions(null);
        for (MediaController mediaController : mediaControllers) {
            MediaMetadata metadata = mediaController.getMetadata();
            if (metadata != null) {
                String title = metadata.getString(MediaMetadata.METADATA_KEY_TITLE);
                String artist = metadata.getString(MediaMetadata.METADATA_KEY_ARTIST);
                fetchLyrics(title, artist);
            }
        }
    }

    private void fetchLyrics(String title, String artist) {
        String url = " + artist + "/" + title;

        RequestQueue queue = Volley.newRequestQueue(this);
        StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            response -> {
                try {
                    JSONObject jsonObject = new JSONObject(response);
                    String lyrics = jsonObject.getString("lyrics");
                    updateLyricsView(lyrics);
                } catch (JSONException e) {
                    e.printStackTrace();
                    showError();
                }
            },
            error -> showError());

        queue.add(stringRequest);
    }

    private void updateLyricsView(String lyrics) {
        TextView lyricsTextView = findViewById(R.id.lyricsTextView);
        lyricsTextView.setText(lyrics);
    }

    private void showError() {
        Toast.makeText(this, "无法获取歌词", Toast.LENGTH_SHORT).show();
    }
}

五、总结

通过上述步骤,我们成功实现了一个简单的功能:从蓝牙设备获取当前播放歌曲的歌词。运用 androidx 库的蓝牙 API 和媒体信息 API,我们可以轻松地提取当前播放歌曲的信息,并及时更新用户界面,让用户享受到更好的听歌体验。希望这篇文章能对你有所帮助,祝你编程愉快!