使用AIDL挂断电话

Android 手机来电 获取来电信息,接听/挂断电话 之前看了许多博客,结果发现,很多都是1几年的文章,很多方法都已经被废弃了,或者不适配高版本的android系统,于是去查了查开发者和stack overflow,emmmm,目前这个方法可行。说实话,现在手机系统的来电展示不错了,所以这种App需要足够做的花哨好用才行,但是这又涉及用户的敏感权限和应用市场的卡脖子。监听用户手机来电,弹起App内自定义的来电展示,并且展示来电电话,用户可以接通和挂断。小于Android9时,利用反射的原理来调用方法,因为Api接口不公开了,调用不了。第三个:接听和挂断电话。 阅读详情

AIDL是Android接口描述语言。

最早的Android中提供了自动挂断电话的功能,但是随着版本的升高这些功能已经被

隐藏起来了,所以要想完成挂断电话的功能,则要依靠AIDL技术完成。



 

在main.xml中:

 

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

  xmlns:android="http://schemas.android.com/apk/res/android"

  android:orientation="vertical"

  android:layout_width="fill_parent"

  android:layout_height="fill_parent"

  android:gravity="center_horizontal"

  android:background="#00ff33">

  <EditText

     android:id="@+id/phonenumber"

     android:layout_margin="8dp"

     android:layout_width="fill_parent"

     android:layout_height="wrap_content"/>

  <LinearLayout

      android:layout_width="wrap_content"

      android:layout_height="wrap_content"

      android:orientation="horizontal">

     <Button

       android:id="@+id/setnumber"

       android:layout_width="100dp"

       android:layout_height="40dp"

       android:textColor="#ffffff"

       android:background="#3399ff"

       android:text="设置黑名单"/>

     <Button

       android:id="@+id/cancelnumber"

       android:layout_marginLeft="20dp"

       android:layout_width="100dp"

       android:layout_height="40dp"

       android:textColor="#ffffff"

       android:background="#3399ff"

       android:text="取消黑名单"/>

  </LinearLayout>

</LinearLayout>

 

 

 

在src下新建包:com.android.internal.telephony,(包名不能改)

并新建文件ITelephony.aidl

 

在ITelephony.aidl中:

 

package com.android.internal.telephony ;

interface ITelephony {

  boolean endCall() ;  // 挂断电话

  void answerRingingCall() ;  // 拨打电话

}

 

 

 

 

 

在IService.java中:

 

package com.li.phone;

 

public interface IService {

 

}

 

 

 

 

 

在PhoneBroadcastReceiver.java中:

 

package com.li.phone;

 

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

 

public class PhoneBroadcastReceiver extends BroadcastReceiver {

 

  @Override

  public void onReceive(Context context, Intent intent) {

     if (Intent.ACTION_NEW_OUTGOING_CALL.equals(intent.getAction())) { // 去电

       String outgoingNumber = intent

            .getStringExtra(Intent.EXTRA_PHONE_NUMBER); // 去电号码

       Intent pit = new Intent(context, PhoneService.class);

       pit.putExtra("outgoingNumber", outgoingNumber);

       context.startService(pit);

     } else { // 来电

       context.startService(new Intent(context, PhoneService.class));

     }

  }

 

}

 

 

 

 

在PhoneService.java中:

 

package com.li.phone;

 

import java.lang.reflect.Method;

 

import android.app.Service;

import android.content.Context;

import android.content.Intent;

import android.media.AudioManager;

import android.os.Binder;

import android.os.IBinder;

import android.os.RemoteException;

import android.telephony.PhoneStateListener;

import android.telephony.TelephonyManager;

 

import com.android.internal.telephony.ITelephony;

 

public class PhoneService extends Service {

  private TelephonyManager telephony = null;

  private AudioManager audio = null; // 声音服务

  private String phoneNumber = null; // 要过滤的电话

  private IBinder myBinder = new BinderImpl();

 

  class BinderImpl extends Binder implements IService {

 

     @Override

