目 录

PersonCp

PersonCp.java

insert()

ContentObserver

音乐播放器

1、添加读写权限

1.1、动态权限授予(调用封装好的方法)

2、获取音乐文件(MainActivity.java)

2、Music.java(实体类)

申请访问SD卡的权限

设置适配器

下拉刷新

PersonCp

PersonCp.java

package cn.wangzg.personcp;

import android.content.ContentProvider;

import android.content.ContentUris;

import android.content.ContentValues;

import android.content.UriMatcher;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.net.Uri;

import java.util.Objects;

public class PersonCp extends ContentProvider { //数据库作为数据源,将数据保存到数据库中。

private MyHelper mHelper;

private final static String AUTHORITY = "cn.wangzg.personprovider";

private static UriMatcher mUriMatcher;

private static final int PERSON_DIR = 0;

private static final int PERSON = 1;

static {

mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

// 该URI表示返回所有的person,其中PERSONS为该特定Uri的标识码

mUriMatcher.addURI(AUTHORITY, "person", PERSON_DIR);

// 该URI表示返回某一个person,其中PERSON为该特定Uri的标识码

mUriMatcher.addURI(AUTHORITY, "person/#", PERSON);

}

@Override

public String getType(Uri uri) {

switch (mUriMatcher.match(uri)) {

case PERSON_DIR:

return "vnd.android.cursor.dir/" + AUTHORITY + ".persons";

case PERSON:

return "vnd.android.cursor.item/" + AUTHORITY + ".person";

default:

throw new IllegalArgumentException("unknown uri" + uri.toString());

}

}

@Override

public boolean onCreate() {

mHelper = new MyHelper(getContext());

return true;

}

@Override

public Uri insert(Uri uri, ContentValues values) {

SQLiteDatabase db = mHelper.getWritableDatabase();

switch (mUriMatcher.match(uri)) {

case PERSON_DIR:

long newId = db.insert("person", "name,phone,salary", values);

//向外界通知该ContentProvider里的数据发生了变化 ,以便ContentObserver作出相应

getContext().getContentResolver().notifyChange(uri, null);

return ContentUris.withAppendedId(uri, newId);

default:

throw new IllegalArgumentException("unknown uri" + uri.toString());

}

}

@Override

public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {

SQLiteDatabase db = mHelper.getWritableDatabase();

int updatedNum = 0;

switch (mUriMatcher.match(uri)) {

// 更新表

case PERSON_DIR:

updatedNum = db.update("person", values, selection, selectionArgs);

break;

// 按照id更新某条数据

case PERSON:

long id = ContentUris.parseId(uri);

String where = "id=" + id;

if (selection != null && !"".equals(selection.trim())) {

where = selection + " and " + where;

}

updatedNum = db.update("person", values, where, selectionArgs);

break;

default:

throw new IllegalArgumentException("unknown uri" + uri.toString());

}

//向外界通知该ContentProvider里的数据发生了变化 ,以便ContentObserver作出相应

Objects.requireNonNull(getContext()).getContentResolver().notifyChange(uri, null);

return updatedNum;

}

@Override

public int delete(Uri uri, String selection, String[] selectionArgs) {

SQLiteDatabase db = mHelper.getWritableDatabase();

int deletedNum = 0;

switch (mUriMatcher.match(uri)) {

// 删除表

case PERSON_DIR:

deletedNum = db.delete("person", selection, selectionArgs);

break;

// 按照id删除某条数据

case PERSON:

long id = ContentUris.parseId(uri);

String where = "id=" + id;

if (selection != null && !"".equals(selection.trim())) {

where = selection + " and " + where;

}

deletedNum = db.delete("person", where, selectionArgs);

break;

default:

throw new IllegalArgumentException("unknown uri" + uri.toString());

}

//向外界通知该ContentProvider里的数据发生了变化 ,以便ContentObserver作出相应

Objects.requireNonNull(getContext()).getContentResolver().notifyChange(uri, null);

return deletedNum;

}

@Override

public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {

SQLiteDatabase db = mHelper.getWritableDatabase();

Cursor cursor = null;

switch (mUriMatcher.match(uri)) {

// 查询表

case PERSON_DIR:

cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder);

break;

// 按照id查询某条数据

case PERSON:

// 第一步:

long id = ContentUris.parseId(uri);

String where = "id=" + id;

// 第二步:

if (selection != null && !"".equals(selection.trim())) {

where = selection + " and " + where;

}

cursor = db.query("person", projection, where, selectionArgs, null, null, sortOrder);

break;

default:

throw new IllegalArgumentException("unknown uri" + uri.toString());

}

return cursor;

}

}

insert()

ContentObserver

菜鸟教程 【4.4.1 ContentProvider初探】

https://www.runoob.com/w3cnote/android-tutorial-contentprovider.html

音乐播放器

1、添加读写权限

1.1、动态权限授予(调用封装好的方法)

2、获取音乐文件(MainActivity.java)

