ym——Android从零开始(28)(来电铃声的设置、手机闹钟、手势识别)(新)

这篇博客介绍了如何在Android中设置来电铃声,利用MediaStore获取多媒体信息,并详细讲解了AlarmManager的使用机制,包括一次性与周期性任务的设定。此外,还探讨了手势识别的应用,如愤怒的小鸟的游戏操作,以及如何在项目中集成GestureOverlayView实现手势识别功能。

转载请注明本文出自Cym的博客(http://blog.youkuaiyun.com/cym492224103),谢谢支持!


来电铃声的设置、手机闹钟、手势识别来电铃声的设置

1.png


MediaStore简介

MediaStoreandroid系统提供的一个多媒体数据库,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

2.png

设置一个闹钟定时,到时间会发送一个广播,定义一个广播接受者,广播接受者在挑战到一个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的手势识别来实现的

3.png

4.png

手势画板控件:

    <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 TimePickerDialogsetRepeating(。。。)


4.  手势识别使用哪个控件?

GestureOverlayView


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值