获取音乐文件中包含的一些信息,如封面图片,时长等(MusicUtils)

MusicUtils源码:

import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Matrix
import android.media.MediaMetadataRetriever
import android.media.MediaPlayer
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.graphics.painter.BitmapPainter
import androidx.compose.ui.graphics.painter.Painter
import com.frstudio.hmp3.App
import com.frstudio.hmp3.R
import com.frstudio.hmp3.utils.KMath

object MusicUtils {
    fun getDurationText(duration: Long):String{
        return KMath.timeStr(duration)
    }
    //获取音乐长度 ms
    fun getDuration(path:String):Long{
        val mediaPlayer = MediaPlayer()
        mediaPlayer.setDataSource(path)
        mediaPlayer.prepare()
        val duration = mediaPlayer.duration
        //记得释放资源
        mediaPlayer.release()
        return duration+0L
    }
    //获取歌曲专辑图片
    fun getAlbumPicture(dataPath: String):Painter{
        return BitmapPainter(aGetAlbumPicture(dataPath).asImageBitmap())
    }
    private fun aGetAlbumPicture(dataPath: String): Bitmap {
        val mmr = MediaMetadataRetriever()
        mmr.setDataSource(dataPath)
        val data = mmr.embeddedPicture
        var albumPicture: Bitmap? = null
        return if (data != null) {
            //获取bitmap对象
            albumPicture = BitmapFactory.decodeByteArray(data, 0, data.size)
            //获取宽高
            val width = albumPicture.width
            val height = albumPicture.height
            //Log.w("DisplayActivity","width = "+width+" height = "+height);
            // 创建操作图片用的Matrix对象
            val matrix = Matrix()
            // 计算缩放比例
            val sx = 120f / width
            val sy = 120f / height
            // 设置缩放比例
            matrix.postScale(sx, sy)
            // 建立新的bitmap,其内容是对原bitmap的缩放后的图
            albumPicture = Bitmap.createBitmap(albumPicture, 0, 0, width, height, matrix, false)
            albumPicture
        } else {
            albumPicture = BitmapFactory.decodeResource(App.app.resources, R.drawable.ic_music_foreground)
            //ic_music_foreground是从歌曲文件读取不出来专辑图片时用来代替的默认专辑图片
            val width = albumPicture.width
            val height = albumPicture.height
            //Log.w("DisplayActivity","width = "+width+" height = "+height);
            // 创建操作图片用的Matrix对象
            val matrix = Matrix()
            // 计算缩放比例
            val sx = 120f / width
            val sy = 120f / height
            // 设置缩放比例
            matrix.postScale(sx, sy)
            // 建立新的bitmap,其内容是对原bitmap的缩放后的图
            albumPicture = Bitmap.createBitmap(albumPicture, 0, 0, width, height, matrix, false)
            albumPicture
        }
    }
}

KMath源码:

object KMath {
    //存储空间处理
    fun storageStr(length:Long):String{
        var rest = 0;
        var size = length
        if(size < 1024){
            return "$size B";
        }else{
            size /= 1024;
        }
        if(size < 1024){
            return "$size KB";
        }else{
            rest = (size % 1024).toInt();
            size /= 1024;
        }
        if(size < 1024){
            size *= 100;
            return "${size / 100}.${rest * 100 / 1024 % 100}MB";
        }else{
            size = size * 100 / 1024;
            return "${size / 100}.${size % 100}GB";
        }
    }

    //时间长度毫秒处理
    fun timeStr(xtime: Long): String {
        var time = xtime
        time /= 1000
        var timeStr =""+ (if (time / 60 < 10) "0" + time / 60 else time / 60) + ""
        timeStr += ":" + (if (time % 60 < 10) "0" + time % 60 else time % 60) + ""
        return timeStr
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的本地音乐播放器的示例代码,使用Android Studio编写: 1. 首先,在Android Studio创建一个新项目,并在布局文件添加一个ListView(列表视图),用于显示本地音乐文件。 2. 接下来,创建一个类来读取本地音乐文件,如下所示: ``` public class MusicUtils { public static ArrayList<String> getMusic(Context context) { ArrayList<String> musicList = new ArrayList<>(); ContentResolver contentResolver = context.getContentResolver(); Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; String[] projection = { MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DATA }; String selection = MediaStore.Audio.Media.IS_MUSIC + "!=0"; Cursor cursor = contentResolver.query(uri, projection, selection, null, null); if (cursor != null && cursor.getCount() > 0) { while (cursor.moveToNext()) { String title = cursor.getString(0); String path = cursor.getString(1); musicList.add(path); } } if (cursor != null) { cursor.close(); } return musicList; } } ``` 该类使用ContentResolver查询MediaStore.Audio.Media.EXTERNAL_CONTENT_URI(外部存储器的音频媒体文件)来获取本地音乐文件的标题和路径。在这个示例,我们只获取包含音乐的文件,即MediaStore.Audio.Media.IS_MUSIC属性不等于0的文件。 3. 然后,在MainActivity.java,我们将获取到的音乐文件列表传递给ListView进行显示,如下所示: ``` public class MainActivity extends AppCompatActivity { private ListView mListView; private ArrayAdapter<String> mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mListView = findViewById(R.id.listView); mAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, MusicUtils.getMusic(this)); mListView.setAdapter(mAdapter); } } ``` 我们将MusicUtils.getMusic()方法返回的ArrayList作为ArrayAdapter的数据源,并将其设置为ListView的适配器。 4. 最后,我们需要添加一个MediaPlayer对象来播放选定的音乐文件。在MainActivity.java,我们可以将MediaPlayer对象声明为类成员变量,并在ListView的onItemClickListener实例化和控制MediaPlayer,如下所示: ``` public class MainActivity extends AppCompatActivity { // ... private MediaPlayer mMediaPlayer; @Override protected void onCreate(Bundle savedInstanceState) { // ... mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { String path = mAdapter.getItem(i); if (mMediaPlayer != null) { mMediaPlayer.stop(); mMediaPlayer.release(); } mMediaPlayer = new MediaPlayer(); try { mMediaPlayer.setDataSource(path); mMediaPlayer.prepare(); mMediaPlayer.start(); } catch (IOException e) { e.printStackTrace(); } } }); } } ``` 在onItemClick事件,我们获取用户所选的文件路径,然后实例化MediaPlayer,并设置其数据源,准备并开始播放。 这就是一个简单的本地音乐播放器的实现。当然,还有很多其他功能可以添加,例如播放列表、进度条、暂停和停止按钮等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值