王学岗音乐设置成闹钟

好久没用过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"/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值