2、Music.java(实体类)

申请访问SD卡的权限

设置适配器

下拉刷新

点个赞吧~      b( ̄▽ ̄)d

求求了~

小本生意,不容易啊~

android音乐播放器文章,Android复习09【内容提供者、音乐播放器】相关推荐

  1. android音乐播放器文章,Android论文音乐播放器文章.doc

    毕业论文毕业设计开题报告论文报告设计报告可行性研究报告 移动互联网开发 结业论文设计 学生姓名: 黄敏 学 号: k031241508 班 级: k0312415 论文题目: 音乐播放器 摘要: 当今 ...

  2. Excel 2010 最熟悉的陌生功能:筛选器(将当前所选内容添加到筛选器)

    使用excel2010版的同学,在进行筛选时,肯定都对这句话很熟悉:将当前所选内容添加到筛选器.但很多同学天天看到,却不知道什么是筛选器?它有什么作用. 其实,这里所指的筛选器就是储存筛选结果的一个虚 ...

  3. Android 进阶——Framework 核心之Android Storage Access Framework(SAF)存储访问框架机制详解(一)

    文章大纲 引言 一.Android Storage Access Framework 二.Storage Access Framework 的主要角色成员 1.Document Provider 文件 ...

  4. 每一位Android开发者应该知道的Android体系架构和开发库

    Android的体系架构鼓励组件重用,允许开发者发布共享Activity.Service并且访问其他应用程序的数据,还可以根据开发者制定的安全限制进行管理.话虽如此,今天我将分享一些关于Android ...

  5. Android复习09【内容提供者、音乐播放器(附完整工程文件)】

    2020-04-16[第9周---周四] 音乐播放器Android代码下载:https://wws.lanzous.com/ifqzihaxvij 目 录 PersonCp PersonCp.java ...

  6. android 音乐播放器框架,Android音乐播放器 -- 实现框架

    MediaPlayer 框架有两种方案 第一种是通过全局变量保存当前状态,触发状态后获取全局变量进行配置 第二种是通过intent,让 Media player service 和 activity之 ...

  7. Android开发笔记(一百二十六)自定义音乐播放器

    MediaRecorder/MediaPlayer 在Android手机上面,音频的处理比视频还要复杂,这真是出人意料.在前面的博文< Android开发笔记(五十七)录像录音与播放>中, ...

  8. android airplay音乐播放器,您需要知道的关于使用AirPlay播放音乐的一切 | MOS86

    如果您使用Mac或iOS设备,您可能会了解AirPlay,Apple的流式传输协议,可以将音频和/或视频发送到各种设备.最初于2004年推出AirTunes,仅从iTunes到Apple设备的音频,A ...

  9. 简易音乐播放器(Android Studio)

    Android期末作业,临时抱佛脚(手动滑稽 分享下音乐播放的源码吧.(只能播放内嵌音乐 PS:完整工程下载及相关说明:https://download.csdn.net/download/weixi ...

最新文章

  1. Python 函数学习
  2. 带头结点的线性表的链式实现
  3. 如何快速定位当前数据库消耗CPU最高的sql语句?
  4. vmware提示:此虚拟机似乎正在使用中,无法取得所有权的解决办法
  5. Nagios远程监控软件的安装与配置详解
  6. thinkphp中__construct与_initialize()的区别
  7. c传给php数据解包,小程序源码提取工具,完美解包,一键提取小程序源代码工具_PHP源码...
  8. Python学习(九)IO 编程 —— 文件夹及文件操作
  9. Linux 虚拟机安装 MySQL 教程
  10. Target folder is neither empty nor does it point to an existing SDK installtion.
  11. c语言中实型标准,在C语言中的实型变量分为两种类型.docx
  12. gcc: error trying to exec ‘cc1plus‘: execvp: Permission denied
  13. 国内工业软件排行榜、市场份额与主要玩家
  14. Angular最佳实践之$http-麻雀虽小 五脏俱全
  15. excel-countifs和sumifs函数
  16. 【C语言】深度剖析数据在内存中的存储
  17. ux设计_UX评论模式品牌知道规则并且也打破了规则
  18. 【Machine Learning】模型融合之Stacking
  19. git命令和遇见得 warning:
  20. win10开机一直转圈圈进不去系统怎么办

热门文章

  1. Docker:集装箱式“运输”在软件上的实现
  2. POJ 3352 Road Construction ; POJ 3177 Redundant Paths (双联通)
  3. JTLParser-linux上jmeter的jtl文件二次分析
  4. 基于SuperSocket的IIS主动推送消息给android客户端
  5. hibernate连接数据库配置
  6. MailBee.NET Objects发送电子邮件(SMTP)教程六:创建并发送带有附件的邮件
  7. Javascript判断object还是list/array的类型(包含javascript的数据类型研究)
  8. MySQL 性能监控 4 大指标
  9. 2016年学习Linux决心书(老男孩教育在线课程班第二期)
  10. android传递数据bundle封装传递map对象