     public String getInterfaceDescriptor() {

       return "黑名单号码" + PhoneService.this.phoneNumber + "设置成功!";

     }

 

  }

 

  @Override

  public IBinder onBind(Intent intent) {

     this.phoneNumber = intent.getStringExtra("phonenumber"); // 取得电话号码

     this.audio = (AudioManager) super

         .getSystemService(Context.AUDIO_SERVICE); // 声音服务

     this.telephony = (TelephonyManager) super

         .getSystemService(Context.TELEPHONY_SERVICE);

     this.telephony.listen(new PhoneStateListenerImpl(),

         PhoneStateListener.LISTEN_CALL_STATE); // 设置监听操作

     return this.myBinder;

  }

 

  private class PhoneStateListenerImpl extends PhoneStateListener {

 

     @Override

     public void onCallStateChanged(int state, String incomingNumber) {

       switch (state) {

       case TelephonyManager.CALL_STATE_IDLE: // 挂断电话

         PhoneService.this.audio

              .setRingerMode(AudioManager.RINGER_MODE_NORMAL); // 正常音

         break;

       case TelephonyManager.CALL_STATE_RINGING: // 领音响起

         if (incomingNumber.equals(PhoneService.this.phoneNumber)) { // 电话号码匹配

            ITelephony iTelephony = getITelephony() ;

            if (iTelephony != null) {

              try {

                iTelephony.endCall() ; // 挂断电话

              } catch (RemoteException e) {

                e.printStackTrace();

              }

            }

         }

         break;

       case TelephonyManager.CALL_STATE_OFFHOOK: // 接听电话

         break;

       }

     }

  }

 

  private ITelephony getITelephony() {

     ITelephony iTelephony = null ;

     Class<TelephonyManager> cls = TelephonyManager.class ;

     Method getITelephonyMethod = null ;

     try {

       getITelephonyMethod = cls.getDeclaredMethod("getITelephony") ;

       getITelephonyMethod.setAccessible(true) ; // 取消封装

     } catch (Exception e) {

     }

     try {

       iTelephony = (ITelephony) getITelephonyMethod

            .invoke(this.telephony);

       return iTelephony ;

     } catch (Exception e) {

     }

     return iTelephony ;

  }

}

 

 

 

 

在MyPhoneDemo.java中:

 

package com.li.phone;

 

 

import com.li.phone.PhoneService.BinderImpl;

 

import android.app.Activity;

import android.content.ComponentName;

import android.content.Context;

import android.content.Intent;

import android.content.ServiceConnection;

import android.os.Bundle;

import android.os.IBinder;

import android.os.RemoteException;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;

 

public class MyPhoneDemo extends Activity {

  private EditText phoneNumber = null ;

  private Button setNumber = null ;

  private Button cancelNumber = null ;

  private IService service = null ;

  private ServiceConnectionImpl serviceConnection = new ServiceConnectionImpl() ;

  @Override

  public void onCreate(Bundle savedInstanceState) {

     super.onCreate(savedInstanceState);

     super.setContentView(R.layout.main);

     this.phoneNumber = (EditText) super.findViewById(R.id.phonenumber) ;

     this.setNumber = (Button) super.findViewById(R.id.setnumber) ;

     this.cancelNumber = (Button) super.findViewById(R.id.cancelnumber) ;

     this.setNumber.setOnClickListener(new SetOnClickListenerImpl()) ;

     this.cancelNumber.setOnClickListener(new CancelOnClickListenerImpl()) ;

  }

 

  private class SetOnClickListenerImpl implements OnClickListener {

     public void onClick(View v) {

       Intent intent = new Intent(MyPhoneDemo.this,PhoneService.class) ;

       intent.putExtra("phonenumber", MyPhoneDemo.this.phoneNumber

            .getText().toString());

       MyPhoneDemo.this.bindService(intent,

            MyPhoneDemo.this.serviceConnection,

            Context.BIND_AUTO_CREATE);

      

     }

  }

