转载请注明本文出自Cym的博客(http://blog.youkuaiyun.com/cym492224103),谢谢支持!
来电铃声的设置、手机闹钟、手势识别来电铃声的设置
MediaStore简介
MediaStore是android系统提供的一个多媒体数据库,android中多媒体信息都可以从这里提取。MediaStore包括了多媒体数据库的所有信息,包括音频,视频和图像,android把所有的多媒体数据库接口进行了封装,所有的数据库不用自己进行创建,直接使用ContentResolver调用那些封装好的接口就可以进行数据库的操作了
得到sdcard里面所有的歌曲,使用了异步查询,注册绑定上下文菜单,从MediaStore得到选中信息
//设置铃声需要权限(setting)
RingtoneManager.setActualDefaultRingtoneUri(
this,
RingtoneManager.TYPE_RINGTONE,
uri);
public class MainActivity extends Activity{
private static final int MENU_ID_SET_RINGTONE = 0;
privateListView lv;
private QueryHandler queryHandler;
private String[] projection = new String[]{
Media._ID,
Media.DISPLAY_NAME
};
privateMyAdapter adatper;
/**Called when the activity is first created. */
@Override
public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lv = (ListView) findViewById(R.id.lv);
adatper = new MyAdapter(this, null);
lv.setAdapter(adatper);
queryHandler = new QueryHandler(getContentResolver());
startQuery();
registerForContextMenu(lv);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfomenuInfo) {
// TODO Auto-generated method stub
super.onCreateContextMenu(menu, v,menuInfo);
menu.add(0, MENU_ID_SET_RINGTONE, 0,"设置为手机铃声");
}
@Override
public boolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
//得到要设置手机铃声是那首歌(确定uri)
//设置为铃声
AdapterContextMenuInfo acmi =(AdapterContextMenuInfo) item.getMenuInfo();
int position = acmi.position;
Cursor c = (Cursor) adatper.getItem(position);
String id = c.getString(0);
Uri uri =Uri.withAppendedPath(Media.EXTERNAL_CONTENT_URI, id);
//设置铃声需要权限(setting)
RingtoneManager.setActualDefaultRingtoneUri(
this,
RingtoneManager.TYPE_RINGTONE,
uri);
return super.onContextItemSelected(item);
}
private void startQuery(){
queryHandler.startQuery(
0,
null,
Media.EXTERNAL_CONTENT_URI,
projection,
null, null, null);
}
private class QueryHandler extends AsyncQueryHandler{
public QueryHandler(ContentResolver cr) {
super(cr);
//TODO Auto-generated constructor stub
}
@Override
protected void onQueryComplete(int token,Object cookie, Cursor cursor) {
//TODO Auto-generated method stub
super.onQueryComplete(token,cookie, cursor);
adatper.changeCursor(cursor);
}
}
private class MyAdapter extends CursorAdapter{
public MyAdapter(Context context, Cursorc) {
super(context,c);
//TODO Auto-generated constructor stub
}
@Override
public View newView(Context context,Cursor cursor, ViewGroup parent) {
//TODO Auto-generated method stub
Viewview = getLayoutInflater().inflate(R.layout.item, null);
ViewHolderholder = new ViewHolder();
holder.tv_name= (TextView) view.findViewById(R.id.tv_name);
view.setTag(holder);
returnview;
}
@Override
public void bindView(View view, Contextcontext, Cursor cursor) {
//TODO Auto-generated method stub
ViewHolderholder = (ViewHolder) view.getTag();
Stringname = cursor.getString(1);
holder.tv_name.setText(name);
}
}
private class ViewHolder{
TextView tv_name;
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Cursor cursor = adatper.getCursor();
if(cursor != null &&!cursor.isClosed()){
cursor.close();
}
}
}
闹钟
AlarmManager简介
AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟,它的作用和Timer有点相似,有两种用法:
在指定时长后执行某项操作
周期性的执行某项操作
AlarmManager对象配合Intent使用,可以定时的开启一个Activity,发送一个BroadCast,或者开启一个Service
设置一个闹钟定时,到时间会发送一个广播,定义一个广播接受者,广播接受者在挑战到一个activity进行提示操作。
//得到闹钟服务
AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
//设置闹钟
public void set(View v){
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
int hourOfDay =calendar.get(Calendar.HOUR_OF_DAY);
int minute =calendar.get(Calendar.MINUTE);
TimePickerDialog dialog = new TimePickerDialog(
this,
new OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view,int hourOfDay, int minute) {
// TODO Auto-generated methodstub
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY,hourOfDay);
calendar.set(Calendar.MINUTE, minute);
Intent intent
= new Intent(getApplicationContext(),AlarmReceiver.class);
PendingIntent operation
= PendingIntent.getBroadcast(getApplicationContext(), 100, intent, 0);
// 要接受广播的广播接受者指定
// 单次闹钟
/*am.set(AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(),
operation);*/
// 多次闹钟
am.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(), 4000, operation);
}
},
hourOfDay,
minute,
true);
dialog.show();
}
//取消闹钟
Intent intent = newIntent(getApplicationContext(),AlarmClockReceiver.class);
PendingIntent operation =PendingIntent.getBroadcast(getApplicationContext(), 100, intent, 0);
am.cancel(operation);
手势识别
手势识别使android更人性化,让我们的操作更简单,其实我们日常应用中不少地方都使用了手势识别方法,比如2011年那么火的愤怒的小鸟中的发射武器,uc浏览器的左右滑动功能,这都是可以使用android的手势识别来实现的
手势画板控件:
<android.gesture.GestureOverlayView
android:id="@+id/gestureOverlayView"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:gestureStrokeType="multiple" >
</android.gesture.GestureOverlayView>
android:gestureStrokeType="multiple"
可以设置化多笔画
把我们在自带应用里面生成的手势数据库放入我们项目的raw(新建文件夹)文件夹下面
public class MainActivity extends Activity {
private GestureOverlayView g;
private GestureLibrary gestureLibrary;
private Gesture gesture;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
得到控件画板
g =
(GestureOverlayView) findViewById(R.id.gestureOverlayView);
加载手势库里面的手势
gestureLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures);
gestureLibrary.load();
// 单笔识别
//g.addOnGesturePerformedListener(newMyOnGesturePerformedListener()); '
// 多笔识别
g.addOnGesturingListener(new MyGestureListener());
}
private class MyGestureListener implements OnGesturingListener{
@Override
public voidonGesturingStarted(GestureOverlayView overlay) {
// TODO Auto-generated methodstub
}
@Override
public voidonGesturingEnded(GestureOverlayView overlay) {
gesture = overlay.getGesture();
}
}
/* private class MyOnGesturePerformedListenerimplements OnGesturePerformedListener{
@Override
public voidonGesturePerformed(GestureOverlayView overlay,
Gesture gesture) {
// TODO Auto-generated methodstub
regconize(gesture);
}
}*/
public void ok(View v){
regconize(gesture);
g.clear(true);
}
public void cancle(View v){
g.clear(true);
}
private void regconize(Gesture gesture){
// 识别手势
ArrayList<Prediction>recognizes = gestureLibrary.recognize(gesture);
if (recognizes.isEmpty()) {
Toast.makeText(this, "没找到该手势", 300).show();
}else{
// 得到匹配手势
Prediction prediction = recognizes.get(0);
// 得到匹配度
double score = prediction.score;
if(score>5)
{
String name =prediction.name;
if("call".equals(name))
{
Toast.makeText(this, "call", 300).show();
}else if("close".equals(name))
{
MainActivity.this.finish();
}else{
Toast.makeText(this, "没找到该手势", 300).show();
}
}
}
}
}
课后问题
1. 怎么获取手机里面的歌曲?
通过MediaStore
2. 怎么设置手机的来电铃声?
RingtoneManager.setActualDefaultRingtoneUri(
this,
RingtoneManager.TYPE_RINGTONE,
uri);
3. 要设置闹钟应该使用哪个类?
AlarmManager 、TimePickerDialog、setRepeating(。。。)
4. 手势识别使用哪个控件?
GestureOverlayView