手把手教你安卓蓝牙显示歌词

安卓从4.3就已经支持蓝牙显示歌词了,但是需要客户端和服务端同时做处理,客户端将歌词通过avrcp协议携带到服务端,服务端只要按照蓝牙规范解析就可以了,关于蓝牙协议大家可以自行去看,这里就不具体说,直接看代码是如何实现的吧

1.系统服务端如何做的

packages/apps/Bluetooth/src/com/android/bluetooth/a2dpsink/mbs/A2dpMediaBrowserService

在A2dpMediaBrowserService.java中,看看系统蓝牙是这么解析出歌词的

    private void msgTrack(PlaybackState pb, MediaMetadata mmd) {
        Log.d(TAG, "msgTrack: playback: " + pb + " mmd: " + mmd);
        // Log the current track position/content.
        MediaController controller = mSession.getController();
        PlaybackState prevPS = controller.getPlaybackState();
        MediaMetadata prevMM = controller.getMetadata();

        if (prevPS != null) {
            Log.d(TAG, "prevPS " + prevPS);
        }

        if (prevMM != null) {
            String title = prevMM.getString(MediaMetadata.METADATA_KEY_TITLE);
            long trackLen = prevMM.getLong(MediaMetadata.METADATA_KEY_DURATION);
            Log.d(TAG, "prev MM title " + title + " track len " + trackLen);
        }

        if (mmd != null) {
            Log.d(TAG, "msgTrack() mmd " + mmd.getDescription());
            mSession.setMetadata(mmd);
        }

        if (pb != null) {
            Log.d(TAG, "msgTrack() playbackstate " + pb);
            PlaybackState.Builder pbb = new PlaybackState.Builder(pb);
            pb = pbb.setActions(mTransportControlFlags).build();
            mSession.setPlaybackState(pb);
        }
    }

我们可以看到,MediaMetadata prevMM = controller.getMetadata();通过prevMM这个对象拿到歌曲信息的,这儿的String title = prevMM.getString(MediaMetadata.METADATA_KEY_TITLE);这儿的title其实打印出来的就是歌词,当然,prevMM里面不仅仅携带有歌词,还有歌名,艺术家,专辑等信息,我们只要解析MediaMetadata对应的不同标签就可以获取到,下面是MediaMetadata所有的标签

