Kotlin项目实战之手机影音---通过MediaProvider获取音乐列表数据、异步查询音乐数据、条目view自定义和CursorAdapter简介、v榜界面列表适配、android6.0动态权限

在上一次Kotlin项目实战之手机影音---处理mv界面条目点击事件、视频播放处理、响应应用外视频播放请求咱们对于视频播放进行了处理,接下来咱们来实现v榜界面:

通过MediaProvider获取音乐列表数据:

1、修改布局:

这里用一下古老的ListView来进行列表构建,这里用一个新的适配的。

2、分析MediaProvider的数据:

那如何查找本机的音乐数据呢?最最简单的方式是遍历机子上所有的文件,然后再从中过滤出来对应的音乐格式的,但是!!!当你手机文件巨多的时候,这种方式很显然是效率比较低的,其实在Android系统中提供有一个MediaProvider.apk这样的文件:

在这个目录下就可以看到它了:

,它会主动帮我们扫描手机上的视频、音乐、图片资源然后存储在它自己的数据库当中,而它提供了一个ContentProvider供其它应用进行相关数据的获取。那接下来咱们找到它的数据库文件导出来看一下,可以到这个目录下进行查询:

其中由于我小米机子没有root,会发现查看不了具体的db文件:

那。。这里就新建一个模拟器,基本上它都root了,查看一下:

导出来之后,然后查看一下它具体的内容,这里我这边用的是Navicat Premium这个工具来查看的:

由于我模拟器本身没有音频文件,所以目前数据库中看不到记录,可以导一个音频到手机上,然后再查看该库就可以看到了。

3、查询音频数据:

接下来则使用ContentProvider发起查询既可,如下:

那是否真的能查到呢?下面将cursor中的数据打印看一下,这里封装一个工具方法,便于以后可以复用:

下面运行看一下:

嗯,木问题。

异步查询音乐数据:

由于这个音乐数据的查询有可能会比较耗时,所以很显然需要放在异步线程中,这里可以采用AsyncTask来进行:

通过AsyncQueryHandler异步查询音乐列表:

对于数据库的异步查询,其实Android提供有一个专门的类,就是AsyncQueryHandler

,下面改用它来查询一下:

其中在查询时有一个cookie参数,那它是干嘛使的呢?

哦,用来进行对象传递用的,那具体使用场景是啥呢?比如一个界面有多个数据查询并显示在Adapter当中,此时就可以通过这个参数将你要显示的adapter传过来然后在查询结束之后直接拿到对应的adpater进行数据源的绑定了,另外还有这个参数也需要了解一下:

也就是用它可以来区分到底是哪次查询,这块也比较容易理解,就不过多说明了。

条目view自定义和CursorAdapter简介:

有了数据之后,接下来则需要将它显示在列表上。

1、准备item view:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    android:padding="5dp">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/music_default_bg" />

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_weight="1"
        android:orientation="vertical">

        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:maxLines="1"
            android:text="歌曲名称"
            android:textSize="22sp" />

        <TextView
            android:id="@+id/artist"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:maxLines="1"
            android:text="歌首名称"
            android:textColor="#40000000"
            android:textSize="18sp" />
    </LinearLayout>

    <TextView
        android:id="@+id/size"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:maxLines="1"
        android:text="5.43M"
        android:textColor="#40000000"
        android:textSize="18sp" />
</LinearLayout>

2、使用CursorAdapter:

接下来则来准备Adapter,通常咱们会使用BaseAdapter对吧,但是对于数据库查询出来的Cursor,其实系统有一个更加合适的类叫CursorAdapter,下面来使用一下:

接下来则来填充一下:

package com.kotlin.musicplayer.widget

import android.content.Context
import android.text.format.Formatter
import android.util.AttributeSet
import android.view.View
import android.widget.RelativeLayout
import com.kotlin.musicplayer.R
import com.kotlin.musicplayer.model.AudioBean
import kotlinx.android.synthetic.main.item_vbang.view.*


