在api 24中无法以编程方式接听电话

时间:2018-06-10 05:00:05

标签: java android

下面是我的代码以编程方式接听电话。使用此代码,我可以接听电话,直到marshmallow然后奥利奥,但不是在Android 7.0.Any解决方案接听Android 7.0中的电话也。在android 8.o有允许接听电话,但在Android 7.0中无法接听电话。

public class AcceptCallActivity extends Activity {

private static Logger logger = Logger.getLogger(String.valueOf(AcceptCallActivity.class));

private static final String MANUFACTURER_HTC = "HTC";

private KeyguardManager keyguardManager;
private AudioManager audioManager;
private CallStateReceiver callStateReceiver;
Context context;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_home);
    keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
    audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

}

@Override
protected void onResume() {
    super.onResume();

    registerCallStateReceiver();
    updateWindowFlags();
    acceptCall();


}

@Override
protected void onPause() {
    super.onPause();

    if (callStateReceiver != null) {
        unregisterReceiver(callStateReceiver);
        callStateReceiver = null;
    }
}

private void registerCallStateReceiver() {
    callStateReceiver = new CallStateReceiver();
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
    registerReceiver(callStateReceiver, intentFilter);
}

private void updateWindowFlags() {
    if (keyguardManager.inKeyguardRestrictedInputMode()) {
        getWindow().addFlags(
                WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                        WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
                        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    } else {
        getWindow().clearFlags(
                WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                        WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
                        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    }
}

@SuppressLint("MissingPermission")
private void acceptCall() {

    // for HTC devices we need to broadcast a connected headset
    boolean broadcastConnected = MANUFACTURER_HTC.equalsIgnoreCase(Build.MANUFACTURER)
            && !audioManager.isWiredHeadsetOn();

    if (broadcastConnected) {
        broadcastHeadsetConnected(false);
    }

    try {

        try {
            // logger.debug("execute input keycode headset hook");






                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {


                    TelecomManager tm = (TelecomManager) context
                            .getSystemService(Context.TELECOM_SERVICE);
                    if (tm == null) {
                        // whether you want to handle this is up to you really
                        throw new NullPointerException("tm == null");
                    }
                    tm.acceptRingingCall();
                }else{

                    Runtime.getRuntime().exec("input keyevent " +
                            Integer.toString(KeyEvent.KEYCODE_HEADSETHOOK));



                }




        } catch (IOException e) {
            // Runtime.exec(String) had an I/O problem, try to fall back
            //    logger.debug("send keycode headset hook intents");
            String enforcedPerm = "android.permission.CALL_PRIVILEGED";
            Intent btnDown = new Intent(Intent.ACTION_MEDIA_BUTTON).putExtra(
                    Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN,
                            KeyEvent.KEYCODE_HEADSETHOOK));
            Intent btnUp = new Intent(Intent.ACTION_MEDIA_BUTTON).putExtra(
                    Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP,
                            KeyEvent.KEYCODE_HEADSETHOOK));

            sendOrderedBroadcast(btnDown, enforcedPerm);
            sendOrderedBroadcast(btnUp, enforcedPerm);
        }
    } finally {
        if (broadcastConnected) {
            broadcastHeadsetConnected(false);
        }
    }



}

private void broadcastHeadsetConnected(boolean connected) {
    Intent i = new Intent(Intent.ACTION_HEADSET_PLUG);
    i.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
    i.putExtra("state", connected ? 1 : 0);
    i.putExtra("name", "mysms");
    try {
        sendOrderedBroadcast(i, null);
    } catch (Exception e) {
    }
}

public class CallStateReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String statestr = intent.getExtras().getString(TelephonyManager.EXTRA_STATE);
        if(statestr.equals(TelephonyManager.EXTRA_STATE_OFFHOOK))
        {
            final Handler mHandler = new Handler();
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

                    // this doesnt work without android.permission.MODIFY_PHONE_STATE
                    // audioManager.setMode(AudioManager.MODE_IN_CALL);

                    // weirdly this works
                    audioManager.setMode(AudioManager.MODE_NORMAL); // this is important
                    audioManager.setSpeakerphoneOn(true);

                    // note the phone interface won't show speaker phone is enabled
                    // but the phone speaker will be on
                    // remember to turn it back off when your done ;)
                }
            }, 500); // half a second delay is important or it might fail
        }

        }
            // try and turn on speaker phone



    }
}

0 个答案:

没有答案