精华内容
下载资源
问答
  • 在合适的时间自动让您的手机静音 特征 创建规则以自动切换到振动模式或静音模式 计划规则将在您每周计划的特定时间让您的手机静音 日历规则将在日历活动期间使您的手机静音 匹配日历中的所有事件或根据事件标题或...
  • 当呼叫者属于黑名单列表 自动静音 [代码 步骤] 本着先易后难的原则 先介绍黑名单列表的制作:其会列出所有联系人列表 以CheckBox形式 可以添加/移除 黑名单 1. 定义所需布局:list.xml Java代码   ...

    当呼叫者属于黑名单列表 自动静音

    [代码 步骤]

    本着先易后难的原则 先介绍黑名单列表的制作:其会列出所有联系人列表 以CheckBox形式 可以添加/移除 黑名单

    1. 定义所需布局:list.xml

    Java代码

    <?xml version="1.0" encoding="utf-8"?>  
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android
        android:orientation="vertical" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        >  
    <ListView    
        android:id="@+id/list" 
        android:layout_width="fill_parent"   
        android:layout_height="wrap_content"   
        />  
    <Button    
        android:id="@+id/btnOK" 
        android:layout_gravity="right" 
        android:text="OK" 
        android:layout_width="100dip"   
        android:layout_height="wrap_content"   
        />  
    </LinearLayout> 

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <ListView 
     android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        />
    <Button 
     android:id="@+id/btnOK"
     android:layout_gravity="right"
     android:text="OK"
        android:layout_width="100dip"
        android:layout_height="wrap_content"
        />
    </LinearLayout>
     

    2. 初始化View

    Java代码

    public void initial(){  
            initialView();  
        }  
          
        public void initialView(){  
            lView = (ListView)findViewById(R.id.list);  
            btnOK = (Button)findViewById(R.id.btnOK);  
        } 

    public void initial(){
         initialView();
        }
       
        public void initialView(){
         lView = (ListView)findViewById(R.id.list);
         btnOK = (Button)findViewById(R.id.btnOK);
        }

    3. 定义ContactsAdapter 用于列出使用联系人

    Java代码

    public class ContactsAdapter extends BaseAdapter {  
            Activity activity;  
              
            public ContactsAdapter(Activity a){  
                activity = a;  
            }  
            @Override 
            public int getCount() {  
                // TODO Auto-generated method stub  
                return cursor.getCount();  
            }  
     
            @Override 
            public Object getItem(int arg0) {  
                // TODO Auto-generated method stub  
                return arg0;  
            }  
     
            @Override 
            public long getItemId(int arg0) {  
                // TODO Auto-generated method stub  
                return arg0;  
            }  
     
            @Override 
            public View getView(int arg0, View arg1, ViewGroup arg2) {  
                // TODO Auto-generated method stub  
                CheckBox rb = new CheckBox(activity);  
                rb.setText(" "+getNameById(arg0)+"  |"+getNumberById(arg0));  
                return rb;  
                  
            }  
              
        } 

    public class ContactsAdapter extends BaseAdapter {
         Activity activity;
         
         public ContactsAdapter(Activity a){
          activity = a;
         }
      @Override
      public int getCount() {
       // TODO Auto-generated method stub
       return cursor.getCount();
      }

      @Override
      public Object getItem(int arg0) {
       // TODO Auto-generated method stub
       return arg0;
      }

      @Override
      public long getItemId(int arg0) {
       // TODO Auto-generated method stub
       return arg0;
      }

      @Override
      public View getView(int arg0, View arg1, ViewGroup arg2) {
       // TODO Auto-generated method stub
       CheckBox rb = new CheckBox(activity);
       rb.setText(" "+getNameById(arg0)+" |"+getNumberById(arg0));
       return rb;
       
      }
         
        }

    其中  getNameById() getNumberById() 可以根据position 返回联系人的名字和号码

    Java代码

    public String getNameById(int id){  
            cursor.moveToPosition(id);  
     
            int index = cursor.getColumnIndex(People.NAME);  
              
            return cursor.getString(index);  
        }  
          
        public String getNumberById(int id){  
            cursor.moveToPosition(id);  
     
            int index = cursor.getColumnIndex(People.NUMBER);  
              
            return cursor.getString(index);  
        }  
     
     
    其中 cursor = getContentResolver().query(People.CONTENT_URI,   
                    null, null, null, null); 

    public String getNameById(int id){
         cursor.moveToPosition(id);

         int index = cursor.getColumnIndex(People.NAME);
         
         return cursor.getString(index);
        }
       
        public String getNumberById(int id){
         cursor.moveToPosition(id);

         int index = cursor.getColumnIndex(People.NUMBER);
         
         return cursor.getString(index);
        }


    其中 cursor = getContentResolver().query(People.CONTENT_URI,
                    null, null, null, null);

     3. ContactsAdapter 实例化

    Java代码

    adapter = new ContactsAdapter(this);  
            lView.setAdapter(adapter); 

    adapter = new ContactsAdapter(this);
            lView.setAdapter(adapter);

    4. 当按下btnOK 得到所有黑名单 并返回给前Activity:BlacklistMain

    Java代码
     
    btnOK.setOnClickListener(new OnClickListener(){  
                @Override 
                public void onClick(View v) {  
                    // TODO Auto-generated method stub  
                    loadContactsChecked();  
                }  
                  
            }); 

    btnOK.setOnClickListener(new OnClickListener(){
       @Override
       public void onClick(View v) {
        // TODO Auto-generated method stub
        loadContactsChecked();
       }
             
            });

    5. loadContactsChecked 用于获取所有选中联系人列表 并返回之

    Java代码

    public void loadContactsChecked(){  
            List<String> list = new ArrayList<String>();  
              
            for(int i=0;i<lView.getCount();i++){  
                CheckBox rButton = (CheckBox)lView.getChildAt(i);  
                  
                if(rButton.isChecked()){  
                    list.add(getNumberById(i));  
                }  
            }  
              
            sendBack(list);  
        }  
          
        public void sendBack(List<String> l){  
            Intent intent = new Intent();  
            Bundle bundle = new Bundle();  
              
            String[] sArray = new String[l.size()];  
            l.toArray(sArray);  
              
            bundle.putStringArray("phone", sArray);  
              
            intent.putExtras(bundle);  
              
            this.setResult(RESULT_OK, intent);  
            this.finish();  
              
        } 

    public void loadContactsChecked(){
         List<String> list = new ArrayList<String>();
         
         for(int i=0;i<lView.getCount();i++){
          CheckBox rButton = (CheckBox)lView.getChildAt(i);
          
          if(rButton.isChecked()){
           list.add(getNumberById(i));
          }
         }
         
         sendBack(list);
        }
       
        public void sendBack(List<String> l){
         Intent intent = new Intent();
         Bundle bundle = new Bundle();
         
         String[] sArray = new String[l.size()];
         l.toArray(sArray);
         
         bundle.putStringArray("phone", sArray);
         
         intent.putExtras(bundle);
         
         this.setResult(RESULT_OK, intent);
         this.finish();
         
        }


    至此 黑名单列表选取 已经完成 下面讲自动静音功能 文件为:BlacklistMain

    布局:main.xml

    Java代码

    <?xml version="1.0" encoding="utf-8"?>  
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android
        android:orientation="vertical" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        >  
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android
        android:orientation="horizontal" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        >  
    <Button  
        android:id="@+id/buttonMain"    
        android:singleLine="true" 
        android:layout_width="wrap_content"   
        android:layout_height="wrap_content"   
        android:text="黑名单" 
        />  
    <Button  
        android:id="@+id/buttonClear"    
        android:singleLine="true" 
        android:layout_width="wrap_content"   
        android:layout_height="wrap_content"   
        android:text="清屏" 
        />  
    <Button  
        android:id="@+id/buttonList"    
        android:singleLine="true" 
        android:layout_width="wrap_content"   
        android:layout_height="wrap_content"   
        android:text="列举" 
        />  
    </LinearLayout>  
    <TextView  
        android:id="@+id/status"    
        android:layout_width="fill_parent"   
        android:layout_height="wrap_content"   
        />  
    </LinearLayout> 

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        >
    <Button
     android:id="@+id/buttonMain" 
     android:singleLine="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="黑名单"
        />
    <Button
     android:id="@+id/buttonClear" 
     android:singleLine="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="清屏"
        />
    <Button
     android:id="@+id/buttonList" 
     android:singleLine="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="列举"
        />
    </LinearLayout>
    <TextView
     android:id="@+id/status" 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        />
    </LinearLayout>

    1. 与BlacklistManager 即:黑名单列表选取 连接 的代码

    * 单击buttonMain 跳转至BlacklistManager

    Java代码

    findViewById(R.id.buttonMain).setOnClickListener(new OnClickListener(){  
                @Override 
                public void onClick(View v) {  
                    // TODO Auto-generated method stub  
                    sendGo();  
                }  
                  
            }); 

    findViewById(R.id.buttonMain).setOnClickListener(new OnClickListener(){
       @Override
       public void onClick(View v) {
        // TODO Auto-generated method stub
        sendGo();
       }
             
            });

    sendGo() 实现:

    Java代码

    public void sendGo(){  
            Intent i = new Intent(BlockMain.this,BlockManager.class);  
            this.startActivityForResult(i, ACTIVITY_CONTACTS_DO_CHECKED);  
        } 

    public void sendGo(){
         Intent i = new Intent(BlockMain.this,BlockManager.class);
         this.startActivityForResult(i, ACTIVITY_CONTACTS_DO_CHECKED);
        }

    其中 ACTIVITY_CONTACTS_DO_CHECKED 为int 用于标记具体是那个startActivity 之用

    Java代码
    public final static int ACTIVITY_CONTACTS_DO_CHECKED = 20; 

    public final static int ACTIVITY_CONTACTS_DO_CHECKED = 20; 

     * Activity 返回处理 即:从Intent中取出所有选中联系人列表 并存入List<String> 中

    Java代码

    protected void onActivityResult(int requestCode, int resultCode,  
                Intent data) {  
            switch(requestCode){  
            case ACTIVITY_CONTACTS_DO_CHECKED:  
                Bundle b = data.getExtras();  
                  
                String[] s = b.getStringArray("phone");  
                  
                blockList.clear();  
                for(String i:s){  
                    blockList.add(i);  
                }  
                  
                showBloclist();  
                  
                break;  
            }  
              
              
        } 

    protected void onActivityResult(int requestCode, int resultCode,
                Intent data) {
         switch(requestCode){
         case ACTIVITY_CONTACTS_DO_CHECKED:
          Bundle b = data.getExtras();
          
          String[] s = b.getStringArray("phone");
          
          blockList.clear();
          for(String i:s){
           blockList.add(i);
          }
          
          showBloclist();
          
          break;
         }
         
         
        }

    下面主要说下 电话呼叫拦截且静音 代码

    1. 继承PhoneStateListener 并实现其中的onCallStateChanged() 即:根据不同电话状态做定制化

    Java代码

    public class CustomPhoneCallListener extends PhoneStateListener {  
            @Override   
            public void onCallStateChanged(int state, String incomingNumber){  
     
                switch(state){  
                case TelephonyManager.CALL_STATE_IDLE:   
                    textStatus.append("\n"+"status:CALL_STATE_IDLE");  
                      
                    aManager.setRingerMode(AudioManager.  
                              RINGER_MODE_NORMAL);   
                    break;  
                      
                case TelephonyManager.CALL_STATE_OFFHOOK:  
                    textStatus.append("\n"+"status:CALL_STATE_OFFHOOK");  
                    break;  
                      
                case TelephonyManager.CALL_STATE_RINGING:  
                    textStatus.append("\n"+"status:CALL_STATE_RINGING:"+incomingNumber);  
                      
                    showBloclist();  
                      
                    if(isBlock(incomingNumber)){  
                        aManager.setRingerMode(AudioManager.  
                              RINGER_MODE_SILENT);  
                        showToast("Call-number:"+incomingNumber+"|silent");  
                    }  
                    else {  
                        showToast("Call-number:"+incomingNumber);  
                    }  
                      
                    break;  
                }  
                  
                super.onCallStateChanged(state, incomingNumber);  
                  
            }  
              
        } 

    public class CustomPhoneCallListener extends PhoneStateListener {
         @Override
            public void onCallStateChanged(int state, String incomingNumber){

          switch(state){
          case TelephonyManager.CALL_STATE_IDLE:
           textStatus.append("\n"+"status:CALL_STATE_IDLE");
           
           aManager.setRingerMode(AudioManager.
                           RINGER_MODE_NORMAL);
           break;
           
          case TelephonyManager.CALL_STATE_OFFHOOK:
           textStatus.append("\n"+"status:CALL_STATE_OFFHOOK");
           break;
           
          case TelephonyManager.CALL_STATE_RINGING:
           textStatus.append("\n"+"status:CALL_STATE_RINGING:"+incomingNumber);
           
           showBloclist();
           
           if(isBlock(incomingNumber)){
            aManager.setRingerMode(AudioManager.
                             RINGER_MODE_SILENT);
            showToast("Call-number:"+incomingNumber+"|silent");
           }
           else {
            showToast("Call-number:"+incomingNumber);
           }
           
           break;
          }
          
          super.onCallStateChanged(state, incomingNumber);
          
         }
         
        }

    其中 isBlock() 用于判断来电号码是否在黑名单中 实现为:

    Java代码

    public boolean isBlock(String s){  
            //to load all String stored in List<String> to String[]  
            String[] bArray = new String[blockList.size()];  
            blockList.toArray(bArray);  
     
            for(String s1:bArray){  
                if(s1.replace("-", "").equals(s)){  
                    return true;  
                }  
            }  
            return false;  
        } 

    public boolean isBlock(String s){
         //to load all String stored in List<String> to String[]
         String[] bArray = new String[blockList.size()];
         blockList.toArray(bArray);

         for(String s1:bArray){
          if(s1.replace("-", "").equals(s)){
           return true;
          }
         }
         return false;
        }

    对了 在最后别忘了监听电话状态 即:

    Java代码

    public void managerCallListener(){  
            aManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);  
            tManager = (TelephonyManager)getSystemService(  
                    TELEPHONY_SERVICE);  
              
            cpListener = new CustomPhoneCallListener();   
              
            tManager.listen(cpListener, PhoneStateListener.  
                LISTEN_CALL_STATE);  
              
        } 

    public void managerCallListener(){
         aManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
         tManager = (TelephonyManager)getSystemService(
                    TELEPHONY_SERVICE);
         
         cpListener = new CustomPhoneCallListener();
           
            tManager.listen(cpListener, PhoneStateListener.
                LISTEN_CALL_STATE);
           
        }

    3. emulator 运行截图:

    * 添加黑名单 选取:137 128

    \

    * 以号码:137 呼叫该emulator 即:gsm call 137

    \

    最后 BS android ! 不知道什么原因 开始在emulator 老失败 后来发现其不能打/接听电话 一拨出电话 就提示: Not register on network. 没办法 只有重新创建emulator再试

    至于怎么以指导号码向该emulator打电话 以前的博客有 大家自己找一下吧!

    done!!!

    展开全文
  • Android反面自动静音

    2011-05-13 15:38:00
    悦知文件出版的《Android SDK 开发范例大全》上有一个例子,就是当手机反过来时自动静音,这里面涉及到传感器的编程,今天练手,输入了一下,发现需要完善几个问题(书上只是点到为止嘛,更多的工作需要自己再努力 :...

    悦知文件出版的《Android SDK 开发范例大全》上有一个例子,就是当手机反过来时自动静音,这里面涉及到传感器的编程,今天练手,输入了一下,发现需要完善几个问题(书上只是点到为止嘛,更多的工作需要自己再努力 :-) ):

    1.如果旋转方向为X方向也应该自动静音

    2.如果已设置了静音或普通模式则不需要再重复设置

    3.在模拟器上有可能检测不到传感器,所以需要判断处理 

     

    下面贴出我完善了一下的代码,当然还有待改进(已重构了部分代码)  :-)

     

    package com.ad.android.reversemute;

    import java.util.List;

    import android.app.Activity;
    import android.content.Context;
    import android.hardware.Sensor;
    import android.hardware.SensorEvent;
    import android.hardware.SensorEventListener;
    import android.hardware.SensorManager;
    import android.media.AudioManager;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.TextView;

    public class MainActivity extends Activity 
    {
        
    /** Called when the activity is first created. */
        
    private SensorManager mSensorManager;
        
    private boolean mRegisteredSensor;
        
    private TextView mtvStatus;
        
    private int intCurRingerMode;
        
    private final String TAG="ReverseMute";
        
        
        @Override
        
    public void onCreate(Bundle savedInstanceState) 
        {
            
    super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            mtvStatus
    =(TextView)findViewById(R.id.tvStatus);
            mSensorManager
    =(SensorManager)getSystemService(Context.SENSOR_SERVICE);
            
    //取得现在的AudioManager模式显示在TextView中
            intCurRingerMode=GetAudioManagerMode();
            SetStatus(intCurRingerMode);
        }
        
        
    private void SetStatus(String info)
        {
            mtvStatus.setText(info);
        }
        
        
    private void SetStatus(int mode)
        {
            
    switch(mode)
            {
                
    //正常模式
                case AudioManager.RINGER_MODE_NORMAL:
                    mtvStatus.setText(R.string.str_normal_mode);
                    
    break;
                
    case AudioManager.RINGER_MODE_SILENT:
                    mtvStatus.setText(R.string.str_silent_mode);
                    
    break;
                
    case AudioManager.RINGER_MODE_VIBRATE:
                    mtvStatus.setText(R.string.str_vibrate_mode);
                    
    break;
            }
        }
        
        
    //取得当前的AudioManager模式
        private int GetAudioManagerMode()
        {
            
    int r=-1;
            
    try
            {
                AudioManager audioManager
    =(AudioManager)getSystemService(Context.AUDIO_SERVICE);
                
    if(audioManager!=null)
                {
                    r
    =audioManager.getRingerMode();
                }
            }
            
    catch(Exception e)
            {
                mtvStatus.setText(e.toString());
                e.printStackTrace();
            }
            
    return r;
        }
        
        
    //创建SensorListener捕捉onSensorChanged事件
        private final SensorEventListener mSensorListener=new SensorEventListener()
        {
            @Override
            
    public void onAccuracyChanged(Sensor sensor,int accuracy)
            {
                
    //TODO 
            }
            
            @Override
            
    public void onSensorChanged(SensorEvent event)
            {
                
    if(event.sensor.getType()==Sensor.TYPE_ORIENTATION)
                {
                    
    //取得平面左右倾斜的Pitch角度
                    float x=event.values[SensorManager.DATA_X];
                    
    float y=event.values[SensorManager.DATA_Y];
                    
    //float z=event.values[SensorManager.DATA_Z];
                    
                    
    //正面向下(Y轴旋转),经实验结果为小于-120为翻背面
                    
    //同样,增加对X轴旋转的判断
                    if(y<-120|x<-120)
                    {
                        
    //如果已经设置,则不再重复设置
                        if(intCurRingerMode==AudioManager.RINGER_MODE_NORMAL)
                        {    
                            
    //先设置为静音模式
                            SetRingMode(AudioManager.RINGER_MODE_SILENT);
                            
    //再设置为振动模式
                            SetRingMode(AudioManager.RINGER_MODE_VIBRATE);
                            intCurRingerMode
    =AudioManager.RINGER_MODE_SILENT;
                        }
                        Log.i(TAG,
    "正面朝下");
                    }
                    
    else  //正面朝上
                    {
                        
    if(intCurRingerMode==AudioManager.RINGER_MODE_SILENT)
                        {
                            SetRingMode(AudioManager.RINGER_MODE_NORMAL);
                            intCurRingerMode
    =AudioManager.RINGER_MODE_NORMAL;
                        }
                        Log.i(TAG,
    "正面朝上");
                    }
                    
                }
            }
            
            
    private void SetRingMode(int mode)
            {
                
    try
                {
                    AudioManager audioManager
    =(AudioManager)getSystemService(Context.AUDIO_SERVICE);
                    
    if(audioManager!=null)
                    {
                        audioManager.setRingerMode(mode);
                    }
                    SetStatus(mode);
                }
                
    catch(Exception e)
                {
                    mtvStatus.setText(e.toString());
                    e.printStackTrace();
                }
            }
       };
       
       @Override
       
    protected void onPause() {
            
    // TODO Auto-generated method stub
               if(mRegisteredSensor)
               {
                   mSensorManager.unregisterListener(mSensorListener);
               }
            
    super.onPause();
        }

        @Override
        
    protected void onResume() {
            
    // TODO Auto-generated method stub
            List<Sensor> sensors=mSensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
            
    try
            {
                
    //在模拟器上可能找不到传感器,所以如果不判断sensors的size的话在模拟器上调试会引发异常
                if(sensors.size()>=1)
                {
                    mRegisteredSensor
    =mSensorManager.registerListener(mSensorListener,sensors.get(0),SensorManager.SENSOR_DELAY_NORMAL);
                }
                
    else
                {
                    mtvStatus.setText(
    "没有找到传感器");
                }
            }
            
    catch(Exception e)
            {
                mtvStatus.setText(e.toString());
                e.printStackTrace();
            }
            
    super.onResume();
        }



    } 

    转载于:https://www.cnblogs.com/GarfieldTom/archive/2011/05/13/2045588.html

    展开全文
  • 回忆了一下,之前是在锁屏界面不小心向左划了下屏幕,手机自动切换到震动模式了;但过了一会,我又从顶部下拉菜单中把震动关了。本以为没事了,没想到激活了手机的“自主智能”。 上网查了半天,终于找到解决办法,...

    不得不话,现在的智能机真是太智能了。今天接打电话时,发现手机会自动切换到震动模式。我调回普通模式,一接打电话,又自动进入震动模式了,真是智能得一塌糊涂。

    回忆了一下,之前是在锁屏界面不小心向左划了下屏幕,手机自动切换到震动模式了;但过了一会,我又从顶部下拉菜单中把震动关了。本以为没事了,没想到激活了手机的“自主智能”。

    上网查了半天,终于找到解决办法,就是把“反转静音”这个功能关闭。参考:http://bbs.gfan.com/android-925868-1-1.html,在此对这位xdoo网友表示感谢。

    想起同学的一句话:智能机是给有智能的人用的。像我这种会刷机写程序,不敢说很有智能,但应该说玩手机已经有一定经验的人,都找半天才能解决,普通非IT人士要是遇到这个问题,估计得郁闷老久了。所以说MTK之类的山寨手机还是有市场的,大部分人用手机就是打电话发短信,并不不需要太高级的功能。

    展开全文
  • 悦知文件出版的《Android SDK 开发范例大全》上有一个例子,就是当手机反过来时自动静音,这里面涉及到传感器的编程,今天练手,输入了一下,发现需要完善几个问题(书上只是点到为止嘛,更多的工作需要自己再努力 :...

    悦知文件出版的《Android SDK 开发范例大全》上有一个例子,就是当手机反过来时自动静音,这里面涉及到传感器的编程,今天练手,输入了一下,发现需要完善几个问题(书上只是点到为止嘛,更多的工作需要自己再努力 :-) ):

    1.如果旋转方向为X方向也应该自动静音

    2.如果已设置了静音或普通模式则不需要再重复设置

    3.在模拟器上有可能检测不到传感器,所以需要判断处理

     

    下面贴出我完善了一下的代码,当然还有待改进(已重构了部分代码)  :-)



    1. package com.ad.android.reversemute;
    2. import java.util.List;
    3. import android.app.Activity;
    4. import android.content.Context;
    5. import android.hardware.Sensor;
    6. import android.hardware.SensorEvent;
    7. import android.hardware.SensorEventListener;
    8. import android.hardware.SensorManager;
    9. import android.media.AudioManager;
    10. import android.os.Bundle;
    11. import android.util.Log;
    12. import android.widget.TextView;
    13. public class MainActivity extends Activity
    14. {
    15.     /** Called when the activity is first created. */
    16.     private SensorManager mSensorManager;
    17.     private boolean mRegisteredSensor;
    18.     private TextView mtvStatus;
    19.     private int intCurRingerMode;
    20.     private final String TAG="ReverseMute";
    21.    
    22.    
    23.     @Override
    24.     public void onCreate(Bundle savedInstanceState)
    25.     {
    26.         super.onCreate(savedInstanceState);
    27.         setContentView(R.layout.main);
    28.         
    29.         mtvStatus=(TextView)findViewById(R.id.tvStatus);
    30.         mSensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
    31.         //取得现在的AudioManager模式显示在TextView中
    32.         intCurRingerMode=GetAudioManagerMode();
    33.         SetStatus(intCurRingerMode);
    34.     }
    35.    
    36.     private void SetStatus(String info)
    37.     {
    38.         mtvStatus.setText(info);
    39.     }
    40.    
    41.     private void SetStatus(int mode)
    42.     {
    43.         switch(mode)
    44.         {
    45.             //正常模式
    46.             case AudioManager.RINGER_MODE_NORMAL:
    47.                 mtvStatus.setText(R.string.str_normal_mode);
    48.                 break;
    49.             case AudioManager.RINGER_MODE_SILENT:
    50.                 mtvStatus.setText(R.string.str_silent_mode);
    51.                 break;
    52.             case AudioManager.RINGER_MODE_VIBRATE:
    53.                 mtvStatus.setText(R.string.str_vibrate_mode);
    54.                 break;
    55.         }
    56.     }
    57.    
    58.     //取得当前的AudioManager模式
    59.     private int GetAudioManagerMode()
    60.     {
    61.         int r=-1;
    62.         try
    63.         {
    64.             AudioManager audioManager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
    65.             if(audioManager!=null)
    66.             {
    67.                 r=audioManager.getRingerMode();
    68.             }
    69.         }
    70.         catch(Exception e)
    71.         {
    72.             mtvStatus.setText(e.toString());
    73.             e.printStackTrace();
    74.         }
    75.         return r;
    76.     }
    77.    
    78.     //创建SensorListener捕捉onSensorChanged事件
    79.     private final SensorEventListener mSensorListener=new SensorEventListener()
    80.     {
    81.         @Override
    82.         public void onAccuracyChanged(Sensor sensor,int accuracy)
    83.         {
    84.             //TODO
    85.         }
    86.         
    87.         @Override
    88.         public void onSensorChanged(SensorEvent event)
    89.         {
    90.             if(event.sensor.getType()==Sensor.TYPE_ORIENTATION)
    91.             {
    92.                 //取得平面左右倾斜的Pitch角度
    93.                 float x=event.values[SensorManager.DATA_X];
    94.                 float y=event.values[SensorManager.DATA_Y];
    95.                 //float z=event.values[SensorManager.DATA_Z];
    96.                
    97.                 //正面向下(Y轴旋转),经实验结果为小于-120为翻背面
    98.                 //同样,增加对X轴旋转的判断
    99.                 if(y<-120|x<-120)
    100.                 {
    101.                     //如果已经设置,则不再重复设置
    102.                     if(intCurRingerMode==AudioManager.RINGER_MODE_NORMAL)
    103.                     {   
    104.                         //先设置为静音模式
    105.                         SetRingMode(AudioManager.RINGER_MODE_SILENT);
    106.                         //再设置为振动模式
    107.                         SetRingMode(AudioManager.RINGER_MODE_VIBRATE);
    108.                         intCurRingerMode=AudioManager.RINGER_MODE_SILENT;
    109.                     }
    110.                     Log.i(TAG,"正面朝下");
    111.                 }
    112.                 else  //正面朝上
    113.                 {
    114.                     if(intCurRingerMode==AudioManager.RINGER_MODE_SILENT)
    115.                     {
    116.                         SetRingMode(AudioManager.RINGER_MODE_NORMAL);
    117.                         intCurRingerMode=AudioManager.RINGER_MODE_NORMAL;
    118.                     }
    119.                     Log.i(TAG,"正面朝上");
    120.                 }
    121.                
    122.             }
    123.         }
    124.         
    125.         private void SetRingMode(int mode)
    126.         {
    127.             try
    128.             {
    129.                 AudioManager audioManager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
    130.                 if(audioManager!=null)
    131.                 {
    132.                     audioManager.setRingerMode(mode);
    133.                 }
    134.                 SetStatus(mode);
    135.             }
    136.             catch(Exception e)
    137.             {
    138.                 mtvStatus.setText(e.toString());
    139.                 e.printStackTrace();
    140.             }
    141.         }
    142.    };
    143.    
    144.    @Override
    145.    protected void onPause() {
    146.         // TODO Auto-generated method stub
    147.            if(mRegisteredSensor)
    148.            {
    149.                mSensorManager.unregisterListener(mSensorListener);
    150.            }
    151.         super.onPause();
    152.     }
    153.     @Override
    154.     protected void onResume() {
    155.         // TODO Auto-generated method stub
    156.         List<Sensor> sensors=mSensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
    157.         try
    158.         {
    159.             //在模拟器上可能找不到传感器,所以如果不判断sensors的size的话在模拟器上调试会引发异常
    160.             if(sensors.size()>=1)
    161.             {
    162.                 mRegisteredSensor=mSensorManager.registerListener(mSensorListener,sensors.get(0),SensorManager.SENSOR_DELAY_NORMAL);
    163.             }
    164.             else
    165.             {
    166.                 mtvStatus.setText("没有找到传感器");
    167.             }
    168.         }
    169.         catch(Exception e)
    170.         {
    171.             mtvStatus.setText(e.toString());
    172.             e.printStackTrace();
    173.         }
    174.         super.onResume();
    175.     }

    转载于:https://www.cnblogs.com/xingmeng/archive/2012/03/30/2424887.html

    展开全文
  • 赖可 发自 凹非寺量子位 报道 | 公众号 QbitAI更新一下软件,就像有了新手机。谷歌Pixel手机的一大特色就是,随着软件更新,会不断下放新功能。...
  • 这款Escape Jacket衬里内置NFC芯片。当你将手机放进外套里,这些NFC芯片就能自动阻挡手机的天线信号,从而节省了因盲目寻找信号而耗费的电量。
  • 程序功能:在主界面中有两种模式选择,一个是会议模式,一个是正常模式,当选择会议模式,手机设定为静音,当选择为正常模式,手机设定为响铃。当单击添加按钮时,系统会自动从编辑框中提取输入电话号码,若输入的...
  • 手机情景模式跟下拉菜单下设置静音,振动,可证实已设置好 但打电话过来,奇迹地响铃了,情景模式中从“静音”选中变成“标准”选中,下拉菜单中也变成“标准”选中 但是如果不是打电话过来。是发短信过来就无此...
  • ,主要监听并且自动接听电话,接听后用户可以选择打开或者关闭扩音, 但是用我开发的app拨打一次电话后,再用系统自带的拨号进行打电话就会出现, 对方接听后 这边说话对方听不到 ,如果把软件卸载后再重启手机 ...
  • 问题:在HTML5中自动找到屏蔽和取消静音音频(没有VideoPlayer)的有效功能,直到超过定义的时间。我将振荡器的增益设置为从0逐渐增加到1(在每个增益单位的增加中被一束1秒的静音中断)直到达到30秒。为此,调用了...
  • 相信很多Web前端开发小伙伴因为工作的需求,在研究怎么通过HTML5实现视频在手机浏览器的自动播放(主流浏览器)。在这里,我要告诉大家: Chrome for Android 从版本54开始支持静音视频自动播放 Safari for iOS 10...
  • 上下课手机自动静音 更换主题,背景图片 查成绩 应用截图 项目依赖库 gson butterknife eventbus greendao bugly colorpreference matisse glide statusbarutil ...
  • [html] HTML5的video在手机端如何实现进来页面...所以,需要添加静音才能自动播放。 <video muted src="" autoplay loop></video> 但是这样没有声音怎么办? 浏览器设置中开启音频权限。 移动端播放,解
  • 关闭自动静音、可以试着开启锁屏清理内存,增加待机时间。 小米手机关闭流量提醒
  • 当我们在会议期间由于忘记将手机保持静音模式而突然响起手机时,我们当中有多少人面临尴尬? 您每天睡觉前会调暗手机的亮度吗? 您是否每天要在离开家上班之前打开移动数据并关闭WIFI,然后在回国时做相反的事情? ...
  • 365手机通讯秘书.zip

    2019-07-10 15:43:10
    如今天出去爬山,不想带手机,给手机设置了自动留言功能,有电话进来自动接听,嘟的一声,播放事先录制好的声音,提示有事请留言,然后开始录制,挂断之后自动结束录音并保存录音。 1.6 设置: 1.6.1 免扰模式...
  • 今天主要是想介绍一个很好用功能很强大的软件,可以自定义来做很多事情。先想个问题,你是否遇到过以下的场景: ...希望回到家的时候,手机自动打开WiFi自动连接上,并且还自动打开某个视频APP? 。。。 看...
  • 比如你的女朋友和老婆,在你开会,在你手机没电的时候,在你手机静音的时候,打电话发短信给你,你不想她们着急,或者什么原因需要回复她们。那么只需要在你的手机上安装这样一款软件: (1)这款软件可以根据或者...
  • SC6600L手机使用手册

    2011-03-16 15:13:27
    15.2 手机自动关机 87 15.3 PIN/PUK码锁定 87 15.4 通话质量差 88 15.5 无法接听电话 88 15.6 无法拨打电话 89 15.7 通话音量小 89 15.8 对方无法听到您的声音 89 15.9 来电不响铃 89 15.10电池无法充电 90 15.11 ...
  • 1. CheckBox 用于 确定/取消 某项功能 如:是否静音 对应于:CheckBoxPreference 其在Preference 有一个选项与其自动绑定 下同  2. ListView 用于列出所有选择 如:铃声选择 列出所有声音供选择使用 ...
  • 我有一个移动端的HTML5游戏,运行时当有电话打进来时,游戏中的声音自动静音,这个很正常。问题时电话结束后,网页重新恢复到前台,游戏还有继续玩,但是游戏中的声音却永远消失了(包括当时正在播放的声音和未播放...
  • 一个不错的定时程序,写的很好的

    千次阅读 2014-01-14 23:34:44
     ... “本文参与趣米杯征文活动,如需转载请注明出处和作者”。...quitesleep是一款android手机的小...自动挂断或者设定为静音,并给打电话的人回复你之前设定好的邮件或者短信。保证你睡觉的时候不受打扰。  
  • 1. 远程声音播放方案简介 目前终端常见的声音输出方式可以有喇叭、耳机、蓝牙,并且具备声音输出...比如:用户观看电视节目,当手机app连接电视,用户选择手机发声,那么电视机的喇叭自动静音,而将声音转到手机上...
  • 由于现在的汽车市场迅速发展,人们对汽车的依赖也日益严重,交通事故也随之增长。相对的,各国政府都积极运用法律...若选择通过车上的音响进行通话,当有来电或拨打电话时,车上音响会自动静音,通过音响的扬声器/麦克

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 125
精华内容 50
关键字:

手机自动静音