class VbangItemView : RelativeLayout {
    constructor(context: Context?) : super(context)
    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(
        context,
        attrs,
        defStyleAttr
    )

    init {
        View.inflate(context, R.layout.item_vbang, this)
    }

    /**
     * view+data绑定
     */
    fun setData(itemBean: AudioBean) {
        //歌曲名
        title.text = itemBean.display_name
        //歌手名
        artist.text = itemBean.artist
        //歌曲大小
        size.text = Formatter.formatFileSize(context, itemBean.size)
    }
}

model定义如下:

v榜界面列表适配:

接下来则来绑定一下数据到列表中:

接下来则回到Fragment的查询中进行一下Adapter的设置:

此时运行看一下:

其中有一个注意点,就是在查询时,一定需要有这个ID属性:

如果没有这个属性,运行就会报这个错:

Cursor关闭:

我们知道在使用Cursor之后需要及时的关闭掉,不然会造成内存泄漏对吧,所以咱们接下来处理一下它,这里需要这样处理:

那为啥这样调用就可以释放cusor呢?下面跟进去看一下它里面的实现:

接下来看一下swapCursor里面的细节:

所以这句话的意思是:将Adapter的cursor先关闭掉,然后再将它的引用置为null,那不就是标准释放资源的代码么?

android6.0动态权限申请:

在6.0以上的机子上运行,会报这样的异常:

很明显是权限申请的问题,因为咱们在清单文件中已经声明了读取sdcard的权限了:

而关于动态权限的知识这里就不过多说明了,我在之前Android9.0动态运行时权限源码分析及封装改造<一>-----运行时权限名词解释、权限检测源码分析 - cexo - 博客园已经详细学习过了,这里就简单提一下权限申请的三大步骤:

1、checkSelfPermission:用来检查权限是否已经申请;

2、shouldShowRequestPermissionRationale:表示是否要显示自定义的权限申请提示,这是当用户已经拒绝权限申请时,由用户自定义文案来告诉此权限申请的目的用的;

3、requestPermissions:真正权限申请;

下面具体来处理一下:

接下来处理对话框提示:

然后发起权限申请之后,需要处理一下结果:

下面运行看一下效果:

关注个人公众号,获得实时推送

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以回答您的问题。以下是使用Kotlin语言在Android中使用OkHttp获取JSON数据并解析的代码示例: 首先,您需要在您的项目中添加OkHttp库的依赖项。在您的app的build.gradle文件中添加以下代码: ```groovy dependencies { implementation 'com.squareup.okhttp3:okhttp:4.9.0' } ``` 接下来,您可以使用以下代码获取JSON数据: ```kotlin val client = OkHttpClient() val request = Request.Builder() .url("https://example.com/data.json") .build() client.newCall(request).enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { // 处理失败情况 } override fun onResponse(call: Call, response: Response) { val responseData = response.body()?.string() // 处理响应数据 } }) ``` 在上面的代码中,我们使用OkHttp创建了一个新的HTTP请求并将其排队以异步执行。当响应返回时,我们将调用回调方法以处理响应。 现在,我们需要解析JSON数据。您可以使用Kotlin内置的JSON解析器或Gson等第三方库。以下是使用Kotlin自带的解析器的代码示例: ```kotlin // 假设我们的JSON数据如下: // { // "name": "John Smith", // "age": 30, // "avatarUrl": "https://example.com/avatar.jpg" // } data class User(val name: String, val age: Int, val avatarUrl: String) val user = Json.decodeFromString<User>(responseData) val avatarUrl = user.avatarUrl // 使用Glide库加载图片 Glide.with(context) .load(avatarUrl) .into(imageView) ``` 在上面的代码中,我们首先定义了一个名为User的数据类,该类具有与JSON数据结构相匹配的属性。然后,我们使用Kotlin的JSON解析器从JSON字符串中解析出User对象。最后,我们使用Glide库加载用户的头像图片。 希望这可以帮助您开始使用Kotlin和OkHttp获取和解析JSON数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

webor2006

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值