【问题标题】:Selective silent mode选择性静音模式
【发布时间】:2013-07-14 23:59:52
【问题描述】:

我开发了一个应用程序,即使手机处于静音模式,它也会有选择地为某些号码响铃。我已经编写了在广播接收器中让它更响亮的代码。

广播接收者是

     AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);

     switch (am.getRingerMode()) {
         case AudioManager.RINGER_MODE_SILENT:
             Log.i("MyApp","Silent mode");
             profileStatus = 1;
             break;
         case AudioManager.RINGER_MODE_VIBRATE:
             Log.i("MyApp","Vibrate mode");
             break;
         case AudioManager.RINGER_MODE_NORMAL:
             Log.i("MyApp","Normal mode");
             profileStatus= 2;
             break;
     }
    System.out.println("The Profile Status"+profileStatus);
    System.out.println("The Old Profile Status"+oldProfileStatus);
    System.out.println("The Count = "+count  );

  if(profileStatus==1)
  {
        System.out.println("ProfileStatus"+profileStatus);

     OpenHelper db = new OpenHelper(context);
     //Getting Data From The DataBase

     CONTACT_DATA = db.Contact_Records();

     if (CONTACT_DATA.size() > 0)
     {
       //Log.e("ARRAY", "not null"); 

       for(int i =0;i<CONTACT_DATA.size();i++)
       {
           HashMap<String, String> map = CONTACT_DATA.get(i); 
           phone_number     =  map.get("phone_number"); 
       }
     }


         Bundle bundle = intent.getExtras();
         final AudioManager mobilemode = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
         if(null == bundle)
                 return;

         Log.i("IncomingCallReceiver",bundle.toString());

         String state = bundle.getString(TelephonyManager.EXTRA_STATE);

         Log.i("IncomingCallReceiver","State: "+ state);
         if(state.equals("IDLE"))
         {

             System.out.println("THE STATE IS IDLE");
             mobilemode.setRingerMode(AudioManager.RINGER_MODE_SILENT);

         }



         if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING))
         {
                 String phonenumber = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);        
                 Log.i("IncomingCallReceiver","Incomng Number:from receiver------------------ " + phonenumber);
                 String info = "Detect Calls sample application\nIncoming number: " + phonenumber;



                 AudioManager maudio=(AudioManager)context.getSystemService(context.AUDIO_SERVICE);

                 bundle = intent.getExtras();
                 this.context = context;

                 if(null == bundle)
                         return;


                 state = bundle.getString(TelephonyManager.EXTRA_STATE);

                 if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING))
                 {
                         check();
                         PhoneNumber = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);

                           for(int i =0;i<CONTACT_DATA.size();i++)
                           {
                               HashMap<String, String> map = CONTACT_DATA.get(i); 
                               phone_number     =  map.get("phone_number"); 
                                 if (PhoneNumber.equals(phone_number)) {
                                }
                            if((PhoneNumber.equals(phone_number)))
                            {
                                makeitNormal();
                                maudio.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                                oldProfileStatus = profileStatus;
                                System.out.println("The Profile Status==="+oldProfileStatus);
                                count=1;
                            }
                           }

                 }
                 if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_OFFHOOK))
                 {
                     makeItSilent();
                     mobilemode.setRingerMode(AudioManager.RINGER_MODE_SILENT);
                 }

                 if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE))
                 {
                     makeItSilent();
                     mobilemode.setRingerMode(AudioManager.RINGER_MODE_SILENT);

                 }

//

 }
         }
  else
  {
      System.out.println("The System  Is In Normal Mode ");
      count=0;
  }
 }
 private void check() {
      // TODO Auto-generated method stub
      AudioManager maudio=(AudioManager)context.getSystemService(context.AUDIO_SERVICE);
      ringerMode=maudio.getRingerMode();

    }

    private void makeitNormal() {
      // TODO Auto-generated method stub

      AudioManager maudio=(AudioManager)context.getSystemService(context.AUDIO_SERVICE);
      maudio.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
    }


    private void makeItSilent() {
      // TODO Auto-generated method stub
      AudioManager maudio=(AudioManager)context.getSystemService(context.AUDIO_SERVICE);
      int ringer=maudio.getRingerMode();
      if (ringerMode==AudioManager.RINGER_MODE_SILENT){

          maudio.setRingerMode(AudioManager.RINGER_MODE_SILENT);

      }else if(ringerMode==AudioManager.RINGER_MODE_NORMAL){
          maudio.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
      }
      else if(ringerMode==AudioManager.RINGER_MODE_VIBRATE){
          maudio.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
      }

    }

    public void onAccuracyChanged(Sensor arg0, int arg1) {
      // TODO Auto-generated method stub
    }

    public void onSensorChanged(SensorEvent event) {
      // TODO Auto-generated method stub
    }

我面临的问题是 1)安装后第一次不响,之后完美运行 2)它不适用于 HTC 手机,但它可以在三星中使用

【问题讨论】:

    标签: android


    【解决方案1】:

    您的 BroadcastReceiver 做的太多了。它的生命周期仅与它的 onReceive() 方法一样长,因此您不会获得您投入其中的所有功能。尝试将你的音量操作代码移动到一个服务中,并使用广播接收器作为一个简单的代理来告诉服务何时来电。您通常应该避免在 BroadcastReceiver 的上下文中进行繁重的操作。

    此外,仅调用 setRingerMode(AudioManager.RINGER_MODE_NORMAL) 并不总是足以取消铃声。您还需要调用 setStreamMute(AudioManager.STREAM_RING, false) 和 setStreamVolume(AudioManager.STREAM_RING, someAudibleVolume, 0)。在许多设备上,铃声模式可以是“正常”,而铃声音量是“0”。

    顺便说一句,我编写了一个与您描述的非常相似的应用程序,并祝您好运:)。在尝试一致地操纵铃声音量时,您会看到 Android 设备生态系统中最严重的碎片化。例如在三星 Galaxy Nexus 上,您可以在来电开始后轻松覆盖和控制音量。然而,在 Galaxy S3 上,铃声音量会在来电时忽略更改音量的尝试,并且需要一些巧妙的(读作“hackish”)解决方法。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 2014-09-26
    • 1970-01-01
    • 2011-06-21
    • 2017-09-24
    • 2017-08-11
    • 1970-01-01
    相关资源
    最近更新 更多