当前位置: 首页 > 知识库问答 >
问题:

ITelephony接口方法answerRingingCall()不工作

梁鸿风
2023-03-14

我想接收来自我的应用程序的来电,我正在使用itelephony.aidl结束和接收来电。我写了下面的代码来回答按下的呼叫按钮,大多数情况下我能够结束所有设备上的呼叫,但当我试图接收一个呼叫时,它不工作。

此(呼叫应答)代码在我测试过的一些设备上运行良好(Motorola**e3 6.0Android安全补丁2016年6月1日、honor 4.4.4、YU 4.4.4等)它在(小米note 4 6.0.1,lyf 6.O.1Android安全补丁2017年3月1日)上运行不正常`可能是由于最新版本的Android安全补丁更新造成的。

我认为谷歌已经允许一些权限只对系统应用程序出于安全的原因,在Android安全补丁的最新更新中,从2016年6月1日到2017年3月1日。

请帮忙,谢谢。

    private void m13352k() {
     try {
        TelephonyManager telephonyManager = (TelephonyManager) 
        getSystemService("phone");

        Method declaredMethod = 
        Class.forName(telephonyManager.getClass().getName()).
        getDeclaredMethod("getITelephony", new Class[0]);
        declaredMethod.setAccessible(true);
        ITelephony iTelephony = (ITelephony) 
        declaredMethod.invoke(telephonyManager, new Object[0]);
        iTelephony.silenceRinger();
        iTelephony.answerRingingCall();
    } catch (Exception e) {
        try {
            m13350j();
        } catch (Exception e2) {
            m13349i();
        }
    }
}
    private void m13349i() {
    try {
        Intent intent = new Intent(callerIdConfig.mediaButton());
        intent.putExtra("android.intent.extra.KEY_EVENT", new KeyEvent(0, 79));
        sendOrderedBroadcast(intent, callerIdConfig.callPrivileged());
        intent = new Intent(callerIdConfig.mediaButton());

        intent.putExtra("android.intent.extra.KEY_EVENT", new KeyEvent(1, 79));
        sendOrderedBroadcast(intent, callerIdConfig.intentCallPrivileged());
        intent = new Intent(callerIdConfig.headsetPlug());
        intent.addFlags(1073741824);

        intent.putExtra("state", callerIdConfig.m13633f());
        intent.putExtra("name", callerIdConfig.headset());
        sendOrderedBroadcast(intent, null);
    } catch (Exception e) {
        e.printStackTrace();
    }}
    private void m13350j() {
    Intent intent = new Intent("android.intent.action.HEADSET_PLUG");
    intent.addFlags(1073741824);
    intent.putExtra("state", callerIdConfig.m13633f());//0
    intent.putExtra("name", callerIdConfig.headset());
    sendOrderedBroadcast(intent, null);

    intent = new Intent(callerIdConfig.mediaButton());
    intent.putExtra("android.intent.extra.KEY_EVENT", new KeyEvent(0, 79));
    sendOrderedBroadcast(intent, callerIdConfig.intentCallPrivileged());
    intent = new Intent(callerIdConfig.mediaButton());

    intent.putExtra("android.intent.extra.KEY_EVENT", new KeyEvent(1, 79));
    sendOrderedBroadcast(intent, callerIdConfig.intentCallPrivileged());
    intent = new Intent("android.intent.action.HEADSET_PLUG");
    intent.addFlags(1073741824);

    intent.putExtra("state", callerIdConfig.m13629e());//1
    intent.putExtra("name", callerIdConfig.headset());//"Headset"
    sendOrderedBroadcast(intent, null);
}

当我点击接收来自我的应用程序的电话时,我得到了下面的日志,请提供解决方案

W/System.err:at android.app.activitymanagerproxy.broadcastint(activitymanagernative.java:3218)06-27 12:33:34.161 245 65-24565/smartcall.talktime.balance.phone.dialer w/system.err:at android.app.contextimpl.sendorderedbroadcast(contextwrapper.java:426)06-27 12:33:34.161 245 65-24565/smartcall.talktime.balance.phone.34.161 245 65-24565/smartcall.talktime.balance.phone.dialer w/system.err:at smartcall.talktime.balance.phone.dialer.callRecorder.activity.fullscreencalleractivity.m13349i(fullscreencalleractivity.java:253)06-27 12:33:34.161 245 65-)06-27 12:33:34.161 245 65-24565/SmartCall.talktime.balance.phone.dialer.callRecorder.activity.fullscreencalleractivity.access$200(fullscreencalleractivity.java:35)06-27 12:33:34.161 245 65-24565/smartcall.talktime.balance.phone.dialer w/system.err:at smartcall.talktime.palance.phone.dialer活动$2.运行(fullscreencalleractivity.java:212)06-27 12:33:34.161 245 65-15)06-27 12:33:34.161 245 65-24565/smartcall.talktime.balance.phone.dialer W/system.err:at android.os.handler.dispatchmessage(handler.java:104)06-27 12:33:34.161 245 65-24565/smartcall.talktime.balance.phone.dialer W/system.err:at android.os.looper.loop(looper.java:207)06-27 12:33:34.161 245 65-24565/smartcall.talktime..java:5767)06-27 12:33:34.161 245 65-24565/smartcall.talktime.balance.phone.dialer W/system.err:at java.lang.reflect.Method.invoke(原生方法)06-27 12:33:34.16124565-24565/smartcall.talktime.balance.phone.dialer W/system.err:at com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:789)06-27 12:33:34.161 245 65-24565/smartcall.talktime.balance.phone.dialer W/system.err:at com.android.internal.os.zygoteinit.java:679)

=========================================================================================

共有1个答案

姬昊焱
2023-03-14

我发现此解决方案在状态栏中显示呼叫通知的一些设备上运行良好,此解决方案支持2017年3月1日Android安全补丁更新后(此解决方案可能不适用于三星和oppo或其他设备)仍在寻找完美的解决方案,如果有人发现请更新,谢谢

import android.annotation.TargetApi;
import android.app.Notification;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Build;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.util.Log;

import java.util.Arrays;

 @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
public class NotificationService extends NotificationListenerService {
public static PendingIntent pendingIntent;

//start service on call notification get
@Override
public void onNotificationPosted(StatusBarNotification sbn) {

    try {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            Log.e("onNotificationSag", "titleaction"+ Arrays.toString(sbn.getNotification().actions));

            if (sbn.getNotification().actions != null) {
                for (Notification.Action action : sbn.getNotification().actions) {
                    Log.e("onNotificationSag", "action" + action.title);
                    if (action.title.toString().equalsIgnoreCase("Answer")) {
                        pendingIntent = action.actionIntent;
                        //  try {
                        //receive call automatically
                        pendingIntent.send();

                        //} catch (PendingIntent.CanceledException e) {
                        //     e.printStackTrace();
                        //}

                    }
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

}

@Override
public void onNotificationRemoved(StatusBarNotification sbn) {

} 
}
<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />
<uses-permission android:name="android.service.notification.NotificationListenerService" />
<uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" />



<service
        android:name=".NotificationService "
        android:label="@string/app_name"
        android:enabled="true"
        android:exported="true"
        android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
        <intent-filter>
            <action
                android:name="android.service.notification.NotificationListenerService" />
        </intent-filter>
    </service>
 类似资料:
  • 本文向大家介绍Mapper 接口的工作原理是什么?Mapper 接口里的方法,参数不同时,方法能重载吗?相关面试题,主要包含被问及Mapper 接口的工作原理是什么?Mapper 接口里的方法,参数不同时,方法能重载吗?时的应答技巧和注意事项,需要的朋友参考一下 Dao 接口即 Mapper 接口。接口的全限名,就是映射文件中的 namespace 的值;接口的方法名,就是映射文件中 Mapper

  • SVG_Essentials SVG & XML SVG中的一些DOM接口 在使用脚本操作SVG时,有时候希望能计算一些没有被直接定义的几何属性。比如不管文字怎么变化,都能画一个更好匹配文字区域的矩形。 1. SVG Element(SVG命名空间中的任何元素) 方法或属性 说明 .ownerSVGElement() 返回最近的祖先SVG元素,如果是在顶级SVG调用,则返回null .viewpo

  • B类: 如何影响这个界面?

  • 最近我正在学习Java8个特性,所以我从lambda表达式开始,然后我遇到了Java流API,现在我正在尝试围绕流API中的方法,它们是如何工作的? 我对lambda表达式的理解是,如果我们想将lambda表达式传递给该方法,那么我们需要使用单个未实现的方法(Java 8接口可以有默认实现)创建一个与lambda表达式的签名匹配的接口。然后,传递lambda表达式的方法可以通过调用接口方法来执行l

  • 我在读有效的Java课本。第一项是关于使用静态工厂方法而不是公共构造函数。我的疑问是,如果我正在指定我如何在中指定静态工厂方法?因为Java不支持内部的静态方法。教材指定了如何创建包含公共静态工厂方法的不可实例化类。但是这些方法如何访问实现类的私有构造函数呢? 教材中说,如果要定义,请创建一个不可实例化的类,并在该类中包含静态工厂方法。但是类中定义的方法如何访问具体实现的私有构造函数 编辑:-以下

  • 请帮助我了解什么是好的设计在这里,详细。