热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android播放SD卡上指定的一首歌(初级版)

在讲主题之前,我们先补充一点sqlite查询语句的知识(Android的数据库就是采用sqlite)。LIKE操作符一个很有用的关系操作符是LIKE。LIKE的作用与相等()很像,但却是通过一个模板

在讲主题之前,我们先补充一点sqlite查询语句的知识(Android的数据库就是采用sqlite)。

LIKE操作符

一个很有用的关系操作符是LIKE。LIKE的作用与相等(=)很像,但却是通过一个模板来进行字符串匹配。例如,要查询所有名称以字符“J”开始的食品,可使用如下语句:

sqlite> SELECT id, name FROM foods WHERE name LIKE 'J%';

id name

156 Juice box

236 Juicy Fruit Gum

243 Jello with Bananas

244 JujyFruit

245 Junior Mints

370 Jambalaya

模板中的百分号(%)可与任意0到多个字符匹配。下划线(_)可与任意单个字符匹配。

——引自《Sqlite权威指南》

语句说明:该语句会返回foods表中的id和name这两列的数据。其中,返回的数据必须满足:数据在name这一个属性上,是以J开头的字符串。


与之对应的,我们来看Android里的查询语句query().

contentResolver.query(
Uri uri,
String[] projection,
String[] selection,
String[] selectionArgs,
String sortOrder);

uri 是表名

projection 是要返回的列名数组

selection 是约束条件,相当于WHERE关键字后面的语句,如 name  LIKE 'J%’ (注意:sqlite中字符串是以单引号' '包含起来的)

selectionArgs 该数组中的String用于依次替代seletion中含有的?号(例如,selection语句    name = ? AND phOne= ?    中含有两个?号,那么selectionArgs里就需要引入两个String参数,如new String[ ]{myName,myPhone})

sortOrder 所返回数据的排序方式


——————————————————

好了,进入正题:

以下程序实现,为AndroidTest这个程序添加一首曲名以“sorry sorry”结束的音乐背景。

该音乐在该Activity进入onCreat( )和onRestart( )状态下开始播放,在该Activity进入onStop()状态下停止播放。

package keNan.com.test;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;

/**
* @ClassName: AndroidTestActivity
* @Description: Set a background music for this Activity.
* @author 慢跑学Android
* @date 2011-11-22 下午04:12:00
*
*/
public class AndroidTestActivity extends Activity {
private MediaPlayer mediaPlayer;
private final Uri musicTableForSD = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
private final String musicTitle = MediaStore.Audio.AudioColumns.TITLE;
private final String musicId = MediaStore.Audio.Media._ID;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

playBackgroundMusic();
}


@Override
protected void onRestart() {
super.onRestart();

playBackgroundMusic();
}


@Override
protected void onStop() {
super.onStop();

stopMusic();
}


private void playBackgroundMusic() {
// Get a ContentResovler,
// so that we can read the music information form SD card.
ContentResolver cOntentResolver= getContentResolver();
String musicName = "%sorry sorry";
Cursor cursor = contentResolver.query(
musicTableForSD,
new String[]{musicId,musicTitle},
musicTitle + " LIKE ?",
new String[]{musicName},
null);
// If cursor has a recode, we support that we find the music.
if (cursor.moveToNext()) {
// Get the music id.
int position = cursor.getInt(cursor.getColumnIndex(musicId));
Uri uri = Uri.withAppendedPath(musicTableForSD, "/" + position);
mediaPlayer = MediaPlayer.create(this, uri);
if (null != mediaPlayer) {
mediaPlayer.start();
}
}
// Finish our query work.
cursor.close();
}

private void stopMusic() {
if (null != mediaPlayer) {
mediaPlayer.stop();
mediaPlayer.release();
}
}
}

参考资料:

Android 获取sdcard音乐文件

Android 中数据库查询方法query()中的selectionArgs的用法

新手教程:Android内置的SQLite操作方法





推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • mysql-cluster集群sql节点高可用keepalived的故障处理过程
    本文描述了mysql-cluster集群sql节点高可用keepalived的故障处理过程,包括故障发生时间、故障描述、故障分析等内容。根据keepalived的日志分析,发现bogus VRRP packet received on eth0 !!!等错误信息,进而导致vip地址失效,使得mysql-cluster的api无法访问。针对这个问题,本文提供了相应的解决方案。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • PHP反射API的功能和用途详解
    本文详细介绍了PHP反射API的功能和用途,包括动态获取信息和调用对象方法的功能,以及自动加载插件、生成文档、扩充PHP语言等用途。通过反射API,可以获取类的元数据,创建类的实例,调用方法,传递参数,动态调用类的静态方法等。PHP反射API是一种内建的OOP技术扩展,通过使用Reflection、ReflectionClass和ReflectionMethod等类,可以帮助我们分析其他类、接口、方法、属性和扩展。 ... [详细]
  • php缓存ri,浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
    thinkPHP的F方法只能用于缓存简单数据类型,不支持有效期和缓存对象。S()缓存方法支持有效期,又称动态缓存方法。本文是小编日常整理有关thinkp ... [详细]
author-avatar
mobiledu2502910337
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有