String title = prevMM.getString(MediaMetadata.METADATA_KEY_TITLE;

String artist = prevMM.getString(MediaMetadata.METADATA_KEY_ARTIST;

String album = prevMM.getString(MediaMetadata.METADATA_KEY_ALBUM;

String title = prevMM.getString(MediaMetadata.METADATA_KEY_GENRE;

String title = prevMM.getString(MediaMetadata.METADATA_KEY_TRACK_NUMBER;

String title = prevMM.getString(MediaMetadata.METADATA_KEY_NUM_TRACKS;

String title = prevMM.getString(MediaMetadata.METADATA_KEY_DURATION;

String title = prevMM.getString(MediaMetadata.METADATA_KEY_MEDIA_ID;

不过我们只要歌词,歌名,艺术家就可以了,下面教大家一种比较简易的方法就是在系统添加一个广播,将这些信息携带出去,然后客户端直接接收广播拿到对应的信息就可以显示了,具体操作如下:

        if (prevMM != null) {
        String title = prevMM.getString(MediaMetadata.METADATA_KEY_TITLE);
        String AlbumTitle = prevMM.getString(MediaMetadata.METADATA_KEY_ALBUM);
        String artist = prevMM.getString(MediaMetadata.METADATA_KEY_ARTIST);
        long trackLen = prevMM.getLong(MediaMetadata.METADATA_KEY_DURATION);
        Intent intent = new Intent();
        intent.setAction("action");
        intent.putExtra("title",title);
        intent.putExtra("AlbumTitle",AlbumTitle);
        intent.putExtra("artist",artist);
        sendBroadcast(intent);
            Log.d(TAG, "prev MM title " + title + " track len " + trackLen);
        Log.d(TAG,"AlbumTitle:"+AlbumTitle);
        }

这样我们已经把要的东西已经拿出来了了,下面我们只要在应用端显示就可以了,接下来我们看看服务端怎么显示的

BroadcastReceiver mreceive = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if ("com.focconn.mateble".equals(action)){
            String lyric = intent.getStringExtra("title");
            String mAlbumTitle = intent.getStringExtra("AlbumTitle");
            String mArtist = intent.getStringExtra("artist");
            Log.i("say","歌词:"+lyric+" 歌名:"+mAlbumTitle);
            if (mAlbumTitle.length()==0||lyric.equals(mAlbumTitle)){
                textView.setText("暂无歌词");
            }else {
                textView.setText(lyric);
            }
            titlte.setText(mAlbumTitle);
            artist.setText(mArtist);
        }
    }
};

我们只要注册一个广播就可以拿到歌词和歌名了,是不是很简单。这只是接收,那么下面我们看看音乐播放器是怎么把这些信息发过来把。当然如歌不修改系统我们也能做,我们只要接收到BluetoothAvrcpController.ACTION_TRACK_EVENT.equals(action)这个广播如何显示歌词,也是可以的,但是这个广播时隐藏的,大家要么通过反射或者导入framework.jar都可以,不过修改系统是最方便的,但是缺点是,在播放时会不停的发送广播。

2.客户端如何发送歌词的

客户端是同过avrcp将歌曲信息传送过去的,具体的我们来看播放器的代码:

public void put(){
    mSession = new MediaSession(getApplicationContext(), "remusic");
    Log.i("Music","mIsSupposedToBePlaying:"+mIsSupposedToBePlaying+"STATE_PLAYING:"+PlaybackState.STATE_PLAYING
            +"  PlaybackState.ACTION_PLAY:"+PlaybackState.ACTION_PLAY);
    int playState = mIsSupposedToBePlaying
            ? PlaybackState.STATE_PLAYING
            : PlaybackState.STATE_PAUSED;

        mSession.setPlaybackState(new PlaybackState.Builder()
                .setState(playState, 1, 1.0f)
                .setActions(PlaybackState.ACTION_PLAY | PlaybackState.ACTION_PAUSE | PlaybackState.ACTION_PLAY_PAUSE |
                        PlaybackState.ACTION_SKIP_TO_NEXT | PlaybackState.ACTION_SKIP_TO_PREVIOUS)
                .build());

    Bitmap albumArt = null;
    if (albumArt != null) {

        Bitmap.Config config = albumArt.getConfig();
        if (config == null) {
            config = Bitmap.Config.ARGB_8888;
        }
        albumArt = albumArt.copy(config, false);
    }
        Log.i("Music","updateMediaSession");
        mSession.setMetadata(new MediaMetadata.Builder()
                .putString(MediaMetadata.METADATA_KEY_ARTIST, artist)
                .putString(MediaMetadata.METADATA_KEY_ALBUM, album)
                .putString(MediaMetadata.METADATA_KEY_TITLE, title)
                .build());
        mSession.setActive(true);
}

这儿只是最简易的发送,我是通过手动点击发送测试的,具体的大家要根据播放音乐时获取到的歌词来调用,这样歌词就可以和音乐同步显示了。现在音乐客户端这一块,QQ音乐已经支持了歌词发送,也就是说只要在服务端做处理就可以了,而酷狗,网易等只有歌名和艺术家,不知道以后会不会有支持。到了这儿,客户端和服务端实现原理都讲清楚了,大家有需要的可以了解了解。我也参考了一些网上资料和看了一些系统源码写的这个,如果有什么问题欢迎指教。

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 蓝牙是一种无线通信技术,可使不同设备之间实现数据交流和传输。学习如何下载蓝牙pdf文件可以帮助我们更好地利用蓝牙技术,并将其应用于我们的日常生活中。 首先,我们需要了解如何打开设备的蓝牙功能。这通常可以在设备的设置菜单中找到。一旦找到并打开蓝牙功能,设备就可以开始搜索附近的蓝牙设备。 接下来,我们需要找到提供蓝牙pdf下载的设备或来源。这可以是另一个设备,如手机或电脑,或通过蓝牙接收器连接到打印机或其他外部设备。确保该设备已开启并处于可见状态,以便被其他设备检测到。 接下来,我们需要在设备上选择要下载的蓝牙pdf文件。这可能需要进入文件管理或文档阅读应用程序,并找到目标文件。一旦找到文件,我们可以选择将其发送到蓝牙设备。 在发送文件之前,我们将被要求选择目标设备。这将显示附近的可用蓝牙设备列表。选择我们要连接的设备,然后点击发送按钮。 然后,目标设备将显示一个提示,询问我们是否接受发送的文件。在目标设备上,我们需要确认文件接受请求。 一旦目标设备接受文件,蓝牙传输就会开始。这可能需要一些时间,具体取决于文件的大小和设备之间的蓝牙连接质量。一旦传输完成,我们就可以在目标设备上找到已下载的蓝牙pdf文件。 通过这种手把手的学习过程,我们可以学会如何使用蓝牙技术下载pdf文件。这将为我们提供方便和灵活性,使我们能够更好地利用无线通信技术。 ### 回答2: 蓝牙PDF下载的步骤相对简单,下面我将以手把手的方式你如何进行操作。 首先,确保你的设备具备蓝牙功能。通常,大多数智能手机、平板电脑和电脑都已经内置了蓝牙模块。如果你的设备不具备蓝牙功能,你可以考虑购买一个蓝牙适配器。 接下来,确保你已经打开了蓝牙功能。这通常可以在设备的设置菜单中找到。在Android设备中,你可以在"设置"菜单中找到"蓝牙"选项。在iOS设备(如iPhone或iPad)中,你可以在"设置"菜单的顶部找到蓝牙开关。 启动蓝牙后,设备将自动搜索周围的可用蓝牙设备。在PDF文件的来源设备上,确保该设备已经设置为可被其它蓝牙设备发现。在设备的设置菜单中,你应该能够找到相关选项。在某些设备上,你可能需要设置一个固定的蓝牙配对PIN码。 在PDF来源设备上,打开你想要分享或发送的PDF文件。然后,选择分享选项,通常是一个"分享"或"发送"按钮。在选择分享选项后,你应该能够看到蓝牙图标,代表你可以使用蓝牙进行文件传输。 点击蓝牙图标后,设备将开始搜索附近的蓝牙设备。在搜索结果中,应该能够看到你想要与之分享文件的设备名称。选择该设备后,系统将提示你进行配对。在进行配对时,请确保同意配对请求并输入相应的配对PIN码,如果有的话。 一旦配对成功,文件传输将自动开始。传输时间取决于文件大小和蓝牙设备之间的距离。在传输过程中,请确保设备之间保持一定的距离,以确保连接稳定。 完成以上步骤后,你就成功地使用蓝牙下载了PDF文件。在接收设备上,你可以在相应的文件夹中找到下载好的PDF文件。 ### 回答3: 学习如何通过蓝牙下载PDF文件是一项非常实用的技能。下面我将手把手你如何进行操作。 首先,确保你的设备(例如手机或电脑)已经连接到蓝牙。在设置或控制面板中,查找并打开蓝牙设置选项。启用蓝牙功能并确保可见性设置为“可见”或“所有设备可见”。 接下来,找到你想要下载的PDF文件。这可以是来自互联网的在线PDF文件,也可以是其他设备上已下载好的文件。 如果你要下载在线PDF文件,找到该文件的下载链接。在你的设备上打开浏览器,并粘贴或输入下载链接地址。然后点击“下载”按钮。 如果你要下载其他设备上的文件,确保蓝牙已经与该设备连接。在你的设备上打开文件管理器或资源管理器,并找到蓝牙连接的设备。在设备列表中选择该设备,并浏览文件夹以找到目标PDF文件。 无论是在线PDF文件还是其他设备上的文件,点击文件后,选择“分享”或“发送”选项。在弹出的分享列表中,选择蓝牙选项。 然后,选择接收蓝牙传输的设备。如果你的设备已连接多个蓝牙设备,确保选择正确的设备。然后开始传输。 在接收设备上,你需要确认接受蓝牙文件传输。根据设备的操作系统,你可能需要点击“接受”、“确定”或类似选项。等待传输完成。 完成以上步骤后,你将成功通过蓝牙下载了你想要的PDF文件。你可以在设备的文件管理器或下载文件夹中找到并打开该文件。 希望以上步骤能够帮助你学会如何通过蓝牙下载PDF文件。如果你还有其他问题,请随时提问。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值