呼叫开始在报警设置中自动设置扬声器

时间:2014-05-07 06:13:09

标签: android broadcastreceiver android-manifest alarmmanager

我的应用程序基于设置闹钟时间,并在扬声器开启的情况下使呼叫在完美时间自动启动。我正在使用

    <uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.READ_CONTACTS"/>

在我的申请中。如果我们只考虑应用程序,它的工作正常。但奇怪的行为是在安装此应用程序之后,当我不使用应用程序时,每次此应用程序打开时,每次调用都以扬声器开始。 如何克服这个??? 如果我不使用此应用程序或想在我的应用程序中实现此所有权限限制,我不希望扬声器开启。请问有什么想法?

1 个答案:

答案 0 :(得分:0)

定义 boolean callFromApp=false; //要控制来自应用程序boolean callFromOffHook=false;的调用//要控制对应用程序调用的更改为空闲状态

开始电话:

 PhoneCallListener phoneListener = new  PhoneCallListener();
 TelephonyManager telephonyManager = 
(TelephonyManager).getSystemService(Context.TELEPHONY_SERVICE);
                 telephonyManager.listen(phoneListener,PhoneStateListener.LISTEN_CALL_STATE);
                 Intent callIntent = new Intent(Intent.ACTION_CALL);
                callIntent.setData(Uri.parse("tel:"+phoneNumber));             
                callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
                startActivity(callIntent);
 callFromApp= true ; 

PhoneStateListener class

class PhoneCallListener extends PhoneStateListener {

    private boolean isPhoneCalling = false;



    @Override
    public void onCallStateChanged(int state, String incomingNumber) {

        if (TelephonyManager.CALL_STATE_RINGING == state) {
            // phone ringing


            if (callFromApp)
            {
              AudioManager audioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
              audioManager.setMode(AudioManager.MODE_IN_CALL);
              audioManager.setSpeakerphoneOn(true);
            }

        }

    if (TelephonyManager.CALL_STATE_OFFHOOK == state) {
            // active


            isPhoneCalling = true;

            if (callFromApp)
            {
              AudioManager audioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
              audioManager.setMode(AudioManager.MODE_IN_CALL);
              audioManager.setSpeakerphoneOn(true);
            }

    }

        if (TelephonyManager.CALL_STATE_IDLE == state) {
        // run when class initial and phone call ended, need detect flag



            if (isPhoneCalling) {

              isPhoneCalling = false;
              callFromApp = false;
                  AudioManager audioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
                    audioManager.setMode(AudioManager.MODE_NORMAL); //Deactivate loudspeaker
// Remove listener
                      PhoneCallListener phoneListener = new  PhoneCallListener();
                     TelephonyManager telephonyManager = (TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE);
                     telephonyManager.listen(phoneListener,PhoneStateListener.LISTEN_NONE);

            }

            }
        }
    }
希望..这会对你有所帮助。它完美地工作而不影响其他:)