当前位置: 首页 > 面试题库 >

Android通话以编程方式应答

姜钊
2023-03-14
问题内容

是否可以以编程方式在android中接听电话?

我找到了一些不可能的地方,但随后安装了应用https://play.google.com/store/apps/details?id=com.a0softus.autoanswer可以
正常工作。

我已经搜索了很多并尝试了很多方法,而且呼叫拒绝功能正常,但呼叫应答功能却无效。

我尝试了以下代码进行电话应答,如下所示:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.res.AssetFileDescriptor;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.KeyEvent;

import java.io.IOException;
import java.lang.reflect.Method;

import app.com.bikemode.MainActivity;
import app.com.bikemode.R;

public class IncomingCallReceiver extends BroadcastReceiver {
    String incomingNumber = "";
    AudioManager audioManager;
    TelephonyManager telephonyManager;
    Context context;
    private MediaPlayer mediaPlayer;

    public void onReceive(Context context, Intent intent) {
        // Get AudioManager
        this.context = context;
        mediaPlayer = new MediaPlayer();
        audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
        // Get TelephonyManager
        telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        if (intent.getAction().equals("android.intent.action.PHONE_STATE")) {
            String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
            if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
                // Get incoming number
                incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);

            }
        }

        if (!incomingNumber.equals("")) {
            // Get an instance of ContentResolver
           /* ContentResolver cr=context.getContentResolver();
            // Fetch the matching number
            Cursor numbers=cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,  new  String[]{ContactsContract.CommonDataKinds.Phone.CONTACT_ID,ContactsContract.CommonDataKinds.Phone.NUMBER},  ContactsContract.CommonDataKinds.Phone.NUMBER +"=?", new String[]{incomingNumber},  null);
            if(numbers.getCount()<=0){ // The incoming number is not  found in the contacts list*/
            // Turn on the mute
            //audioManager.setStreamMute(AudioManager.STREAM_RING,  true);
            // Reject the call
            //rejectCall();
            // Send the rejected message ton app
            //startApp(context,incomingNumber);
            // }

            //audioManager.setStreamMute(AudioManager.STREAM_RING, true);
            //rejectCall();
            //startApp(context, incomingNumber);
            acceptCall();
        }
    }


    private void startApp(Context context, String number) {
        Intent intent = new Intent(context, MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra("number", "Rejected incoming number:" + number);
        context.startActivity(intent);
    }

    private void rejectCall() {
        try {

            // Get the getITelephony() method
            Class<?> classTelephony = Class.forName(telephonyManager.getClass().getName());
            Method method = classTelephony.getDeclaredMethod("getITelephony");
            // Disable access check
            method.setAccessible(true);
            // Invoke getITelephony() to get the ITelephony interface
            Object telephonyInterface = method.invoke(telephonyManager);
            // Get the endCall method from ITelephony
            Class<?> telephonyInterfaceClass = Class.forName(telephonyInterface.getClass().getName());
            Method methodEndCall = telephonyInterfaceClass.getDeclaredMethod("endCall");
            // Invoke endCall()
            methodEndCall.invoke(telephonyInterface);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    private void acceptCall() {
        try {
           /* // Get the getITelephony() method
            Class<?> classTelephony = Class.forName(telephonyManager.getClass().getName());
            Method method = classTelephony.getDeclaredMethod("getITelephony");
            // Disable access check
            method.setAccessible(true);
            // Invoke getITelephony() to get the ITelephony interface
            Object telephonyInterface = method.invoke(telephonyManager);
            // Get the endCall method from ITelephony
            Class<?> telephonyInterfaceClass = Class.forName(telephonyInterface.getClass().getName());
            Method methodEndCall = telephonyInterfaceClass.getDeclaredMethod("answerRingingCall");
            // Invoke endCall()
            methodEndCall.invoke(telephonyInterface);*/
            Intent buttonUp = new Intent(Intent.ACTION_MEDIA_BUTTON);
            buttonUp.putExtra(Intent.EXTRA_KEY_EVENT,
                    new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK));
            context.sendOrderedBroadcast(buttonUp, "android.permission.CALL_PRIVILEGED");
            playAudio(R.raw.a);

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }


    private void playAudio(int resid) {
        AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid);
        try {
            mediaPlayer.reset();
            mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
            mediaPlayer.prepare();
            mediaPlayer.start();
            afd.close();
        } catch (IllegalArgumentException e) {
            Log.w("Rahul Log",e.getMessage());
        } catch (IllegalStateException e) {
            Log.w("Rahul Log", e.getMessage());
        } catch (IOException e) {
            Log.w("Rahul Log", e.getMessage());
        }
    }
}

函数拒绝调用可以正常工作,但是接受调用不能正常工作。


问题答案:

我的应用程序遇到了同样的问题。设置一些接受来电的延迟(〜3000 ms)。您还需要acceptCall()在其他线程中调用方法。

请参阅如何在Android5.0(Lollipop)中以编程方式接听来电?

new Thread(new Runnable() {
            @Override
            public void run() {
                acceptCall();
            }
        }).start();

private void acceptCall() {
        try {
            // Get the getITelephony() method
            Class<?> classTelephony = Class.forName(telephonyManager.getClass().getName());
            Method method = classTelephony.getDeclaredMethod("getITelephony");
            // Disable access check
            method.setAccessible(true);
            // Invoke getITelephony() to get the ITelephony interface
            Object telephonyInterface = method.invoke(telephonyManager);
            // Get the endCall method from ITelephony
            Class<?> telephonyInterfaceClass = Class.forName(telephonyInterface.getClass().getName());
            Method methodEndCall = telephonyInterfaceClass.getDeclaredMethod("answerRingingCall");
            // Invoke endCall()
            methodEndCall.invoke(telephonyInterface);

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }


 类似资料:
  • 问题内容: 在我的应用程序中,我将维护一个联系人列表。 列表中联系人的所有呼叫都将被挂断。他们会在未接来电下显示,但电话不会响铃。 问题答案: 首先创建此接口: 然后创建扩展BroadcastReceiver的此类 这只会阻止该单个电话号码,但是您明白了。 在清单中添加以下内容:

  • 通话录音API在Android 9上已经不起作用了 入境的 在新的Android 9操作系统中,它内置了自动通话记录功能。解决这个问题的办法是使用默认的电话系统应用程序,启用自动记录所有通话。 到目前为止,仅记录了手动步骤,如下所述: Vivo 转到“设置” 小米步骤可能会有所不同 三星步骤可能不同 需要以编程方式实现这一点 > 我正在寻找一种解决方案,以编程方式执行此步骤,同时考虑所有移动属性。

  • 我想以编程方式取消系统生成的报警对话框。我已经尝试了这里提供的所有解决方案(stackoverflow)但似乎都不起作用。这是普遍接受的答案,但它只排除了通知面板和最近的任务菜单。 我已经在操作系统版本4.0.3、4.2.2、4.4.2和5.1.1的设备上测试了它,它在所有这些设备上都具有相同的行为。有一些应用程序实际上可以取消所有的系统对话框(Mubble)。有人能建议一下是怎么做的吗? 谢谢

  • 问题内容: 尝试启动并通过电话。没有。通过我的应用中的此代码进行Skype: Skype已启动,但无法捕获该数字。 问题答案: 此代码对我有用,可以在两个Skype用户之间发起呼叫: 要找到这个(和其他),请使用打开。查看AndroidManifest.xml,您将看到他们所知道的所有意图过滤器。如果要触发这些意图过滤器之一,则需要制定一个与之匹配的意图。这是上面的代码匹配的意图过滤器: 您可以从

  • 问题内容: 如何更改应用程序标签以更改从android中的Java代码显示的应用程序名称?我指的是: 在Android清单中 有什么方法可以更新 strings.xml 文件中的值? 问题答案: 目前尚不可能。它是AndroidManifest.xml文件中的固定字符串,无法在运行时更改。

  • 问题内容: 我想使用来测试崩溃报告,但第一步是我需要使用代码在Android中模拟致命崩溃。 任何想法? 问题答案: 更新:也可以尝试这种创建方法, 并将其称为某处/ buttonClick 或直接抛出未捕获的异常 答对了!