  private class CancelOnClickListenerImpl implements OnClickListener {

     public void onClick(View v) {

       if(MyPhoneDemo.this.service != null) {

         MyPhoneDemo.this.unbindService(MyPhoneDemo.this.serviceConnection) ;

         MyPhoneDemo.this.stopService(new Intent(MyPhoneDemo.this,PhoneService.class)) ;

         Toast.makeText(MyPhoneDemo.this, "黑名单已取消", Toast.LENGTH_LONG)

              .show();

         MyPhoneDemo.this.service = null ;

       }

     }

  }

  private class ServiceConnectionImpl implements ServiceConnection {

     public void onServiceConnected(ComponentName name, IBinder service) {

       MyPhoneDemo.this.service = (BinderImpl) service ;

       try {

          Toast.makeText(MyPhoneDemo.this, service.getInterfaceDescriptor(), Toast.LENGTH_LONG).show() ;

       } catch (RemoteException e) {

       }

     }

 

     public void onServiceDisconnected(ComponentName name) {

      

     }

    

  }

}

 

 

 

 

修改AndroidManifest.xml:

 

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.li.phone"

    android:versionCode="1"

    android:versionName="1.0" >

 

    <uses-sdk

        android:minSdkVersion="8"

        android:targetSdkVersion="15" />

         <uses-permission android:name="android.permission.READ_PHONE_STATE" />

       <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />

       <uses-permission android:name="android.permission.RECORD_AUDIO" />

       <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

       <uses-permission android:name="android.permission.SEND_SMS"></uses-permission>

       <uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>

    <application

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        <activity

            android:name=".MyPhoneDemo"

            android:label="@string/title_activity_my_phone_demo" >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

 

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

        <service android:name=".PhoneService" />

     <receiver android:name=".PhoneBroadcastReceiver">

       <intent-filter>

         <action android:name="android.intent.action.NEW_OUTGOING_CALL" />

         <action android:name="android.intent.action.BOOT_COMPLETED" />

         <action android:name="android.intent.action.PHONE_STATE" />

       </intent-filter>

     </receiver>

    </application>

 

</manifest>

 

 

Android 来电自动接听 Android 来电自动接听、挂断。 今天闲来无事,刚好一个朋友需要做一个来电自动接听的功能,我一想,咦,这尼玛我还没做过,好吧,去看看!好吧,看就看吧那么我提来了,我该从哪儿入手呢? 阅读详情

相关推荐

Android--通过AIDL+反射,调用android内部隐藏的服务实现挂断电话

简介: - 1.AIDL(Android Interface Definition Language) 是Android四大组件中Service下实现应用程序进程之间通信的方式之一; - 2.调用系统服务挂电话步骤:步骤一:准备aidl文件—-1.在你Android工程下面的src目录下新建一个包,包名有要求,要写成com.android.internal.telephony;—-2.在上面

Rose 3083

调用ITelephony的endCall( )方法自动挂断电话

各种来电防火墙之类的功能都可以过滤掉黑名单中的来电, 原理是响铃是判断来电号码是否存在于黑名单中, 如果存在则将其挂断. 而一些软件可以选择被挂断的家伙听到的提示音是"正在通话中"还是"欠费停机"之类

180斤的专栏 6986

Android 四大组件之 Service_4_挂断电话(AIDL)

App 可以通过调用当前系统的接口, 进行挂断电话,但是需要对应的权限。 根据SDK 版本有不同的方式。 方式1:android skd < 28 , 使用反射调用 Telephony.endCall 参考:https://stackoverflow.com/questions/24580508/how-to-import-com-android-internal-telephony-itelephony-to-the-android-application (1) 创建一个和系统ITel..

whjk20的专栏 635

Android通过AIDL实现接听电话、挂断电话操作 | 拨打电话

开发中需求永远都是在不断的超越预期而且也越来越变态,但是呢你做为一个开发还是要想尽办法去实现的。 Android中拨打电话功能是很轻松的只需要几行代码即可,如下: 首先还是得加上权限这个东西(或者动态申请) &lt;!--拨打电话--&gt; &lt;uses-permission android:name="android.permission.CALL_PHONE" /&gt; &l...

