好久没用过eclipse写过博客了,这次的博客是很久以前的内容了,并不是新学的内容;很久以前就应该写,一直偷懒没写今天补上;
进入正题,我们把一首音乐导入到手机中,然后想把他设置为闹钟,该怎么做?这里我们需要用到contentprovider;手机里专门数据库用于存放媒体文件(音频、视频、图片等);我们看下我的截图
大家可以看到两个数据库,一个是内部存储的,一个是外部存储的,在data/data/com.android.providers.media文件目录下;我们打开外部存储的数据库;
左侧有我们的数据库,大家注意下最下面那六个其实是六个结果集,是我们用sql语句查询出来的结果集;我们以audio为例!就是用select语句查询出来的。
我们切换到data目录,看看里面有哪些数据,我们可以看到导入的两首歌
,我们向右拖拽,还有更多的字段
事实上,我们放到手机里的所有图片,音频,视频文件都会在这里记录,冠希哥修电脑的时候那些图片视频肯定放的很深,但了解的人依然可以找到他们。
我们可以跨进程访问其数据库,这里就用到了我们的contentprovider;
大家看下布局,就一个ListView
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.alarm.MainActivity" >
<ListView
android:id="@+id/lv_musiclist"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</LinearLayout>
大家看下MainActivity
package com.example.alarm;
import android.app.Activity;
import android.content.AsyncQueryHandler;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.provider.MediaStore.Audio.Media;
import android.support.v4.widget.SimpleCursorAdapter;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ListView;
public class MainActivity extends Activity {
private ListView lv_listmusic;
private SimpleCursorAdapter adapter;
private Uri uri;
private ContentResolver cr;
// 1,获取手机外部存储的音频文件
// 2,把音乐文件通过listView展现给用户看
// 3,长按时间弹出上下文菜单,选择设置铃声
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
cr = getContentResolver();
MyAsyncQueryHandler mqh = new MyAsyncQueryHandler(cr);
// 启动异步查询
// token 标志、区分线程的请求码 cookie:缓存
mqh.startQuery(100, null, uri, null, null, null, null);
// 2,把音乐文件通过listView展现给用户看
lv_listmusic = (ListView) findViewById(R.id.lv_musiclist);
adapter = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1, null,// 游标暂时为空
new String[] { Media.TITLE }, // 游标中的哪一个字段
new int[] { android.R.id.text1 });
lv_listmusic.setAdapter(adapter);
// 3,长按时间弹出上下文菜单,选择设置铃声
// 为ListView设置上下文菜单,当我们长按条目的时候会弹出上下文菜单
registerForContextMenu(lv_listmusic);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(0, 0, 0, "设置铃声");
menu.add(0, 1, 1, "设置闹钟");
menu.add(0, 2, 2, "取消");
}
// 上下文条目选中就回调该方法
@Override
public boolean onContextItemSelected(MenuItem item) {
int itemId = item.getItemId();
switch (itemId) {
case 0:
//设置铃声---MenuItem获取item的position
AdapterContextMenuInfo info=(AdapterContextMenuInfo) item.getMenuInfo();
int position=info.position;
//音乐数据就在cursor里
Cursor cursor=(Cursor) adapter.getItem(position);
//把Uri的格式由Contet://authority/path转化为Content://authority/path/2(即我们点击的歌曲的Uri)
Uri ringtoneUri=ContentUris.withAppendedId(uri, cursor.getInt(cursor.getColumnIndex(Media._ID)));
//更新数据库,即把字段is_ringtone由默认的0改为1
ContentValues values=new ContentValues();
//经过本人验证,这里1和true都可以
// values.put(Media.IS_RINGTONE,1);
values.put(Media.IS_RINGTONE,true);
cr.update(ringtoneUri, values, null, null);
//设置铃声
RingtoneManager.setActualDefaultRingtoneUri(
this,
RingtoneManager.TYPE_RINGTONE,
ringtoneUri);
break;
case 1:
AdapterContextMenuInfo info1=(AdapterContextMenuInfo) item.getMenuInfo();
break;
case 2:
AdapterContextMenuInfo info2=(AdapterContextMenuInfo) item.getMenuInfo();
break;
default:
break;
}
return super.onContextItemSelected(item);
}
// 操作数据库属于耗时操作,我们这里使用异步查询类
private class MyAsyncQueryHandler extends AsyncQueryHandler {
public MyAsyncQueryHandler(ContentResolver cr) {
super(cr);
}
// Called when an asynchronous query is completed.
// 数据在cursor(the cursor holding the results from the
// query)中,把数据传给ListView的适配器
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
super.onQueryComplete(token, cookie, cursor);
// 把游标给需要数据的adapter//改变游标,更新数据
System.out.println(cursor.getColumnCount());
adapter.changeCursor(cursor);
}
}
}
需要添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>