上辈子作恶多端,这辈子写前端。 6239

Android AIDL及挂断电话功能实践指南

AIDL(Android Interface Definition Language)是Android平台上用于进程间通信(IPC)的一种接口定义语言。它允许一个Android应用程序与其他应用程序或者系统服务进行数据交换。AIDL定义了一套跨进程通信的接口规范,使得服务端和客户端之间能够进行方法调用。AIDL文件定义了接口的名称、方法和参数。这些接口定义了服务端需要提供给客户端的API。每个方法都需要指明输入和输出参数。

weixin_32673065的博客 325

ESP32+HC-SR04超声波测距:5分钟搞定智能避障小车核心功能(附完整代码)

本文详细介绍了如何使用ESP32开发板和HC-SR04超声波测距模块快速构建智能避障小车的核心功能。通过优化的接线方案、核心代码实现及调试技巧,帮助开发者5分钟内完成硬件连接与软件编程,实现高效的避障功能。附完整代码,适合创客教育和机器人开发。

weixin_29185199的博客 384

AIDL自动挂断电话

该业务是属于跨进程的数据获取 所需权限 1、建一个新的包,包名为 com.android.internal.telephony 在该包内创建一个接口类 (官方已经定死的,名为代理接口) interface ITelephony{ boolean endCall(); void answerRingingCall()

ADS李的博客 384

PyTorch实战:A2C算法在Pendulum环境中的调参技巧与收敛优化

本文详细介绍了使用PyTorch实现A2C算法在Pendulum环境中的调参技巧与收敛优化方法。通过分析Pendulum环境特性、设计高效的网络架构、优化超参数设置以及提升训练稳定性,帮助开发者掌握强化学习中的policy-based方法。文章特别强调了奖励工程、优势估计改进和梯度裁剪等关键优化策略,为连续控制任务提供了实用解决方案。

rum55的博客 213

Android的AIDL以及挂断电话

Android的AIDL是什么呢,AIDL就是Android Interface Defination Language,其实说白了,它就是Android定义好的,进程间通信的一种机制而已, 有点像那个调用Service里面的方法。 好,我们下面就通过代码来说明 首先,我们先写一个接口 com.xiaobin.service.IService package com.xiaobin.

Miracle的专栏 4764

GIS小白也能看懂的实战:5步教你将ArcGIS里的等高线和水系完美导入CAD做规划图

本文详细介绍了如何将ArcGIS中的等高线和水系数据高效导入CAD,制作专业规划底图的5个关键步骤。从数据准备、ArcGIS处理到CAD优化,涵盖坐标系设置、数据裁剪、格式转换等实用技巧,特别适合设计规划领域的新手快速掌握GIS与CAD协同工作流程。

weixin_27966471的博客 425

【OpenClaw从入门到精通】命令行操作指南——TUI模式高效管理OpenClaw(2026避坑版)

本文将详细介绍OpenClaw的命令行操作,重点介绍TUI(Text User Interface)模式的高效使用方法,以及在实际使用中需要避免的常见陷阱。通过本文的学习,你将掌握OpenClaw命令行的精髓,提升工作效率。

一键难忘的博客 1691

通过aidl实现挂断电话

如何实现挂断电话?在安卓1.5版本以前,TelephonyManager 类有一个endCall方法可以直接调用就可以实现挂断电话的功能了,不过在这之后出于安全考虑,这个方法被阉割了。那么在1.5之后要如果要实现自动挂断电话,就必须通过aidl来实现,其实1.5之前endCall方法也是通过这样实现的。在TelephoneManager的源代码中有一个方法如下:private ITelephony

sutao1994 820

AI大模型:(三)3.2 Spring AI实现Agent

SpringAI实现了流式对话功能,通过与Ollama模型集成完成前后端交互,当前版本存在thinking信息丢失问题。系统支持两种工具注册方式(方法注解和函数式),并内置时间工具类展示外部工具调用能力。记忆功能提供多种存储方案(内存、JDBC、NoSQL等),实现跨对话轮次的上下文保持。MCP协议集成方面,服务端实现计算和业务查询工具,客户端支持12306及自定义业务系统接入。完整演示了流式对话、工具调用与记忆功能的综合应用。该实践构建了具备复杂交互能力的AI系统,同时指出生产环境需关注的安全与优化问题。

haylee的专栏 1007

采用aidl技术实现电话的挂断

采用aidl技术实现电话的挂断 在AndroidSDK升级到1.5以后,AndroidSDK把挂断电话的操作endcall()给隐藏起来了. endcall()存在在系统的电话服务里.可以采用aidl为技术调用该服务.    public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInsta

李云飞的专栏 442

YOLO11涨点优化:Loss魔改 | WIoU (Wise-IoU) v3版本全面替换,基于动态非单调聚焦机制,让模型更聪明地学习

YOLOv11目标检测中的WIoU v3损失函数改进 本文探讨了YOLOv11目标检测模型中CIoU损失函数的局限性,并提出了WIoU v3改进方案。关键发现包括: CIoU的缺陷:在低质量样本(小目标/遮挡目标)上过度惩罚,导致模型优化方向偏离,小目标AP往往比大目标低30%左右。 WIoU v3的创新: 动态非单调聚焦机制:根据样本"离群度"智能分配梯度 让模型重点优化中等质量样本,减少对低质量样本的无效关注 采用指数移动平均来自适应调整质量评判标准 实际效果:WIoU v3在保持大

2601_95807009的博客 422

智慧加油站小程序数据库设计文档

【代码】智慧加油站小程序数据库设计文档。

低代码布道师的博客 1402

android > AIDL 以及挂断电话

  android &gt; AIDL 以及挂断电话   aaaaaaaaaaaaaaaa

mft8899的博客 163

YOLOv13改进策略【Head】| 引入RT-DETR中的RTDETRDecoder,替换检测头

本文记录的是基于RTDETRDecoder模块的YOLOv13目标检测改进方法研究。RT-DETR的模块通过,能为解码器提供高质量的初始,从而。相比v13原始的检测头,RT-DETR能,替换后能够更好的提高模型性能。

Limiiiing的博客 433

Android-使用AIDL挂断电话

1.AIDL简单操作 package org.zrf.demo;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import android.app.Service;import android.content.Context;import android....

weixin_30768175的博客 143

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

通过AIDL及反射机制,使用隐藏API挂断电话

原帖地址:http://120.132.134.205/cmdn/bbs/viewthread.php?tid=17136 最近看论坛上有人问如何挂断电话,实际上1.1版本后.Google已经把该API隐藏掉 今天看资料,发现可以通过AIDL(Android远程方法)及反射,

码农 909

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

android使用AIDL挂断电话

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程 android没有相关API挂断电话,而是使用AIDL,使用ITelephony的endCall() 首先项目中引入ITelephony.aidl,注意报名需要跟文件定义的一致 /* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "Li

huangbaokang的博客 635

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

AIDL实现挂断电话

publicclass InCallReceiver extends BroadcastReceiver {private TelephonyManager manager = null; @Overridepublicvoid onReceive(Context context, Intent intent) {manager = (TelephonyManager) context.get

yq__yq的博客 434

Android(AIDL)自动重复拨号及挂断/接听电话

  Android默认没有提供挂断/接听电话的api,需要伪装com/android/internal/telephony/ITelephony.aidl的接口来欺骗系统。而自动重复拨号可以通过(BroadcastReceiver)监听电话状态(android.intent.action.PHONE_STATE)来实现。   &lt;strong&gt;1、Android挂断和接听电话的接口...

1846396994 601
上一篇: 监听来电情况(静音)
下一篇: 方位传感器(重力小球)
Android人生
博客等级 码龄14年 14粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值